From cd2bd57e5addc1e30e54174e48c2c51b423cc11b Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Thu, 10 Jul 2025 10:22:41 -0600 Subject: [PATCH 01/25] ci: Add build check for React todo example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .github/workflows/pr.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 9440df60c..2294e32b1 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -57,3 +57,15 @@ jobs: repo-token: "${{ secrets.GITHUB_TOKEN }}" pattern: "./packages/react-db/dist/**/*.{js,mjs}" comment-key: "react-db-package-size" + build-example: + name: Build Example Site + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4.2.2 + - name: Setup Tools + uses: tanstack/config/.github/setup@main + - name: Build Example Site + run: | + cd examples/react/todo + pnpm build From 37645d27b379b0e3e3b88511686987f20118dc5c Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Thu, 10 Jul 2025 16:10:26 -0600 Subject: [PATCH 02/25] Refactor example app to use TanStack Start and separate routes / collection type --- examples/react/todo/app.config.ts | 3 + examples/react/todo/package.json | 10 +- examples/react/todo/src/App.tsx | 2 +- .../react/todo/src/components/TodoApp.tsx | 281 ++ examples/react/todo/src/lib/api.ts | 106 + examples/react/todo/src/lib/collections.ts | 172 + examples/react/todo/src/main.tsx | 7 +- examples/react/todo/src/routeTree.gen.ts | 222 + examples/react/todo/src/router.tsx | 24 + examples/react/todo/src/routes/__root.tsx | 51 + .../react/todo/src/routes/api/config.$id.ts | 116 + examples/react/todo/src/routes/api/config.ts | 64 + .../react/todo/src/routes/api/todos.$id.ts | 116 + examples/react/todo/src/routes/api/todos.ts | 67 + examples/react/todo/src/routes/electric.tsx | 43 + examples/react/todo/src/routes/index.tsx | 46 + examples/react/todo/src/routes/query.tsx | 40 + examples/react/todo/src/styles.css | 16 + examples/react/todo/tsconfig.json | 3 +- examples/react/todo/vite.config.ts | 16 +- pnpm-lock.yaml | 4151 ++++++++++++++++- 21 files changed, 5450 insertions(+), 106 deletions(-) create mode 100644 examples/react/todo/app.config.ts create mode 100644 examples/react/todo/src/components/TodoApp.tsx create mode 100644 examples/react/todo/src/lib/api.ts create mode 100644 examples/react/todo/src/lib/collections.ts create mode 100644 examples/react/todo/src/routeTree.gen.ts create mode 100644 examples/react/todo/src/router.tsx create mode 100644 examples/react/todo/src/routes/__root.tsx create mode 100644 examples/react/todo/src/routes/api/config.$id.ts create mode 100644 examples/react/todo/src/routes/api/config.ts create mode 100644 examples/react/todo/src/routes/api/todos.$id.ts create mode 100644 examples/react/todo/src/routes/api/todos.ts create mode 100644 examples/react/todo/src/routes/electric.tsx create mode 100644 examples/react/todo/src/routes/index.tsx create mode 100644 examples/react/todo/src/routes/query.tsx create mode 100644 examples/react/todo/src/styles.css diff --git a/examples/react/todo/app.config.ts b/examples/react/todo/app.config.ts new file mode 100644 index 000000000..94fd0245c --- /dev/null +++ b/examples/react/todo/app.config.ts @@ -0,0 +1,3 @@ +import { defineConfig } from "@tanstack/react-start/config" + +export default defineConfig({}) diff --git a/examples/react/todo/package.json b/examples/react/todo/package.json index c9779a411..3f5dbc372 100644 --- a/examples/react/todo/package.json +++ b/examples/react/todo/package.json @@ -6,6 +6,8 @@ "@tanstack/db-collections": "^0.0.23", "@tanstack/query-core": "^5.81.5", "@tanstack/react-db": "^0.0.19", + "@tanstack/react-router": "^1.125.6", + "@tanstack/react-start": "^1.126.1", "cors": "^2.8.5", "drizzle-orm": "^0.40.1", "drizzle-zod": "^0.7.0", @@ -13,7 +15,8 @@ "postgres": "^3.4.7", "react": "^19.1.0", "react-dom": "^19.1.0", - "tailwindcss": "^4.1.11" + "tailwindcss": "^4.1.11", + "vite-tsconfig-paths": "^5.1.4" }, "devDependencies": { "@eslint/js": "^9.22.0", @@ -39,13 +42,12 @@ "vite": "^6.2.2" }, "scripts": { - "api:dev": "tsx watch src/api/server.ts", - "build": "tsc -b && vite build", + "build": "vite build", "db:ensure-config": "tsx scripts/ensure-default-config.ts", "db:generate": "drizzle-kit generate", "db:push": "tsx scripts/migrate.ts", "db:studio": "drizzle-kit studio", - "dev": "docker compose up -d && concurrently \"pnpm api:dev\" \"vite\"", + "dev": "docker compose up -d && vite dev", "lint": "eslint . --fix", "preview": "vite preview" }, diff --git a/examples/react/todo/src/App.tsx b/examples/react/todo/src/App.tsx index 04ff3f3b1..f4453c7a2 100644 --- a/examples/react/todo/src/App.tsx +++ b/examples/react/todo/src/App.tsx @@ -12,7 +12,7 @@ import type { SelectConfig, SelectTodo } from "./db/validation" import type { FormEvent } from "react" // API helper for todos and config -const API_BASE_URL = `http://localhost:3001/api` +const API_BASE_URL = `/api` const api = { // Todo API methods diff --git a/examples/react/todo/src/components/TodoApp.tsx b/examples/react/todo/src/components/TodoApp.tsx new file mode 100644 index 000000000..b50ac3e1d --- /dev/null +++ b/examples/react/todo/src/components/TodoApp.tsx @@ -0,0 +1,281 @@ +import React, { useState } from "react" +import { Link } from "@tanstack/react-router" +import type { Collection } from "@tanstack/react-db" +import type { SelectConfig, SelectTodo } from "../db/validation" +import type { FormEvent } from "react" + +interface TodoAppProps { + todos: Array + configData: Array + todoCollection: Collection + configCollection: Collection + title: string +} + +export function TodoApp({ + todos, + configData, + todoCollection, + configCollection, + title, +}: TodoAppProps) { + const [newTodo, setNewTodo] = useState(``) + + // Define a type-safe helper function to get config values + const getConfigValue = (key: string): string => { + for (const config of configData) { + if (config.key === key) { + return config.value + } + } + return `` + } + + // Define a helper function to update config values + const setConfigValue = (key: string, value: string): void => { + for (const config of configData) { + if (config.key === key) { + configCollection.update(config.id, (draft) => { + draft.value = value + }) + return + } + } + + // If the config doesn't exist yet, create it + configCollection.insert({ + id: Math.round(Math.random() * 1000000), + key, + value, + created_at: new Date(), + updated_at: new Date(), + }) + } + + const backgroundColor = getConfigValue(`backgroundColor`) + + // Function to generate a complementary color + const getComplementaryColor = (hexColor: string): string => { + // Default to a nice blue if no color is provided + if (!hexColor) return `#3498db` + + // Remove the hash if it exists + const color = hexColor.replace(`#`, ``) + + // Convert hex to RGB + const r = parseInt(color.substr(0, 2), 16) + const g = parseInt(color.substr(2, 2), 16) + const b = parseInt(color.substr(4, 2), 16) + + // Calculate complementary color (inverting the RGB values) + const compR = 255 - r + const compG = 255 - g + const compB = 255 - b + + // Convert back to hex + const compHex = + `#` + + ((1 << 24) + (compR << 16) + (compG << 8) + compB).toString(16).slice(1) + + // Calculate brightness of the background + const brightness = r * 0.299 + g * 0.587 + b * 0.114 + + // If the complementary color doesn't have enough contrast, adjust it + const compBrightness = compR * 0.299 + compG * 0.587 + compB * 0.114 + const brightnessDiff = Math.abs(brightness - compBrightness) + + if (brightnessDiff < 128) { + // Not enough contrast, use a more vibrant alternative + if (brightness > 128) { + // Dark color for light background + return `#8e44ad` // Purple + } else { + // Light color for dark background + return `#f1c40f` // Yellow + } + } + + return compHex + } + + const titleColor = getComplementaryColor(backgroundColor) + + const handleColorChange = (e: React.ChangeEvent) => { + const newColor = e.target.value + setConfigValue(`backgroundColor`, newColor) + } + + const handleSubmit = (e: FormEvent) => { + e.preventDefault() + if (!newTodo.trim()) return + + todoCollection.insert({ + text: newTodo, + completed: false, + id: Math.round(Math.random() * 1000000), + created_at: new Date(), + updated_at: new Date(), + }) + setNewTodo(``) + } + + const activeTodos = todos.filter((todo) => !todo.completed) + const completedTodos = todos.filter((todo) => todo.completed) + + return ( +
+
+
+

+ {title} +

+ + {/* Navigation */} +
+ + ← Home + + + Query + + + Electric + +
+
+ +
+
+ + +
+
+ +
+
+ {todos.length > 0 && ( + + )} + setNewTodo(e.target.value)} + placeholder="What needs to be done?" + className="w-full py-4 pl-[60px] pr-4 text-2xl font-light border-none shadow-[inset_0_-2px_1px_rgba(0,0,0,0.03)] box-border" + style={{ + background: `rgba(0, 0, 0, 0.003)`, + }} + /> +
+ + {todos.length > 0 && ( + <> +
    + {todos.map((todo) => ( +
  • +
    + + todoCollection.update(todo.id, (draft) => { + draft.completed = !draft.completed + }) + } + className="absolute left-[12px] top-0 bottom-0 my-auto h-[40px] w-[40px] cursor-pointer" + /> + + +
    +
  • + ))} +
+ +
+ + {activeTodos.length} + {` `} + {activeTodos.length === 1 ? `item` : `items`} left + + {completedTodos.length > 0 && ( + + )} +
+ + )} +
+
+
+ ) +} diff --git a/examples/react/todo/src/lib/api.ts b/examples/react/todo/src/lib/api.ts new file mode 100644 index 000000000..c6e070b31 --- /dev/null +++ b/examples/react/todo/src/lib/api.ts @@ -0,0 +1,106 @@ +import type { SelectConfig, SelectTodo } from "../db/validation" + +// API helper for todos and config +const API_BASE_URL = `/api` + +export const api = { + // Todo API methods + todos: { + getAll: async (): Promise> => { + const response = await fetch(`${API_BASE_URL}/todos`) + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`) + return response.json() + }, + getById: async (id: number): Promise => { + const response = await fetch(`${API_BASE_URL}/todos/${id}`) + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`) + return response.json() + }, + create: async ( + todo: Partial + ): Promise<{ todo: SelectTodo; txid: number }> => { + const response = await fetch(`${API_BASE_URL}/todos`, { + method: `POST`, + headers: { "Content-Type": `application/json` }, + body: JSON.stringify(todo), + }) + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`) + return response.json() + }, + update: async ( + id: unknown, + changes: Partial + ): Promise<{ todo: SelectTodo; txid: number }> => { + const response = await fetch(`${API_BASE_URL}/todos/${id}`, { + method: `PUT`, + headers: { "Content-Type": `application/json` }, + body: JSON.stringify(changes), + }) + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`) + return response.json() + }, + delete: async ( + id: unknown + ): Promise<{ success: boolean; txid: number }> => { + const response = await fetch(`${API_BASE_URL}/todos/${id}`, { + method: `DELETE`, + }) + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`) + return response.json() + }, + }, + + // Config API methods + config: { + getAll: async (): Promise> => { + const response = await fetch(`${API_BASE_URL}/config`) + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`) + return response.json() + }, + getById: async (id: number): Promise => { + const response = await fetch(`${API_BASE_URL}/config/${id}`) + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`) + return response.json() + }, + create: async ( + config: Partial + ): Promise<{ config: SelectConfig; txid: number }> => { + const response = await fetch(`${API_BASE_URL}/config`, { + method: `POST`, + headers: { "Content-Type": `application/json` }, + body: JSON.stringify(config), + }) + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`) + return response.json() + }, + update: async ( + id: number, + changes: Partial + ): Promise<{ config: SelectConfig; txid: number }> => { + const response = await fetch(`${API_BASE_URL}/config/${id}`, { + method: `PUT`, + headers: { "Content-Type": `application/json` }, + body: JSON.stringify(changes), + }) + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`) + return response.json() + }, + delete: async (id: number): Promise<{ success: boolean; txid: number }> => { + const response = await fetch(`${API_BASE_URL}/config/${id}`, { + method: `DELETE`, + }) + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`) + return response.json() + }, + }, +} diff --git a/examples/react/todo/src/lib/collections.ts b/examples/react/todo/src/lib/collections.ts new file mode 100644 index 000000000..33ca94e07 --- /dev/null +++ b/examples/react/todo/src/lib/collections.ts @@ -0,0 +1,172 @@ +import { createCollection } from "@tanstack/react-db" +import { + electricCollectionOptions, + queryCollectionOptions, +} from "@tanstack/db-collections" +import { QueryClient } from "@tanstack/query-core" +import { selectConfigSchema, selectTodoSchema } from "../db/validation" +import { api } from "./api" + +// Create a query client for query collections +const queryClient = new QueryClient() + +// Electric Todo Collection +export const electricTodoCollection = createCollection( + electricCollectionOptions({ + id: `todos`, + shapeOptions: { + url: `http://localhost:3003/v1/shape`, + params: { + table: `todos`, + }, + parser: { + timestamptz: (date: string) => new Date(date), + }, + }, + getKey: (item) => item.id, + schema: selectTodoSchema, + onInsert: async ({ transaction }) => { + const { + id: _id, + created_at: _f, + updated_at: _ff, + ...modified + } = transaction.mutations[0].modified + const response = await api.todos.create(modified) + return { txid: response.txid } + }, + onUpdate: async ({ transaction }) => { + const txids = await Promise.all( + transaction.mutations.map(async (mutation) => { + const { original, changes } = mutation + const response = await api.todos.update(original.id, changes) + return response.txid + }) + ) + return { txid: txids } + }, + onDelete: async ({ transaction }) => { + const txids = await Promise.all( + transaction.mutations.map(async (mutation) => { + const { original } = mutation + const response = await api.todos.delete(original.id) + return response.txid + }) + ) + return { txid: txids } + }, + }) +) + +// Query Todo Collection +export const queryTodoCollection = createCollection( + queryCollectionOptions({ + id: `todos`, + queryKey: [`todos`], + refetchInterval: 3000, + queryFn: async () => { + const todos = await api.todos.getAll() + return todos.map((todo) => ({ + ...todo, + created_at: new Date(todo.created_at), + updated_at: new Date(todo.updated_at), + })) + }, + getKey: (item) => item.id, + schema: selectTodoSchema, + queryClient, + onInsert: async ({ transaction }) => { + const { + id: _id, + created_at: _crea, + updated_at: _up, + ...modified + } = transaction.mutations[0].modified + return await api.todos.create(modified) + }, + onUpdate: async ({ transaction }) => { + return await Promise.all( + transaction.mutations.map(async (mutation) => { + const { original, changes } = mutation + return await api.todos.update(original.id, changes) + }) + ) + }, + onDelete: async ({ transaction }) => { + return await Promise.all( + transaction.mutations.map(async (mutation) => { + const { original } = mutation + await api.todos.delete(original.id) + }) + ) + }, + }) +) + +// Electric Config Collection +export const electricConfigCollection = createCollection( + electricCollectionOptions({ + id: `config`, + shapeOptions: { + url: `http://localhost:3003/v1/shape`, + params: { + table: `config`, + }, + parser: { + timestamptz: (date: string) => new Date(date), + }, + }, + getKey: (item) => item.id, + schema: selectConfigSchema, + onInsert: async ({ transaction }) => { + const modified = transaction.mutations[0].modified + const response = await api.config.create(modified) + return { txid: response.txid } + }, + onUpdate: async ({ transaction }) => { + const txids = await Promise.all( + transaction.mutations.map(async (mutation) => { + const { original, changes } = mutation + const response = await api.config.update(original.id, changes) + return response.txid + }) + ) + return { txid: txids } + }, + }) +) + +// Query Config Collection +export const queryConfigCollection = createCollection( + queryCollectionOptions({ + id: `config`, + queryKey: [`config`], + refetchInterval: 3000, + queryFn: async () => { + const configs = await api.config.getAll() + return configs.map((config) => ({ + ...config, + created_at: new Date(config.created_at), + updated_at: new Date(config.updated_at), + })) + }, + getKey: (item) => item.id, + schema: selectConfigSchema, + queryClient, + onInsert: async ({ transaction }) => { + const modified = transaction.mutations[0].modified + const response = await api.config.create(modified) + return { txid: response.txid } + }, + onUpdate: async ({ transaction }) => { + const txids = await Promise.all( + transaction.mutations.map(async (mutation) => { + const { original, changes } = mutation + const response = await api.config.update(original.id, changes) + return response.txid + }) + ) + return { txid: txids } + }, + }) +) diff --git a/examples/react/todo/src/main.tsx b/examples/react/todo/src/main.tsx index a2d74309c..0fbcebd3c 100644 --- a/examples/react/todo/src/main.tsx +++ b/examples/react/todo/src/main.tsx @@ -1,10 +1,13 @@ import React from "react" import { createRoot } from "react-dom/client" +import { RouterProvider } from "@tanstack/react-router" +import { createRouter } from "./router" import "./index.css" -import App from "./App" + +const router = createRouter() createRoot(document.getElementById(`root`)!).render( - + ) diff --git a/examples/react/todo/src/routeTree.gen.ts b/examples/react/todo/src/routeTree.gen.ts new file mode 100644 index 000000000..b6fe9aed3 --- /dev/null +++ b/examples/react/todo/src/routeTree.gen.ts @@ -0,0 +1,222 @@ +/* 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 QueryRouteImport } from './routes/query' +import { Route as ElectricRouteImport } from './routes/electric' +import { Route as IndexRouteImport } from './routes/index' +import { ServerRoute as ApiTodosServerRouteImport } from './routes/api/todos' +import { ServerRoute as ApiConfigServerRouteImport } from './routes/api/config' +import { ServerRoute as ApiTodosIdServerRouteImport } from './routes/api/todos.$id' +import { ServerRoute as ApiConfigIdServerRouteImport } from './routes/api/config.$id' + +const rootServerRouteImport = createServerRootRoute() + +const QueryRoute = QueryRouteImport.update({ + id: '/query', + path: '/query', + getParentRoute: () => rootRouteImport, +} as any) +const ElectricRoute = ElectricRouteImport.update({ + id: '/electric', + path: '/electric', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) +const ApiTodosServerRoute = ApiTodosServerRouteImport.update({ + id: '/api/todos', + path: '/api/todos', + getParentRoute: () => rootServerRouteImport, +} as any) +const ApiConfigServerRoute = ApiConfigServerRouteImport.update({ + id: '/api/config', + path: '/api/config', + getParentRoute: () => rootServerRouteImport, +} as any) +const ApiTodosIdServerRoute = ApiTodosIdServerRouteImport.update({ + id: '/$id', + path: '/$id', + getParentRoute: () => ApiTodosServerRoute, +} as any) +const ApiConfigIdServerRoute = ApiConfigIdServerRouteImport.update({ + id: '/$id', + path: '/$id', + getParentRoute: () => ApiConfigServerRoute, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/electric': typeof ElectricRoute + '/query': typeof QueryRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/electric': typeof ElectricRoute + '/query': typeof QueryRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/electric': typeof ElectricRoute + '/query': typeof QueryRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/electric' | '/query' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/electric' | '/query' + id: '__root__' | '/' | '/electric' | '/query' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + ElectricRoute: typeof ElectricRoute + QueryRoute: typeof QueryRoute +} +export interface FileServerRoutesByFullPath { + '/api/config': typeof ApiConfigServerRouteWithChildren + '/api/todos': typeof ApiTodosServerRouteWithChildren + '/api/config/$id': typeof ApiConfigIdServerRoute + '/api/todos/$id': typeof ApiTodosIdServerRoute +} +export interface FileServerRoutesByTo { + '/api/config': typeof ApiConfigServerRouteWithChildren + '/api/todos': typeof ApiTodosServerRouteWithChildren + '/api/config/$id': typeof ApiConfigIdServerRoute + '/api/todos/$id': typeof ApiTodosIdServerRoute +} +export interface FileServerRoutesById { + __root__: typeof rootServerRouteImport + '/api/config': typeof ApiConfigServerRouteWithChildren + '/api/todos': typeof ApiTodosServerRouteWithChildren + '/api/config/$id': typeof ApiConfigIdServerRoute + '/api/todos/$id': typeof ApiTodosIdServerRoute +} +export interface FileServerRouteTypes { + fileServerRoutesByFullPath: FileServerRoutesByFullPath + fullPaths: '/api/config' | '/api/todos' | '/api/config/$id' | '/api/todos/$id' + fileServerRoutesByTo: FileServerRoutesByTo + to: '/api/config' | '/api/todos' | '/api/config/$id' | '/api/todos/$id' + id: + | '__root__' + | '/api/config' + | '/api/todos' + | '/api/config/$id' + | '/api/todos/$id' + fileServerRoutesById: FileServerRoutesById +} +export interface RootServerRouteChildren { + ApiConfigServerRoute: typeof ApiConfigServerRouteWithChildren + ApiTodosServerRoute: typeof ApiTodosServerRouteWithChildren +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/query': { + id: '/query' + path: '/query' + fullPath: '/query' + preLoaderRoute: typeof QueryRouteImport + parentRoute: typeof rootRouteImport + } + '/electric': { + id: '/electric' + path: '/electric' + fullPath: '/electric' + preLoaderRoute: typeof ElectricRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} +declare module '@tanstack/react-start/server' { + interface ServerFileRoutesByPath { + '/api/todos': { + id: '/api/todos' + path: '/api/todos' + fullPath: '/api/todos' + preLoaderRoute: typeof ApiTodosServerRouteImport + parentRoute: typeof rootServerRouteImport + } + '/api/config': { + id: '/api/config' + path: '/api/config' + fullPath: '/api/config' + preLoaderRoute: typeof ApiConfigServerRouteImport + parentRoute: typeof rootServerRouteImport + } + '/api/todos/$id': { + id: '/api/todos/$id' + path: '/$id' + fullPath: '/api/todos/$id' + preLoaderRoute: typeof ApiTodosIdServerRouteImport + parentRoute: typeof ApiTodosServerRoute + } + '/api/config/$id': { + id: '/api/config/$id' + path: '/$id' + fullPath: '/api/config/$id' + preLoaderRoute: typeof ApiConfigIdServerRouteImport + parentRoute: typeof ApiConfigServerRoute + } + } +} + +interface ApiConfigServerRouteChildren { + ApiConfigIdServerRoute: typeof ApiConfigIdServerRoute +} + +const ApiConfigServerRouteChildren: ApiConfigServerRouteChildren = { + ApiConfigIdServerRoute: ApiConfigIdServerRoute, +} + +const ApiConfigServerRouteWithChildren = ApiConfigServerRoute._addFileChildren( + ApiConfigServerRouteChildren, +) + +interface ApiTodosServerRouteChildren { + ApiTodosIdServerRoute: typeof ApiTodosIdServerRoute +} + +const ApiTodosServerRouteChildren: ApiTodosServerRouteChildren = { + ApiTodosIdServerRoute: ApiTodosIdServerRoute, +} + +const ApiTodosServerRouteWithChildren = ApiTodosServerRoute._addFileChildren( + ApiTodosServerRouteChildren, +) + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + ElectricRoute: ElectricRoute, + QueryRoute: QueryRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() +const rootServerRouteChildren: RootServerRouteChildren = { + ApiConfigServerRoute: ApiConfigServerRouteWithChildren, + ApiTodosServerRoute: ApiTodosServerRouteWithChildren, +} +export const serverRouteTree = rootServerRouteImport + ._addFileChildren(rootServerRouteChildren) + ._addFileTypes() diff --git a/examples/react/todo/src/router.tsx b/examples/react/todo/src/router.tsx new file mode 100644 index 000000000..a32f135f4 --- /dev/null +++ b/examples/react/todo/src/router.tsx @@ -0,0 +1,24 @@ +import { createRouter as createTanstackRouter } from "@tanstack/react-router" + +// Import the generated route tree +import { routeTree } from "./routeTree.gen" + +import "./styles.css" + +// Create a new router instance +export const createRouter = () => { + const router = createTanstackRouter({ + routeTree, + scrollRestoration: true, + defaultPreloadStaleTime: 0, + }) + + return router +} + +// Register the router instance for type safety +declare module "@tanstack/react-router" { + interface Register { + router: ReturnType + } +} diff --git a/examples/react/todo/src/routes/__root.tsx b/examples/react/todo/src/routes/__root.tsx new file mode 100644 index 000000000..be04b1d17 --- /dev/null +++ b/examples/react/todo/src/routes/__root.tsx @@ -0,0 +1,51 @@ +import { + HeadContent, + Outlet, + Scripts, + createRootRoute, +} from "@tanstack/react-router" + +import appCss from "../styles.css?url" + +export const Route = createRootRoute({ + head: () => ({ + meta: [ + { + charSet: `utf-8`, + }, + { + name: `viewport`, + content: `width=device-width, initial-scale=1`, + }, + { + title: `TanStack Start/DB/Electric Starter`, + }, + ], + links: [ + { + rel: `stylesheet`, + href: appCss, + }, + ], + }), + + component: () => ( + + + + ), +}) + +function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + + {children} + + + + ) +} diff --git a/examples/react/todo/src/routes/api/config.$id.ts b/examples/react/todo/src/routes/api/config.$id.ts new file mode 100644 index 000000000..9167d583f --- /dev/null +++ b/examples/react/todo/src/routes/api/config.$id.ts @@ -0,0 +1,116 @@ +import { createServerFileRoute } from "@tanstack/react-start/server" +import { json } from "@tanstack/react-start" +import { sql } from "../../db/postgres" +import { validateUpdateConfig } from "../../db/validation" +import type { Txid } from "@tanstack/db-collections" + +// Generate a transaction ID +async function generateTxId(tx: any): Promise { + const result = await tx`SELECT pg_current_xact_id()::xid::text as txid` + const txid = result[0]?.txid + + if (txid === undefined) { + throw new Error(`Failed to get transaction ID`) + } + + return parseInt(txid, 10) +} + +export const ServerRoute = createServerFileRoute(`/api/config/$id`).methods({ + GET: async ({ params }) => { + try { + const { id } = params + const [config] = await sql`SELECT * FROM config WHERE id = ${id}` + + if (!config) { + return json({ error: `Config not found` }, { status: 404 }) + } + + return json(config) + } catch (error) { + console.error(`Error fetching config:`, error) + return json( + { + error: `Failed to fetch config`, + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + }, + PUT: async ({ params, request }) => { + try { + const { id } = params + const body = await request.json() + const configData = validateUpdateConfig(body) + + let txid!: Txid + const updatedConfig = await sql.begin(async (tx) => { + txid = await generateTxId(tx) + + const [result] = await tx` + UPDATE config + SET ${tx(configData)} + WHERE id = ${id} + RETURNING * + ` + + if (!result) { + throw new Error(`Config not found`) + } + + return result + }) + + return json({ config: updatedConfig, txid }) + } catch (error) { + if (error instanceof Error && error.message === `Config not found`) { + return json({ error: `Config not found` }, { status: 404 }) + } + + console.error(`Error updating config:`, error) + return json( + { + error: `Failed to update config`, + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + }, + DELETE: async ({ params }) => { + try { + const { id } = params + + let txid!: Txid + await sql.begin(async (tx) => { + txid = await generateTxId(tx) + + const [result] = await tx` + DELETE FROM config + WHERE id = ${id} + RETURNING id + ` + + if (!result) { + throw new Error(`Config not found`) + } + }) + + return json({ success: true, txid }) + } catch (error) { + if (error instanceof Error && error.message === `Config not found`) { + return json({ error: `Config not found` }, { status: 404 }) + } + + console.error(`Error deleting config:`, error) + return json( + { + error: `Failed to delete config`, + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + }, +}) diff --git a/examples/react/todo/src/routes/api/config.ts b/examples/react/todo/src/routes/api/config.ts new file mode 100644 index 000000000..c1ca0dc03 --- /dev/null +++ b/examples/react/todo/src/routes/api/config.ts @@ -0,0 +1,64 @@ +import { createServerFileRoute } from "@tanstack/react-start/server" +import { json } from "@tanstack/react-start" +import { sql } from "../../db/postgres" +import { validateInsertConfig } from "../../db/validation" +import type { Txid } from "@tanstack/db-collections" + +// Generate a transaction ID +async function generateTxId(tx: any): Promise { + const result = await tx`SELECT pg_current_xact_id()::xid::text as txid` + const txid = result[0]?.txid + + if (txid === undefined) { + throw new Error(`Failed to get transaction ID`) + } + + return parseInt(txid, 10) +} + +export const ServerRoute = createServerFileRoute(`/api/config`).methods({ + GET: async ({ request: _request }) => { + try { + const config = await sql`SELECT * FROM config` + return json(config) + } catch (error) { + console.error(`Error fetching config:`, error) + return json( + { + error: `Failed to fetch config`, + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + }, + POST: async ({ request }) => { + try { + const body = await request.json() + console.log(`POST /api/config`, body) + const configData = validateInsertConfig(body) + + let txid!: Txid + const newConfig = await sql.begin(async (tx) => { + txid = await generateTxId(tx) + + const [result] = await tx` + INSERT INTO config ${tx(configData)} + RETURNING * + ` + return result + }) + + return json({ config: newConfig, txid }, { status: 201 }) + } catch (error) { + console.error(`Error creating config:`, error) + return json( + { + error: `Failed to create config`, + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + }, +}) diff --git a/examples/react/todo/src/routes/api/todos.$id.ts b/examples/react/todo/src/routes/api/todos.$id.ts new file mode 100644 index 000000000..9c1ef4366 --- /dev/null +++ b/examples/react/todo/src/routes/api/todos.$id.ts @@ -0,0 +1,116 @@ +import { createServerFileRoute } from "@tanstack/react-start/server" +import { json } from "@tanstack/react-start" +import { sql } from "../../db/postgres" +import { validateUpdateTodo } from "../../db/validation" +import type { Txid } from "@tanstack/db-collections" + +// Generate a transaction ID +async function generateTxId(tx: any): Promise { + const result = await tx`SELECT pg_current_xact_id()::xid::text as txid` + const txid = result[0]?.txid + + if (txid === undefined) { + throw new Error(`Failed to get transaction ID`) + } + + return parseInt(txid, 10) +} + +export const ServerRoute = createServerFileRoute(`/api/todos/$id`).methods({ + GET: async ({ params }) => { + try { + const { id } = params + const [todo] = await sql`SELECT * FROM todos WHERE id = ${id}` + + 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`, + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + }, + PUT: async ({ params, request }) => { + try { + const { id } = params + const body = await request.json() + const todoData = validateUpdateTodo(body) + + let txid!: Txid + const updatedTodo = await sql.begin(async (tx) => { + txid = await generateTxId(tx) + + const [result] = await tx` + UPDATE todos + SET ${tx(todoData)} + WHERE id = ${id} + RETURNING * + ` + + if (!result) { + throw new Error(`Todo not found`) + } + + return result + }) + + return json({ todo: updatedTodo, txid }) + } catch (error) { + if (error instanceof Error && error.message === `Todo not found`) { + return json({ error: `Todo not found` }, { status: 404 }) + } + + console.error(`Error updating todo:`, error) + return json( + { + error: `Failed to update todo`, + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + }, + DELETE: async ({ params }) => { + try { + const { id } = params + + let txid!: Txid + await sql.begin(async (tx) => { + txid = await generateTxId(tx) + + const [result] = await tx` + DELETE FROM todos + WHERE id = ${id} + RETURNING id + ` + + if (!result) { + throw new Error(`Todo not found`) + } + }) + + return json({ success: true, txid }) + } catch (error) { + if (error instanceof Error && error.message === `Todo not found`) { + return json({ error: `Todo not found` }, { status: 404 }) + } + + console.error(`Error deleting todo:`, error) + return json( + { + error: `Failed to delete todo`, + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + }, +}) diff --git a/examples/react/todo/src/routes/api/todos.ts b/examples/react/todo/src/routes/api/todos.ts new file mode 100644 index 000000000..1b1a75b56 --- /dev/null +++ b/examples/react/todo/src/routes/api/todos.ts @@ -0,0 +1,67 @@ +import { createServerFileRoute } from "@tanstack/react-start/server" +import { json } from "@tanstack/react-start" +import { sql } from "../../db/postgres" +import { validateInsertTodo } from "../../db/validation" +import type { Txid } from "@tanstack/db-collections" + +// Generate a transaction ID +async function generateTxId(tx: any): Promise { + // The ::xid cast strips off the epoch, giving you the raw 32-bit value + // that matches what PostgreSQL sends in logical replication streams + // (and then exposed through Electric which we'll match against + // in the client). + const result = await tx`SELECT pg_current_xact_id()::xid::text as txid` + const txid = result[0]?.txid + + if (txid === undefined) { + throw new Error(`Failed to get transaction ID`) + } + + return parseInt(txid, 10) +} + +export const ServerRoute = createServerFileRoute(`/api/todos`).methods({ + GET: async ({ request: _request }) => { + try { + const todos = await sql`SELECT * FROM todos` + return json(todos) + } catch (error) { + console.error(`Error fetching todos:`, error) + return json( + { + error: `Failed to fetch todos`, + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + }, + POST: async ({ request }) => { + try { + const body = await request.json() + const todoData = validateInsertTodo(body) + + let txid!: Txid + const newTodo = await sql.begin(async (tx) => { + txid = await generateTxId(tx) + + const [result] = await tx` + INSERT INTO todos ${tx(todoData)} + RETURNING * + ` + return result + }) + + return json({ todo: newTodo, txid }, { status: 201 }) + } catch (error) { + console.error(`Error creating todo:`, error) + return json( + { + error: `Failed to create todo`, + details: error instanceof Error ? error.message : String(error), + }, + { status: 500 } + ) + } + }, +}) diff --git a/examples/react/todo/src/routes/electric.tsx b/examples/react/todo/src/routes/electric.tsx new file mode 100644 index 000000000..8d4f068f6 --- /dev/null +++ b/examples/react/todo/src/routes/electric.tsx @@ -0,0 +1,43 @@ +import { createFileRoute } from "@tanstack/react-router" +import { useLiveQuery } from "@tanstack/react-db" +import { + electricConfigCollection, + electricTodoCollection, +} from "../lib/collections" +import { TodoApp } from "../components/TodoApp" + +export const Route = createFileRoute(`/electric`)({ + component: ElectricPage, + ssr: false, + loader: async () => { + await Promise.all([ + electricTodoCollection.preload(), + electricConfigCollection.preload(), + ]) + + return null + }, +}) + +function ElectricPage() { + // Get data using live queries with Electric collections + const { data: todos } = useLiveQuery((q) => + q + .from({ todo: electricTodoCollection }) + .orderBy(({ todo }) => todo.created_at, `asc`) + ) + + const { data: configData } = useLiveQuery((q) => + q.from({ config: electricConfigCollection }) + ) + + return ( + + ) +} diff --git a/examples/react/todo/src/routes/index.tsx b/examples/react/todo/src/routes/index.tsx new file mode 100644 index 000000000..892bcdebb --- /dev/null +++ b/examples/react/todo/src/routes/index.tsx @@ -0,0 +1,46 @@ +import { Link, createFileRoute } from "@tanstack/react-router" + +export const Route = createFileRoute(`/`)({ + component: HomePage, +}) + +function HomePage() { + return ( +
+
+

+ TanStack DB Demo +

+ +

+ Choose a collection type to see how TanStack DB works with different + data sources: +

+ +
+ + + + + + +
+ +
+ Both examples use the same API and UI components, showcasing the + unified interface of TanStack DB. +
+
+
+ ) +} diff --git a/examples/react/todo/src/routes/query.tsx b/examples/react/todo/src/routes/query.tsx new file mode 100644 index 000000000..129ab0cd4 --- /dev/null +++ b/examples/react/todo/src/routes/query.tsx @@ -0,0 +1,40 @@ +import { createFileRoute } from "@tanstack/react-router" +import { useLiveQuery } from "@tanstack/react-db" +import { queryConfigCollection, queryTodoCollection } from "../lib/collections" +import { TodoApp } from "../components/TodoApp" + +export const Route = createFileRoute(`/query`)({ + component: QueryPage, + ssr: false, + loader: async () => { + await Promise.all([ + queryTodoCollection.preload(), + queryConfigCollection.preload(), + ]) + + return null + }, +}) + +function QueryPage() { + // Get data using live queries with Query collections + const { data: todos } = useLiveQuery((q) => + q + .from({ todo: queryTodoCollection }) + .orderBy(({ todo }) => todo.created_at, `asc`) + ) + + const { data: configData } = useLiveQuery((q) => + q.from({ config: queryConfigCollection }) + ) + + return ( + + ) +} diff --git a/examples/react/todo/src/styles.css b/examples/react/todo/src/styles.css new file mode 100644 index 000000000..870aa4650 --- /dev/null +++ b/examples/react/todo/src/styles.css @@ -0,0 +1,16 @@ +@import "tailwindcss"; + +body { + @apply m-0; + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", + "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: + source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; +} + diff --git a/examples/react/todo/tsconfig.json b/examples/react/todo/tsconfig.json index 04eb656a0..572a7c73a 100644 --- a/examples/react/todo/tsconfig.json +++ b/examples/react/todo/tsconfig.json @@ -13,7 +13,8 @@ "src/**/*.tsx", "scripts/**/*.ts", "vite.config.ts", - "drizzle.config.ts" + "drizzle.config.ts", + "app.config.ts" ], "exclude": ["node_modules", "dist"] } diff --git a/examples/react/todo/vite.config.ts b/examples/react/todo/vite.config.ts index 9cfc1c085..c9f9cbc8d 100644 --- a/examples/react/todo/vite.config.ts +++ b/examples/react/todo/vite.config.ts @@ -1,8 +1,22 @@ import { defineConfig } from "vite" import react from "@vitejs/plugin-react" import tailwindcss from "@tailwindcss/vite" +import { tanstackStart } from "@tanstack/react-start/plugin/vite" +import viteTsConfigPaths from "vite-tsconfig-paths" // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react(), tailwindcss()], + plugins: [ + viteTsConfigPaths({ + projects: [`./tsconfig.json`], + }), + tailwindcss(), + tanstackStart({ + customViteReactPlugin: true, + spa: { + enabled: true, + }, + }), + react(), + ], }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be177cfd9..599e8e15a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 1.2.0 '@tanstack/config': specifier: ^0.17.1 - version: 0.17.1(@types/node@22.16.1)(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 0.17.1(@types/node@22.16.1)(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 @@ -46,7 +46,7 @@ importers: version: 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) eslint: specifier: ^9.22.0 version: 9.30.1(jiti@2.4.2) @@ -88,10 +88,10 @@ importers: version: 5.8.3 vite: specifier: ^6.2.2 - version: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + version: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) vitest: specifier: ^3.0.9 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.16.1)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.16.1)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) zod: specifier: ^3.24.2 version: 3.25.76 @@ -107,6 +107,12 @@ importers: '@tanstack/react-db': specifier: ^0.0.19 version: link:../../../packages/react-db + '@tanstack/react-router': + specifier: ^1.125.6 + version: 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-start': + specifier: ^1.126.1 + version: 1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) cors: specifier: ^2.8.5 version: 2.8.5 @@ -131,13 +137,16 @@ importers: tailwindcss: specifier: ^4.1.11 version: 4.1.11 + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) devDependencies: '@eslint/js': specifier: ^9.22.0 version: 9.30.1 '@tailwindcss/vite': specifier: ^4.0.0-alpha.8 - version: 4.1.11(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.1.11(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) '@types/cors': specifier: ^2.8.17 version: 2.8.19 @@ -164,7 +173,7 @@ importers: version: 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.6.0 - version: 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) concurrently: specifier: ^9.2.0 version: 9.2.0 @@ -194,7 +203,7 @@ importers: version: 5.8.3 vite: specifier: ^6.2.2 - version: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + version: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) packages/db: dependencies: @@ -210,7 +219,7 @@ importers: devDependencies: '@vitest/coverage-istanbul': specifier: ^3.0.9 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) packages/db-collections: dependencies: @@ -241,7 +250,7 @@ importers: version: 4.1.12 '@vitest/coverage-istanbul': specifier: ^3.0.9 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) packages/react-db: dependencies: @@ -269,7 +278,7 @@ importers: version: 0.0.6 '@vitest/coverage-istanbul': specifier: ^3.0.9 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) react: specifier: ^19.0.0 version: 19.1.0 @@ -288,10 +297,10 @@ importers: version: 1.0.0 '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + version: 5.2.4(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) '@vitest/coverage-istanbul': specifier: ^3.0.9 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) vue: specifier: ^3.5.13 version: 3.5.17(typescript@5.8.3) @@ -308,6 +317,10 @@ packages: '@asamuzakjp/css-color@2.8.3': resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -324,14 +337,28 @@ packages: resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} @@ -342,10 +369,24 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} @@ -380,6 +421,24 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} @@ -392,12 +451,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.26.10': - resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/runtime@7.26.9': - resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + '@babel/runtime@7.26.10': + resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} '@babel/runtime@7.27.6': @@ -478,6 +545,14 @@ 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.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + '@commitlint/parse@19.8.1': resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==} engines: {node: '>=v18'} @@ -514,6 +589,13 @@ packages: resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} engines: {node: '>=18'} + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + + '@dependents/detective-less@5.0.1': + resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} + engines: {node: '>=18'} + '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} @@ -558,6 +640,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.6': resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} engines: {node: '>=18'} @@ -588,6 +676,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.6': resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} engines: {node: '>=18'} @@ -618,6 +712,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.6': resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} engines: {node: '>=18'} @@ -648,6 +748,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.6': resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} engines: {node: '>=18'} @@ -678,6 +784,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.6': resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} engines: {node: '>=18'} @@ -708,6 +820,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.6': resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} engines: {node: '>=18'} @@ -738,6 +856,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.6': resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} engines: {node: '>=18'} @@ -768,6 +892,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.6': resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} engines: {node: '>=18'} @@ -798,6 +928,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.6': resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} engines: {node: '>=18'} @@ -828,6 +964,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.6': resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} engines: {node: '>=18'} @@ -858,6 +1000,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.6': resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} engines: {node: '>=18'} @@ -888,6 +1036,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.6': resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} engines: {node: '>=18'} @@ -918,6 +1072,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.6': resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} engines: {node: '>=18'} @@ -948,6 +1108,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.6': resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} engines: {node: '>=18'} @@ -978,6 +1144,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.6': resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} engines: {node: '>=18'} @@ -1008,6 +1180,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.6': resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} engines: {node: '>=18'} @@ -1038,6 +1216,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.6': resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} engines: {node: '>=18'} @@ -1056,6 +1240,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.25.6': resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} engines: {node: '>=18'} @@ -1086,6 +1276,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.6': resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} engines: {node: '>=18'} @@ -1104,6 +1300,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.25.6': resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} engines: {node: '>=18'} @@ -1134,6 +1336,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.6': resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} engines: {node: '>=18'} @@ -1170,6 +1378,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.6': resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} engines: {node: '>=18'} @@ -1200,6 +1414,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.6': resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} engines: {node: '>=18'} @@ -1230,6 +1450,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.6': resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} engines: {node: '>=18'} @@ -1260,6 +1486,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.6': resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} engines: {node: '>=18'} @@ -1314,6 +1546,9 @@ packages: resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@fastify/busboy@3.1.1': + resolution: {integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==} + '@gerrit0/mini-shiki@1.27.2': resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} @@ -1337,6 +1572,9 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -1372,6 +1610,9 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} @@ -1396,6 +1637,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==} @@ -1419,6 +1665,42 @@ packages: '@napi-rs/wasm-runtime@0.2.11': resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + '@netlify/binary-info@1.0.0': + resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} + + '@netlify/blobs@9.1.2': + resolution: {integrity: sha512-7dMjExSH4zj4ShvLem49mE3mf0K171Tx2pV4WDWhJbRUWW3SJIR2qntz0LvUGS97N5HO1SmnzrgWUhEXCsApiw==} + engines: {node: ^14.16.0 || >=16.0.0} + + '@netlify/dev-utils@2.2.0': + resolution: {integrity: sha512-5XUvZuffe3KetyhbWwd4n2ktd7wraocCYw10tlM+/u/95iAz29GjNiuNxbCD1T6Bn1MyGc4QLVNKOWhzJkVFAw==} + engines: {node: ^14.16.0 || >=16.0.0} + + '@netlify/functions@3.1.10': + resolution: {integrity: sha512-sI93kcJ2cUoMgDRPnrEm0lZhuiDVDqM6ngS/UbHTApIH3+eg3yZM5p/0SDFQQq9Bad0/srFmgBmTdXushzY5kg==} + engines: {node: '>=14.0.0'} + + '@netlify/open-api@2.37.0': + resolution: {integrity: sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w==} + engines: {node: '>=14.8.0'} + + '@netlify/runtime-utils@1.3.1': + resolution: {integrity: sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg==} + engines: {node: '>=16.0.0'} + + '@netlify/serverless-functions-api@1.41.2': + resolution: {integrity: sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw==} + engines: {node: '>=18.0.0'} + + '@netlify/serverless-functions-api@2.1.3': + resolution: {integrity: sha512-bNlN/hpND8xFQzpjyKxm6vJayD+bPBlOvs4lWihE7WULrphuH1UuFsoVE5386bNNGH8Rs1IH01AFsl7ALQgOlQ==} + engines: {node: '>=18.0.0'} + + '@netlify/zip-it-and-ship-it@12.2.1': + resolution: {integrity: sha512-zAr+8Tg80y/sUbhdUkZsq4Uy1IMzkSB6H/sKRMrDQ2NJx4uPgf5X5jMdg9g2FljNcxzpfJwc1Gg4OXQrjD0Z4A==} + engines: {node: '>=18.14.0'} + hasBin: true + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1431,6 +1713,110 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oozcitak/dom@1.15.10': + resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} + engines: {node: '>=8.0'} + + '@oozcitak/infra@1.0.8': + resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} + engines: {node: '>=6.0'} + + '@oozcitak/url@1.0.4': + resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} + engines: {node: '>=8.0'} + + '@oozcitak/util@8.3.8': + resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} + engines: {node: '>=8.0'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + 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'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + '@petamoriken/float16@3.9.2': resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} @@ -1442,6 +1828,15 @@ packages: resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} 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==} + '@publint/pack@0.1.2': resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} engines: {node: '>=18'} @@ -1449,8 +1844,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.19': resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} - '@rollup/pluginutils@5.2.0': - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + '@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 @@ -1458,18 +1853,81 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.34.8': - resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} - cpu: [arm] - os: [android] + '@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/rollup-android-arm-eabi@4.44.2': - resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==} - cpu: [arm] - os: [android] + '@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/rollup-android-arm64@4.34.8': - resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} + '@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.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.44.2': + resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} cpu: [arm64] os: [android] @@ -1703,6 +2161,17 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sindresorhus/is@7.0.2': + resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@speed-highlight/core@1.2.7': + resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -1816,10 +2285,20 @@ packages: resolution: {integrity: sha512-kUqfsU5qO/kiptgkjumdKuu/W4i1iYKPW6pUujEH1I+rzZLGIqD6noq9LDVZRh78ArAiZj+VYrdC5jbrtmsI8A==} engines: {node: '>=18'} + '@tanstack/directive-functions-plugin@1.124.1': + resolution: {integrity: sha512-eZdsPCZz+7VIKiXAF5dNdLJBerAo4t79w/OQTWaKuqPLX1E9GQOKHsmTZChWeQbxPx+y+cOV3/0U/yKxtHsm0Q==} + engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0' + '@tanstack/eslint-config@0.1.0': resolution: {integrity: sha512-/lVsQmmezpqqbCFtaxGNkoSnQ/+H0PAHyHF37PGQ6ZBrF8RXktgazMdsD5SCaNT9oEnGCl274GCZ9sY80b50Sg==} engines: {node: '>=18'} + '@tanstack/history@1.121.34': + resolution: {integrity: sha512-YL8dGi5ZU+xvtav2boRlw4zrRghkY6hvdcmHhA0RGSJ/CBgzv+cbADW9eYJLx74XMZvIQ1pp6VMbrpXnnM5gHA==} + engines: {node: '>=12'} + '@tanstack/publish-config@0.1.0': resolution: {integrity: sha512-nI4F7/SpT6BMoigq1VmrrNe3A6Hsua9XcZNql+qzK2zJUOcKBRqMvC22n3eKcjsbZuWIFvkIC0ThsuBVYCKXfA==} engines: {node: '>=18'} @@ -1827,6 +2306,112 @@ packages: '@tanstack/query-core@5.81.5': resolution: {integrity: sha512-ZJOgCy/z2qpZXWaj/oxvodDx07XcQa9BF92c0oINjHkoqUPsmm3uG08HpTaviviZ/N9eP1f9CM7mKSEkIo7O1Q==} + '@tanstack/react-router@1.125.6': + resolution: {integrity: sha512-znyUGTq+WRhXwToNTYiluUBLjMdQVxz+ZQ9Ep2PBuS9O+3Qm3kaM7n64hA84ISoCtLqMwTo7Ofw0W4WeLdjpYg==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-client@1.125.6': + resolution: {integrity: sha512-s7irNfPDVRlqumA5cHGAsfipyJicUpNIZ8veoKIl8WPYiWCIolbXWzSBXix96KxvFr20lJXgxRWRlWAe9GbOGA==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-plugin@1.126.1': + resolution: {integrity: sha512-VXRbcNnpuTaLHpBcXQtBOWkk1tlSQM0iXwVI7xTPFr2U7/Iwj/Q7O+PiI/eH60XwGojJnGjelpEAde9KnJtP8w==} + engines: {node: '>=12'} + peerDependencies: + '@vitejs/plugin-react': '>=4.3.4' + vite: '>=6.0.0' + + '@tanstack/react-start-server@1.126.1': + resolution: {integrity: sha512-AdX85pxM+3qgItLNWVpdkLeBuaHE1QQNQNMhm/BzB0fhyyqQXpuAkgUWhxsppU29E+uBQCx+UtramMnNFI7yCQ==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start@1.126.1': + resolution: {integrity: sha512-l1rUzvj0a/LmEAfnJTRxIf2gj21XkM2TgCwbC49WvqInXA0J6rvulfuqPsBTPSPedXS6bI0fWdQiistR5LN1/g==} + 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-store@0.7.3': + resolution: {integrity: sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==} + 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.125.4': + resolution: {integrity: sha512-tdgGI0Kwt3Lgs9ceLbG32NPh4I2H1T9t2TKjcS+I78sifm5rjTWV8lfqVRNrvMPk5ek60vXPOL2AHAUg6ohwsA==} + engines: {node: '>=12'} + + '@tanstack/router-generator@1.125.4': + resolution: {integrity: sha512-jF71znMvpZxmkQF0MxfjKKyvXtft9NWRCVcLhb+6d/8nrVGNiEw+dsXn/CLpeRQLk7Mg/fsp/WipBql1dd3Qaw==} + engines: {node: '>=12'} + + '@tanstack/router-plugin@1.125.6': + resolution: {integrity: sha512-SWfp++tkjb0grVqa/Xdvi9QAs93e9/fZMBZ6q0fvvQruMyciCmjWyE/qV3tS/Qh0WZdzIRP6yl8Gha2Lin4q1w==} + engines: {node: '>=12'} + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.125.6 + 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-utils@1.121.21': + resolution: {integrity: sha512-u7ubq1xPBtNiU7Fm+EOWlVWdgFLzuKOa1thhqdscVn8R4dNMUd1VoOjZ6AKmLw201VaUhFtlX+u0pjzI6szX7A==} + engines: {node: '>=12'} + + '@tanstack/server-functions-plugin@1.124.1': + resolution: {integrity: sha512-9GIu+PXu5itj+Q74FJQpd4WV3FikzkAAxvBl9hrnmiEwz+AGDZL0GOiGy++MdupHJXuHXXss9mHqKtNmw9wMdw==} + engines: {node: '>=12'} + + '@tanstack/start-client-core@1.125.4': + resolution: {integrity: sha512-rijB1mZf3TazmYinSZBYclUolc/h4W1t/20uOFsjZli/Si8QUaoBdsKHFnZj8c/73H8Yxdzi4ZkLrD2rAesZhg==} + engines: {node: '>=12'} + + '@tanstack/start-plugin-core@1.126.1': + resolution: {integrity: sha512-EuV10r6r+H6Y91U/YIgsgRyuzLlhnLMg8qFab+iq8w+DFW1rfs9eIqOcv2KGzwIDb5Wmkw3t7c2PJ5kT52J2gQ==} + engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0' + + '@tanstack/start-server-core@1.126.1': + resolution: {integrity: sha512-dmVWtC1OcuLwiJM6fyk61e4TlTKCeVAoKV5Xg/FeVbD+rbAHF7AOsCln/rT3NgT0vUhO7Nxmlr2zjz1j0jV9Hg==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-client@1.125.4': + resolution: {integrity: sha512-/Hk6u19YQBbLbzKVZNlUOsPk+Ub84je4EK3ennLppuuNa7aPRvJXyRPn6kCLQXfLE/TZudirK0ze2HwHeuNgbQ==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-fetcher@1.125.4': + resolution: {integrity: sha512-vPWSbHlpCsg7g63gvKyiLWW3t4CW9apmNfPFIUKAPK+f+ZIP7PIefG60sFYRmS8jWvZvC1mSz66vkStvfUEfkQ==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-server@1.124.1': + resolution: {integrity: sha512-59NJqtdXm2c+JmwDqm3ZuvgcN1KT2LlvApelydj9y201lj76XjcEH4RqbJKm5G7C/wc98QPhghFHY8cwHJUCTg==} + engines: {node: '>=12'} + '@tanstack/store@0.7.2': resolution: {integrity: sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==} @@ -1834,6 +2419,10 @@ packages: resolution: {integrity: sha512-WaeDXvt9Dyds53SCOCZKGmwHdS6LGwNH7LyDeTtsmPW7zn7ApOaNyAPWlqjkEHGVd0ykvR+XA8CI8RPfLGGxmw==} engines: {node: '>=18'} + '@tanstack/virtual-file-routes@1.121.21': + resolution: {integrity: sha512-3nuYsTyaq6ZN7jRZ9z6Gj3GXZqBOqOT0yzd/WZ33ZFfv4yVNIvsa5Lw+M1j3sgyEAxKMqGu/FaNi7FCjr3yOdw==} + engines: {node: '>=12'} + '@tanstack/vite-config@0.1.0': resolution: {integrity: sha512-G6l2Q4hp/Yj43UyE9APz+Fj5sdC15G2UD2xXOSdQCZ6/4gjYd2c040TLk7ObGhypbeWBYvy93Gg18nS41F6eqg==} engines: {node: '>=18'} @@ -1870,6 +2459,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==} @@ -1942,6 +2534,9 @@ packages: '@types/node@24.0.11': resolution: {integrity: sha512-CJV8eqrYnwQJGMrvcRhQmZfpyniDavB+7nAZYJc6w99hFYJyFN3INV1/2W3QfQrqM36WTLrijJ1fxxvGBmCSxA==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/pg@8.15.4': resolution: {integrity: sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==} @@ -1959,12 +2554,18 @@ packages: '@types/react@19.1.8': resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/send@0.17.5': resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} '@types/serve-static@1.15.7': resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -1974,6 +2575,9 @@ packages: '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript-eslint/eslint-plugin@8.36.0': resolution: {integrity: sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2128,6 +2732,11 @@ packages: cpu: [x64] os: [win32] + '@vercel/nft@0.29.4': + resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} + engines: {node: '>=18'} + hasBin: true + '@vitejs/plugin-react@4.6.0': resolution: {integrity: sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2224,14 +2833,47 @@ packages: '@vue/shared@3.5.17': resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + '@whatwg-node/disposablestack@0.0.6': + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/fetch@0.10.8': + resolution: {integrity: sha512-Rw9z3ctmeEj8QIB9MavkNJqekiu9usBCSMZa+uuAvM0lF3v70oQVCXNppMIqaV6OTZbdaHF1M2HLow58DEw+wg==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.7.21': + resolution: {integrity: sha512-QC16IdsEyIW7kZd77aodrMO7zAoDyyqRCTLg+qG4wqtP4JV9AA+p7/lgqMdD29XyiYdVvIdFrfI9yh7B1QvRvw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/promise-helpers@1.3.2': + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + + '@whatwg-node/server@0.9.71': + resolution: {integrity: sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g==} + engines: {node: '>=18.0.0'} + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 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: @@ -2299,9 +2941,25 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + 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'} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2357,25 +3015,61 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-module-types@6.0.1: + resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} + engines: {node: '>=18'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + async-function@1.0.0: 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==} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + babel-dead-code-elimination@1.0.10: + resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.6.0: + resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + binary-extensions@2.3.0: + 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} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -2394,9 +3088,23 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2407,6 +3115,14 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c12@3.0.4: + resolution: {integrity: sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2427,6 +3143,9 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2457,6 +3176,17 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.1.0: + resolution: {integrity: sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==} + engines: {node: '>=18.17'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -2469,6 +3199,9 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -2477,24 +3210,58 @@ packages: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} + clipboardy@4.0.0: + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@13.1.0: 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'} @@ -2503,12 +3270,25 @@ packages: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + 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==} @@ -2523,10 +3303,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==} + consola@3.4.0: resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} engines: {node: ^14.18.0 || >=16.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'} @@ -2547,6 +3334,12 @@ 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==} + cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -2554,10 +3347,38 @@ packages: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + copy-file@11.0.0: + resolution: {integrity: sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw==} + 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'} + + cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + + 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'} @@ -2566,6 +3387,16 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} @@ -2576,6 +3407,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -2595,6 +3430,29 @@ packages: dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + 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==} @@ -2632,6 +3490,9 @@ packages: supports-color: optional: true + decache@4.6.2: + resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} + decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} @@ -2642,14 +3503,29 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + define-data-property@1.1.4: 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'} + 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'} @@ -2658,6 +3534,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} @@ -2666,30 +3545,99 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + detect-libc@2.0.4: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + detective-amd@6.0.1: + resolution: {integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==} + engines: {node: '>=18'} + hasBin: true - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + detective-cjs@6.0.1: + resolution: {integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==} + engines: {node: '>=18'} - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + detective-es6@5.0.1: + resolution: {integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==} + engines: {node: '>=18'} - dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + detective-postcss@7.0.1: + resolution: {integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==} + engines: {node: ^14.0.0 || >=16.0.0} + peerDependencies: + postcss: ^8.4.47 - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + detective-sass@6.0.1: + resolution: {integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==} + engines: {node: '>=18'} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + detective-scss@5.0.1: + resolution: {integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==} + engines: {node: '>=18'} + + detective-stylus@5.0.1: + resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} + engines: {node: '>=18'} + + detective-typescript@14.0.0: + resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 + + detective-vue2@2.2.0: + resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 + + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + 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'} drizzle-kit@0.30.6: @@ -2795,6 +3743,9 @@ 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==} @@ -2813,6 +3764,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -2821,6 +3775,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -2836,6 +3793,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2844,6 +3805,9 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + es-abstract@1.23.9: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} @@ -2904,6 +3868,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.25.6: resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} engines: {node: '>=18'} @@ -2920,6 +3889,15 @@ 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'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + eslint-compat-utils@0.5.1: resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} @@ -3065,9 +4043,17 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} @@ -3084,6 +4070,9 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -3091,12 +4080,20 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 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'} @@ -3110,6 +4107,9 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.4.6: resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: @@ -3118,18 +4118,36 @@ packages: picomatch: optional: true + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + 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'} + filter-obj@6.1.0: + resolution: {integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==} + engines: {node: '>=18'} + finalhandler@1.3.1: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -3138,6 +4156,10 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} @@ -3148,6 +4170,9 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -3156,6 +4181,10 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -3168,6 +4197,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-extra@11.3.0: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} @@ -3204,6 +4237,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-amd-module-type@6.0.1: + resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} + engines: {node: '>=18'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -3220,6 +4257,9 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -3228,6 +4268,10 @@ packages: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -3242,6 +4286,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'} @@ -3274,9 +4322,18 @@ 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==} + gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -3287,6 +4344,16 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + 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.3: + resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} + happy-dom@18.0.1: resolution: {integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==} engines: {node: '>=20.0.0'} @@ -3322,6 +4389,13 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -3329,6 +4403,9 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -3337,10 +4414,17 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + 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 @@ -3362,6 +4446,9 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -3386,6 +4473,10 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} + engines: {node: '>=18'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3397,14 +4488,24 @@ packages: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} + ioredis@5.6.1: + resolution: {integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==} + engines: {node: '>=12.22.0'} + ipaddr.js@1.9.1: 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-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -3413,10 +4514,18 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -3433,6 +4542,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'} @@ -3461,10 +4580,18 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-map@2.0.3: 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-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -3477,9 +4604,20 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -3496,10 +4634,18 @@ 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} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -3520,6 +4666,13 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-url-superb@4.0.0: + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} + + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -3536,9 +4689,28 @@ 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==} + isbot@5.1.28: + resolution: {integrity: sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3643,16 +4815,47 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + junk@4.0.1: + resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} + engines: {node: '>=12.20'} + + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + knitwork@1.2.0: + resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + kysely@0.28.2: resolution: {integrity: sha512-4YAVLoF0Sf0UTqlhgQMFU9iQECdah7n+13ANkiuVfRvlK+uI0Etbgd7bVP36dKlG+NXWbhGua8vnGt+sdhvT7A==} engines: {node: '>=18.0.0'} + lambda-local@2.2.0: + resolution: {integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==} + engines: {node: '>=8'} + hasBin: true + + 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'} @@ -3736,6 +4939,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'} @@ -3748,6 +4955,10 @@ packages: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -3756,6 +4967,22 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -3772,6 +4999,10 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -3795,6 +5026,10 @@ packages: lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + luxon@3.7.1: + resolution: {integrity: sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==} + engines: {node: '>=12'} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -3831,6 +5066,10 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-options@3.0.4: + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3842,6 +5081,9 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + micro-api-client@3.3.0: + resolution: {integrity: sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -3850,15 +5092,33 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mime@4.0.7: + resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==} + engines: {node: '>=16'} + hasBin: true + mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} @@ -3881,6 +5141,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'} @@ -3907,6 +5171,11 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + module-definition@6.0.1: + resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} + engines: {node: '>=18'} + hasBin: true + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -3943,9 +5212,34 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + netlify@13.3.5: + resolution: {integrity: sha512-Nc3loyVASW59W+8fLDZT1lncpG7llffyZ2o0UQLx/Fr20i7P8oP+lE7+TEcFvXj9IUWU6LjB9P3BH+iFGyp+mg==} + engines: {node: ^14.16.0 || >=16.0.0} + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + nitropack@2.11.13: + resolution: {integrity: sha512-xKng/szRZmFEsrB1Z+sFzYDhXL5KUtUkEouPCj9LiBPhJ7qV3jdOv1MSis++8H8zNI6dEurt51ZlK4VRDvedsA==} + engines: {node: ^16.11.0 || >=17.0.0} + hasBin: true + peerDependencies: + xml2js: ^0.6.2 + peerDependenciesMeta: + xml2js: + optional: true + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -3955,9 +5249,45 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-mock-http@1.0.1: + resolution: {integrity: sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==} + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-source-walk@7.0.1: + resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==} + engines: {node: '>=18'} + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} @@ -3966,9 +5296,17 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nwsapi@2.2.16: resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + nypm@0.6.0: + resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==} + 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'} @@ -3997,6 +5335,15 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} + 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.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -4004,6 +5351,9 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -4012,6 +5362,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'} @@ -4027,6 +5381,10 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -4043,6 +5401,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -4051,14 +5413,30 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + p-wait-for@5.0.2: + resolution: {integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==} + engines: {node: '>=12'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -4072,9 +5450,26 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -4086,6 +5481,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} @@ -4112,6 +5511,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==} @@ -4119,6 +5525,12 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + pg-cloudflare@1.2.7: resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} @@ -4183,6 +5595,9 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pkg-types@2.2.0: + resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -4205,6 +5620,12 @@ packages: yaml: optional: true + postcss-values-parser@6.0.2: + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.2.9 + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -4229,6 +5650,11 @@ packages: resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} engines: {node: '>=12'} + precinct@12.2.0: + resolution: {integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==} + engines: {node: '>=18'} + hasBin: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4247,10 +5673,21 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + 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} + 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'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -4284,6 +5721,15 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quote-unquote@1.0.0: + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -4292,6 +5738,9 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + react-dom@19.1.0: resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: @@ -4311,14 +5760,44 @@ packages: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} @@ -4327,6 +5806,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.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -4338,6 +5825,9 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4346,6 +5836,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-package-name@2.0.1: + resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -4382,6 +5875,19 @@ packages: peerDependencies: rollup: 2.x || 3.x || 4.x + 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.34.8: resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4409,6 +5915,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==} @@ -4420,6 +5929,10 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -4430,6 +5943,9 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -4457,10 +5973,24 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + 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'} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -4535,10 +6065,17 @@ packages: simple-git@3.28.0: resolution: {integrity: sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + slash@3.0.0: 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'} @@ -4547,6 +6084,9 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + sorted-btree@1.8.1: resolution: {integrity: sha512-395+XIP+wqNn3USkFSrNz7G3Ss/MXlZEqesxvzCRFwL14h6e8LukDHdLBePn5pwbm5OQ9vGu8mDyz2lLDIqamQ==} @@ -4561,6 +6101,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -4568,6 +6112,18 @@ packages: spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -4579,9 +6135,15 @@ packages: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -4589,6 +6151,9 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + 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'} @@ -4624,6 +6189,12 @@ 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==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -4660,6 +6231,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + supports-color@10.0.0: + resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} + engines: {node: '>=18'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -4679,6 +6254,10 @@ packages: resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} + system-architecture@0.1.0: + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} + tailwindcss@4.1.11: resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} @@ -4686,6 +6265,9 @@ packages: resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} @@ -4694,14 +6276,25 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + 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-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -4712,6 +6305,12 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -4745,10 +6344,17 @@ packages: resolution: {integrity: sha512-fSgYrW0ITH0SR/CqKMXIruYIPpNu5aDgUp22UhYoSrnUQwc7SBqifEBFNce7AAcygUPBo6a/gbtcguWdmko4RQ==} hasBin: true + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4757,6 +6363,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + tough-cookie@5.1.1: resolution: {integrity: sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==} engines: {node: '>=16'} @@ -4775,6 +6384,10 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -4830,6 +6443,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + 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'} @@ -4896,16 +6513,47 @@ 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'} + 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.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + undici@7.11.0: + resolution: {integrity: sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==} + engines: {node: '>=20.18.1'} + + unenv@1.10.0: + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + + unenv@2.0.0-rc.18: + resolution: {integrity: sha512-O0oVQVJ2X3Q8H4HITJr4e2cWxMYBeZ+p8S25yoKCxVCgDWtIJDcgwWNonYz12tI3ylVQCRyPV/Bdq0KJeXo7AA==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unimport@5.1.0: + resolution: {integrity: sha512-wMmuG+wkzeHh2KCE6yiDlHmKelN8iE/maxkUYMbmrS6iV8+n6eP1TH3yKKlepuF4hrkepinEGmBXdfo9XZUvAw==} + engines: {node: '>=18.12.0'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -4914,31 +6562,136 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + unixify@1.0.0: + resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} + engines: {node: '>=0.10.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin-utils@0.2.4: + resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} + engines: {node: '>=18.12.0'} + + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + + unplugin@2.3.5: + resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} + engines: {node: '>=18.12.0'} + unrs-resolver@1.11.0: resolution: {integrity: sha512-uw3hCGO/RdAEAb4zgJ3C/v6KIAFFOtBoxR86b2Ejc5TnH7HrhTWJR2o0A9ullC3eWMegKQCw/arQ/JivywQzkg==} + unstorage@1.16.0: + resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} + 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 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@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/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.9: + resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} + 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==} + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + + urlpattern-polyfill@8.0.2: + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + use-sync-external-store@1.5.0: resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -5100,6 +6853,10 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -5110,6 +6867,9 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -5167,6 +6927,14 @@ packages: engines: {node: '>=8'} hasBin: true + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + engines: {node: '>= 12.0.0'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -5186,6 +6954,10 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@6.0.0: + resolution: {integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==} + engines: {node: ^18.17.0 || >=20.5.0} + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -5202,6 +6974,10 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} + xmlbuilder2@3.1.1: + resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} + engines: {node: '>=12.0'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -5236,10 +7012,28 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.0-beta.8: + resolution: {integrity: sha512-rY2A2lSF7zC+l7HH9Mq+83D1dLlsPnEvy8jTouzaptDZM6geqZ3aJe/b7ULCwRURPtWV3vbDjA2DDMdoBol0HQ==} + engines: {node: '>=18'} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -5260,6 +7054,12 @@ snapshots: '@csstools/css-tokenizer': 3.0.3 lru-cache: 10.4.3 + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -5296,6 +7096,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.0 + '@babel/helper-compilation-targets@7.27.2': dependencies: '@babel/compat-data': 7.28.0 @@ -5304,8 +7108,28 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-globals@7.28.0': {} + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.28.0 @@ -5322,8 +7146,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.0 + '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.25.9': {} '@babel/helper-string-parser@7.27.1': {} @@ -5347,6 +7191,24 @@ snapshots: dependencies: '@babel/types': 7.28.0 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -5357,11 +7219,29 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.26.10': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)': dependencies: - regenerator-runtime: 0.14.1 + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color - '@babel/runtime@7.26.9': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.26.10': dependencies: regenerator-runtime: 0.14.1 @@ -5544,6 +7424,12 @@ 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.6.0': {} + '@commitlint/parse@19.8.1': dependencies: '@commitlint/types': 19.8.1 @@ -5575,6 +7461,17 @@ snapshots: '@csstools/css-tokenizer@3.0.3': {} + '@dabh/diagnostics@2.0.3': + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + + '@dependents/detective-less@5.0.1': + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + '@drizzle-team/brocli@0.10.2': {} '@electric-sql/client@1.0.0': @@ -5622,6 +7519,9 @@ snapshots: '@esbuild/aix-ppc64@0.25.1': optional: true + '@esbuild/aix-ppc64@0.25.5': + optional: true + '@esbuild/aix-ppc64@0.25.6': optional: true @@ -5637,6 +7537,9 @@ snapshots: '@esbuild/android-arm64@0.25.1': optional: true + '@esbuild/android-arm64@0.25.5': + optional: true + '@esbuild/android-arm64@0.25.6': optional: true @@ -5652,6 +7555,9 @@ snapshots: '@esbuild/android-arm@0.25.1': optional: true + '@esbuild/android-arm@0.25.5': + optional: true + '@esbuild/android-arm@0.25.6': optional: true @@ -5667,6 +7573,9 @@ snapshots: '@esbuild/android-x64@0.25.1': optional: true + '@esbuild/android-x64@0.25.5': + optional: true + '@esbuild/android-x64@0.25.6': optional: true @@ -5682,6 +7591,9 @@ snapshots: '@esbuild/darwin-arm64@0.25.1': optional: true + '@esbuild/darwin-arm64@0.25.5': + optional: true + '@esbuild/darwin-arm64@0.25.6': optional: true @@ -5697,6 +7609,9 @@ snapshots: '@esbuild/darwin-x64@0.25.1': optional: true + '@esbuild/darwin-x64@0.25.5': + optional: true + '@esbuild/darwin-x64@0.25.6': optional: true @@ -5712,6 +7627,9 @@ snapshots: '@esbuild/freebsd-arm64@0.25.1': optional: true + '@esbuild/freebsd-arm64@0.25.5': + optional: true + '@esbuild/freebsd-arm64@0.25.6': optional: true @@ -5727,6 +7645,9 @@ snapshots: '@esbuild/freebsd-x64@0.25.1': optional: true + '@esbuild/freebsd-x64@0.25.5': + optional: true + '@esbuild/freebsd-x64@0.25.6': optional: true @@ -5742,6 +7663,9 @@ snapshots: '@esbuild/linux-arm64@0.25.1': optional: true + '@esbuild/linux-arm64@0.25.5': + optional: true + '@esbuild/linux-arm64@0.25.6': optional: true @@ -5757,6 +7681,9 @@ snapshots: '@esbuild/linux-arm@0.25.1': optional: true + '@esbuild/linux-arm@0.25.5': + optional: true + '@esbuild/linux-arm@0.25.6': optional: true @@ -5772,6 +7699,9 @@ snapshots: '@esbuild/linux-ia32@0.25.1': optional: true + '@esbuild/linux-ia32@0.25.5': + optional: true + '@esbuild/linux-ia32@0.25.6': optional: true @@ -5787,6 +7717,9 @@ snapshots: '@esbuild/linux-loong64@0.25.1': optional: true + '@esbuild/linux-loong64@0.25.5': + optional: true + '@esbuild/linux-loong64@0.25.6': optional: true @@ -5802,6 +7735,9 @@ snapshots: '@esbuild/linux-mips64el@0.25.1': optional: true + '@esbuild/linux-mips64el@0.25.5': + optional: true + '@esbuild/linux-mips64el@0.25.6': optional: true @@ -5817,6 +7753,9 @@ snapshots: '@esbuild/linux-ppc64@0.25.1': optional: true + '@esbuild/linux-ppc64@0.25.5': + optional: true + '@esbuild/linux-ppc64@0.25.6': optional: true @@ -5832,6 +7771,9 @@ snapshots: '@esbuild/linux-riscv64@0.25.1': optional: true + '@esbuild/linux-riscv64@0.25.5': + optional: true + '@esbuild/linux-riscv64@0.25.6': optional: true @@ -5847,6 +7789,9 @@ snapshots: '@esbuild/linux-s390x@0.25.1': optional: true + '@esbuild/linux-s390x@0.25.5': + optional: true + '@esbuild/linux-s390x@0.25.6': optional: true @@ -5862,6 +7807,9 @@ snapshots: '@esbuild/linux-x64@0.25.1': optional: true + '@esbuild/linux-x64@0.25.5': + optional: true + '@esbuild/linux-x64@0.25.6': optional: true @@ -5871,6 +7819,9 @@ snapshots: '@esbuild/netbsd-arm64@0.25.1': optional: true + '@esbuild/netbsd-arm64@0.25.5': + optional: true + '@esbuild/netbsd-arm64@0.25.6': optional: true @@ -5886,6 +7837,9 @@ snapshots: '@esbuild/netbsd-x64@0.25.1': optional: true + '@esbuild/netbsd-x64@0.25.5': + optional: true + '@esbuild/netbsd-x64@0.25.6': optional: true @@ -5895,6 +7849,9 @@ snapshots: '@esbuild/openbsd-arm64@0.25.1': optional: true + '@esbuild/openbsd-arm64@0.25.5': + optional: true + '@esbuild/openbsd-arm64@0.25.6': optional: true @@ -5910,6 +7867,9 @@ snapshots: '@esbuild/openbsd-x64@0.25.1': optional: true + '@esbuild/openbsd-x64@0.25.5': + optional: true + '@esbuild/openbsd-x64@0.25.6': optional: true @@ -5928,6 +7888,9 @@ snapshots: '@esbuild/sunos-x64@0.25.1': optional: true + '@esbuild/sunos-x64@0.25.5': + optional: true + '@esbuild/sunos-x64@0.25.6': optional: true @@ -5943,6 +7906,9 @@ snapshots: '@esbuild/win32-arm64@0.25.1': optional: true + '@esbuild/win32-arm64@0.25.5': + optional: true + '@esbuild/win32-arm64@0.25.6': optional: true @@ -5958,6 +7924,9 @@ snapshots: '@esbuild/win32-ia32@0.25.1': optional: true + '@esbuild/win32-ia32@0.25.5': + optional: true + '@esbuild/win32-ia32@0.25.6': optional: true @@ -5973,6 +7942,9 @@ snapshots: '@esbuild/win32-x64@0.25.1': optional: true + '@esbuild/win32-x64@0.25.5': + optional: true + '@esbuild/win32-x64@0.25.6': optional: true @@ -5991,7 +7963,7 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -6009,7 +7981,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -6029,6 +8001,8 @@ snapshots: '@eslint/core': 0.15.1 levn: 0.4.1 + '@fastify/busboy@3.1.1': {} + '@gerrit0/mini-shiki@1.27.2': dependencies: '@shikijs/engine-oniguruma': 1.29.2 @@ -6048,6 +8022,8 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} + '@ioredis/commands@1.2.0': {} + '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': @@ -6084,6 +8060,11 @@ snapshots: '@jridgewell/set-array@1.2.1': {} + '@jridgewell/source-map@0.3.10': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/sourcemap-codec@1.5.4': {} @@ -6108,20 +8089,33 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.26.10 + '@babel/runtime': 7.27.6 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.27.6 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 + '@mapbox/node-pre-gyp@2.0.0': + dependencies: + consola: 3.4.2 + detect-libc: 2.0.4 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + 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.16.1)': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -6192,6 +8186,94 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true + '@netlify/binary-info@1.0.0': {} + + '@netlify/blobs@9.1.2': + dependencies: + '@netlify/dev-utils': 2.2.0 + '@netlify/runtime-utils': 1.3.1 + + '@netlify/dev-utils@2.2.0': + dependencies: + '@whatwg-node/server': 0.9.71 + chokidar: 4.0.3 + decache: 4.6.2 + dot-prop: 9.0.0 + env-paths: 3.0.0 + find-up: 7.0.0 + lodash.debounce: 4.0.8 + netlify: 13.3.5 + parse-gitignore: 2.0.0 + uuid: 11.1.0 + write-file-atomic: 6.0.0 + + '@netlify/functions@3.1.10(rollup@4.44.2)': + dependencies: + '@netlify/blobs': 9.1.2 + '@netlify/dev-utils': 2.2.0 + '@netlify/serverless-functions-api': 1.41.2 + '@netlify/zip-it-and-ship-it': 12.2.1(rollup@4.44.2) + cron-parser: 4.9.0 + decache: 4.6.2 + extract-zip: 2.0.1 + is-stream: 4.0.1 + jwt-decode: 4.0.0 + lambda-local: 2.2.0 + read-package-up: 11.0.0 + source-map-support: 0.5.21 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@netlify/open-api@2.37.0': {} + + '@netlify/runtime-utils@1.3.1': {} + + '@netlify/serverless-functions-api@1.41.2': {} + + '@netlify/serverless-functions-api@2.1.3': {} + + '@netlify/zip-it-and-ship-it@12.2.1(rollup@4.44.2)': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@netlify/binary-info': 1.0.0 + '@netlify/serverless-functions-api': 2.1.3 + '@vercel/nft': 0.29.4(rollup@4.44.2) + archiver: 7.0.1 + common-path-prefix: 3.0.0 + copy-file: 11.0.0 + es-module-lexer: 1.7.0 + esbuild: 0.25.5 + execa: 8.0.1 + fast-glob: 3.3.3 + filter-obj: 6.1.0 + find-up: 7.0.0 + is-builtin-module: 3.2.1 + is-path-inside: 4.0.0 + junk: 4.0.1 + locate-path: 7.2.0 + merge-options: 3.0.4 + minimatch: 9.0.5 + normalize-path: 3.0.0 + p-map: 7.0.3 + path-exists: 5.0.0 + precinct: 12.2.0 + require-package-name: 2.0.1 + resolve: 2.0.0-next.5 + semver: 7.7.2 + tmp-promise: 3.0.3 + toml: 3.0.0 + unixify: 1.0.0 + urlpattern-polyfill: 8.0.2 + yargs: 17.7.2 + zod: 3.25.76 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6204,16 +8286,165 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@oozcitak/dom@1.15.10': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/url': 1.0.4 + '@oozcitak/util': 8.3.8 + + '@oozcitak/infra@1.0.8': + dependencies: + '@oozcitak/util': 8.3.8 + + '@oozcitak/url@1.0.4': + dependencies: + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + + '@oozcitak/util@8.3.8': {} + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@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 + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + '@petamoriken/float16@3.9.2': {} '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.7': {} + '@pkgr/core@0.2.7': {} + + '@poppinss/colors@4.1.5': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.4': + dependencies: + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.0.2 + supports-color: 10.0.0 + + '@poppinss/exception@1.2.2': {} + + '@publint/pack@0.1.2': {} + + '@rolldown/pluginutils@1.0.0-beta.19': {} + + '@rollup/plugin-alias@5.1.1(rollup@4.44.2)': + optionalDependencies: + rollup: 4.44.2 + + '@rollup/plugin-commonjs@28.0.6(rollup@4.44.2)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.6(picomatch@4.0.2) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.44.2 + + '@rollup/plugin-inject@5.0.5(rollup@4.44.2)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) + estree-walker: 2.0.2 + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.44.2 + + '@rollup/plugin-json@6.1.0(rollup@4.44.2)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) + optionalDependencies: + rollup: 4.44.2 + + '@rollup/plugin-node-resolve@16.0.1(rollup@4.44.2)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.44.2 - '@publint/pack@0.1.2': {} + '@rollup/plugin-replace@6.0.2(rollup@4.44.2)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.44.2 - '@rolldown/pluginutils@1.0.0-beta.19': {} + '@rollup/plugin-terser@0.4.4(rollup@4.44.2)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.43.1 + optionalDependencies: + rollup: 4.44.2 '@rollup/pluginutils@5.2.0(rollup@4.44.2)': dependencies: @@ -6418,6 +8649,12 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@sindresorhus/is@7.0.2': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@speed-highlight/core@1.2.7': {} + '@standard-schema/spec@1.0.0': {} '@stylistic/eslint-plugin-js@4.4.1(eslint@9.30.1(jiti@2.4.2))': @@ -6509,19 +8746,19 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 - '@tailwindcss/vite@4.1.11(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': + '@tailwindcss/vite@4.1.11(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@tailwindcss/node': 4.1.11 '@tailwindcss/oxide': 4.1.11 tailwindcss: 4.1.11 - vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - '@tanstack/config@0.17.1(@types/node@22.16.1)(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': + '@tanstack/config@0.17.1(@types/node@22.16.1)(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@tanstack/eslint-config': 0.1.0(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@tanstack/publish-config': 0.1.0 '@tanstack/typedoc-config': 0.1.0(typescript@5.8.3) - '@tanstack/vite-config': 0.1.0(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/vite-config': 0.1.0(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -6532,6 +8769,19 @@ snapshots: - typescript - vite + '@tanstack/directive-functions-plugin@1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + '@tanstack/router-utils': 1.121.21 + babel-dead-code-elimination: 1.0.10 + tiny-invariant: 1.3.3 + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + '@tanstack/eslint-config@0.1.0(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint/js': 9.30.1 @@ -6548,6 +8798,8 @@ snapshots: - supports-color - typescript + '@tanstack/history@1.121.34': {} + '@tanstack/publish-config@0.1.0': dependencies: '@commitlint/parse': 19.8.1 @@ -6559,6 +8811,295 @@ snapshots: '@tanstack/query-core@5.81.5': {} + '@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/history': 1.121.34 + '@tanstack/react-store': 0.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.125.4 + isbot: 5.1.28 + jsesc: 3.1.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/react-start-client@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.125.4 + '@tanstack/start-client-core': 1.125.4 + cookie-es: 1.2.2 + jsesc: 3.1.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/react-start-plugin@1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@tanstack/start-plugin-core': 1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitejs/plugin-react': 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + 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/kv' + - aws4fetch + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/react-start-server@1.126.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/history': 1.121.34 + '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.125.4 + '@tanstack/start-client-core': 1.125.4 + '@tanstack/start-server-core': 1.126.1 + h3: 1.13.0 + isbot: 5.1.28 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@tanstack/react-start@1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@tanstack/react-start-client': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-start-plugin': 1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/react-start-server': 1.126.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/start-server-functions-client': 1.125.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/start-server-functions-server': 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitejs/plugin-react': 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@rsbuild/core' + - '@tanstack/react-router' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/react-store@0.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@tanstack/store': 0.7.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + use-sync-external-store: 1.5.0(react@19.1.0) + + '@tanstack/router-core@1.125.4': + dependencies: + '@tanstack/history': 1.121.34 + '@tanstack/store': 0.7.2 + cookie-es: 1.2.2 + jsesc: 3.1.0 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/router-generator@1.125.4': + dependencies: + '@tanstack/router-core': 1.125.4 + '@tanstack/router-utils': 1.121.21 + '@tanstack/virtual-file-routes': 1.121.21 + prettier: 3.6.2 + recast: 0.23.11 + source-map: 0.7.4 + tsx: 4.20.3 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.125.6(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + '@tanstack/router-core': 1.125.4 + '@tanstack/router-generator': 1.125.4 + '@tanstack/router-utils': 1.121.21 + '@tanstack/virtual-file-routes': 1.121.21 + babel-dead-code-elimination: 1.0.10 + chokidar: 3.6.0 + unplugin: 2.3.5 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.121.21': + dependencies: + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) + ansis: 4.1.0 + diff: 8.0.2 + transitivePeerDependencies: + - supports-color + + '@tanstack/server-functions-plugin@1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + '@tanstack/directive-functions-plugin': 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + babel-dead-code-elimination: 1.0.10 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/start-client-core@1.125.4': + dependencies: + '@tanstack/router-core': 1.125.4 + cookie-es: 1.2.2 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/start-plugin-core@1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.28.0 + '@babel/types': 7.28.0 + '@tanstack/router-core': 1.125.4 + '@tanstack/router-generator': 1.125.4 + '@tanstack/router-plugin': 1.125.6(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/router-utils': 1.121.21 + '@tanstack/server-functions-plugin': 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/start-server-core': 1.126.1 + '@types/babel__code-frame': 7.0.6 + '@types/babel__core': 7.20.5 + babel-dead-code-elimination: 1.0.10 + cheerio: 1.1.0 + h3: 1.13.0 + nitropack: 2.11.13(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7)) + pathe: 2.0.3 + ufo: 1.6.1 + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + 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/kv' + - aws4fetch + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - rolldown + - sqlite3 + - supports-color + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + + '@tanstack/start-server-core@1.126.1': + dependencies: + '@tanstack/history': 1.121.34 + '@tanstack/router-core': 1.125.4 + '@tanstack/start-client-core': 1.125.4 + h3: 1.13.0 + isbot: 5.1.28 + jsesc: 3.1.0 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + unctx: 2.4.1 + + '@tanstack/start-server-functions-client@1.125.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@tanstack/server-functions-plugin': 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/start-server-functions-fetcher': 1.125.4 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/start-server-functions-fetcher@1.125.4': + dependencies: + '@tanstack/router-core': 1.125.4 + '@tanstack/start-client-core': 1.125.4 + + '@tanstack/start-server-functions-server@1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@tanstack/server-functions-plugin': 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite + '@tanstack/store@0.7.2': {} '@tanstack/typedoc-config@0.1.0(typescript@5.8.3)': @@ -6569,12 +9110,14 @@ snapshots: transitivePeerDependencies: - typescript - '@tanstack/vite-config@0.1.0(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': + '@tanstack/virtual-file-routes@1.121.21': {} + + '@tanstack/vite-config@0.1.0(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.44.2) - vite-plugin-dts: 4.2.3(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) - vite-plugin-externalize-deps: 0.9.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) - vite-tsconfig-paths: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + vite-plugin-dts: 4.2.3(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + vite-plugin-externalize-deps: 0.9.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + vite-tsconfig-paths: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) transitivePeerDependencies: - '@types/node' - rollup @@ -6622,6 +9165,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.0 @@ -6716,6 +9261,8 @@ snapshots: undici-types: 7.8.0 optional: true + '@types/normalize-package-data@2.4.4': {} + '@types/pg@8.15.4': dependencies: '@types/node': 22.16.1 @@ -6734,6 +9281,8 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/resolve@1.20.2': {} + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 @@ -6745,6 +9294,8 @@ snapshots: '@types/node': 22.16.1 '@types/send': 0.17.5 + '@types/triple-beam@1.3.5': {} + '@types/unist@3.0.3': {} '@types/use-sync-external-store@0.0.6': {} @@ -6752,6 +9303,11 @@ snapshots: '@types/whatwg-mimetype@3.0.2': optional: true + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.16.1 + optional: true + '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -6785,7 +9341,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) '@typescript-eslint/types': 8.36.0 - debug: 4.4.0 + debug: 4.4.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -6818,7 +9374,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) '@typescript-eslint/types': 8.36.0 '@typescript-eslint/visitor-keys': 8.36.0 - debug: 4.4.0 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -6903,7 +9459,26 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.0': optional: true - '@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': + '@vercel/nft@0.29.4(rollup@4.44.2)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.0 + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) + 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.2 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -6911,16 +9486,16 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': + '@vitejs/plugin-vue@5.2.4(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': dependencies: - vite: 7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) vue: 3.5.17(typescript@5.8.3) - '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@istanbuljs/schema': 0.1.3 debug: 4.4.1 @@ -6932,7 +9507,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.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -6944,13 +9519,21 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + + '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -7062,16 +9645,54 @@ snapshots: '@vue/shared@3.5.17': {} + '@whatwg-node/disposablestack@0.0.6': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/fetch@0.10.8': + dependencies: + '@whatwg-node/node-fetch': 0.7.21 + urlpattern-polyfill: 10.1.0 + + '@whatwg-node/node-fetch@0.7.21': + dependencies: + '@fastify/busboy': 3.1.1 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/promise-helpers@1.3.2': + dependencies: + tslib: 2.8.1 + + '@whatwg-node/server@0.9.71': + dependencies: + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.8 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 + 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 negotiator: 0.6.3 + 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 @@ -7127,8 +9748,35 @@ snapshots: ansi-styles@6.2.1: {} + ansis@4.1.0: {} + any-promise@1.3.0: {} + anymatch@3.1.3: + dependencies: + 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 + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -7204,18 +9852,50 @@ snapshots: assertion-error@2.0.1: {} + ast-module-types@6.0.1: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + async-function@1.0.0: {} + async-sema@3.1.1: {} + + async@3.2.6: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 + b4a@1.6.7: {} + + babel-dead-code-elimination@1.0.10: + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + transitivePeerDependencies: + - supports-color + balanced-match@1.0.2: {} + bare-events@2.6.0: + optional: true + + base64-js@1.5.1: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 + 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 @@ -7233,6 +9913,8 @@ snapshots: transitivePeerDependencies: - supports-color + boolbase@1.0.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -7258,8 +9940,19 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) + buffer-crc32@0.2.13: {} + + buffer-crc32@1.0.0: {} + buffer-from@1.1.2: {} + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-modules@3.3.0: {} + bundle-require@5.1.0(esbuild@0.25.0): dependencies: esbuild: 0.25.0 @@ -7267,6 +9960,23 @@ snapshots: bytes@3.1.2: {} + c12@3.0.4(magicast@0.3.5): + dependencies: + chokidar: 4.0.3 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 16.6.1 + exsolve: 1.0.7 + giget: 2.0.0 + jiti: 2.4.2 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.2.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -7291,6 +10001,8 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + callsite@1.0.0: {} + callsites@3.1.0: {} caniuse-lite@1.0.30001727: {} @@ -7319,6 +10031,41 @@ snapshots: check-error@2.1.1: {} + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.1.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.0.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.11.0 + whatwg-mimetype: 4.0.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -7327,6 +10074,10 @@ snapshots: ci-info@3.9.0: {} + citty@0.1.6: + dependencies: + consola: 3.4.2 + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -7336,26 +10087,65 @@ snapshots: slice-ansi: 5.0.0 string-width: 7.2.0 + clipboardy@4.0.0: + dependencies: + execa: 8.0.1 + is-wsl: 3.1.0 + is64bit: 2.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cluster-key-slot@1.1.2: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@3.2.1: + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + colorette@2.0.20: {} + colorspace@1.1.4: + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + + commander@10.0.1: {} + + commander@12.1.0: {} + commander@13.1.0: {} + commander@2.20.3: {} + commander@4.1.1: {} comment-parser@1.4.1: {} + common-path-prefix@3.0.0: {} + + commondir@1.0.1: {} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -7363,6 +10153,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: {} @@ -7379,8 +10179,12 @@ snapshots: confbox@0.1.8: {} + confbox@0.2.2: {} + consola@3.4.0: {} + consola@3.4.2: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -7400,15 +10204,41 @@ snapshots: convert-source-map@2.0.0: {} + cookie-es@1.2.2: {} + + cookie-es@2.0.0: {} + cookie-signature@1.0.6: {} cookie@0.7.1: {} + cookie@1.0.2: {} + + copy-file@11.0.0: + dependencies: + graceful-fs: 4.2.11 + p-event: 6.0.1 + + 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 + + cron-parser@4.9.0: + dependencies: + luxon: 3.7.1 + + croner@9.1.0: {} + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 @@ -7423,6 +10253,20 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + css.escape@1.5.1: {} cssstyle@4.2.1: @@ -7432,6 +10276,8 @@ snapshots: csstype@3.1.3: {} + data-uri-to-buffer@4.0.1: {} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -7457,6 +10303,10 @@ snapshots: dataloader@1.4.0: {} + db0@0.3.2(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7)): + optionalDependencies: + drizzle-orm: 0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7) + de-indent@1.0.2: {} debug@2.6.9: @@ -7476,34 +10326,108 @@ snapshots: dependencies: ms: 2.1.3 + decache@4.6.2: + dependencies: + callsite: 1.0.0 + decimal.js@10.5.0: {} deep-eql@5.0.2: {} deep-is@0.1.4: {} + deepmerge@4.3.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 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 has-property-descriptors: 1.0.2 object-keys: 1.1.1 + 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: {} + detect-libc@2.0.4: {} + detective-amd@6.0.1: + dependencies: + ast-module-types: 6.0.1 + escodegen: 2.1.0 + get-amd-module-type: 6.0.1 + node-source-walk: 7.0.1 + + detective-cjs@6.0.1: + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + + detective-es6@5.0.1: + dependencies: + node-source-walk: 7.0.1 + + detective-postcss@7.0.1(postcss@8.5.6): + dependencies: + is-url: 1.2.4 + postcss: 8.5.6 + postcss-values-parser: 6.0.2(postcss@8.5.6) + + detective-sass@6.0.1: + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + + detective-scss@5.0.1: + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + + detective-stylus@5.0.1: {} + + detective-typescript@14.0.0(typescript@5.8.3): + dependencies: + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + detective-vue2@2.2.0(typescript@5.8.3): + dependencies: + '@dependents/detective-less': 5.0.1 + '@vue/compiler-sfc': 3.5.17 + detective-es6: 5.0.1 + detective-sass: 6.0.1 + detective-scss: 5.0.1 + detective-stylus: 5.0.1 + detective-typescript: 14.0.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + diff@8.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -7516,10 +10440,32 @@ snapshots: dom-accessibility-api@0.6.3: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + dotenv@16.6.1: {} drizzle-kit@0.30.6: @@ -7551,6 +10497,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexer@0.1.2: {} + eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -7563,10 +10511,17 @@ snapshots: emoji-regex@9.2.2: {} + enabled@2.0.0: {} + encodeurl@1.0.2: {} encodeurl@2.0.0: {} + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -7583,10 +10538,14 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: {} + env-paths@3.0.0: {} environment@1.1.0: {} + error-stack-parser-es@1.0.5: {} + es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 @@ -7801,6 +10760,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.1 '@esbuild/win32-x64': 0.25.1 + esbuild@0.25.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 + esbuild@0.25.6: optionalDependencies: '@esbuild/aix-ppc64': 0.25.6 @@ -7836,6 +10823,16 @@ snapshots: escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + eslint-compat-utils@0.5.1(eslint@9.30.1(jiti@2.4.2)): dependencies: eslint: 9.30.1(jiti@2.4.2) @@ -8030,8 +11027,12 @@ snapshots: etag@1.8.1: {} + event-target-shim@5.0.1: {} + eventemitter3@5.0.1: {} + events@3.3.0: {} + execa@1.0.0: dependencies: cross-spawn: 6.0.6 @@ -8092,6 +11093,8 @@ snapshots: transitivePeerDependencies: - supports-color + exsolve@1.0.7: {} + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -8100,10 +11103,22 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + extract-zip@2.0.1: + dependencies: + debug: 4.4.1 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8120,18 +11135,33 @@ snapshots: dependencies: reusify: 1.1.0 + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 + fecha@4.2.3: {} + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + 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 + filter-obj@6.1.0: {} + finalhandler@1.3.1: dependencies: debug: 2.6.9 @@ -8144,6 +11174,8 @@ snapshots: transitivePeerDependencies: - supports-color + find-up-simple@1.0.1: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -8154,6 +11186,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + fix-dts-default-cjs-exports@1.0.1: dependencies: magic-string: 0.30.17 @@ -8167,6 +11205,8 @@ snapshots: flatted@3.3.3: {} + fn.name@1.1.0: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -8176,12 +11216,18 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded@0.2.0: {} fractional-indexing@3.2.0: {} fresh@0.5.2: {} + fresh@2.0.0: {} + fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11 @@ -8230,6 +11276,11 @@ snapshots: gensync@1.0.0-beta.2: {} + get-amd-module-type@6.0.1: + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + get-caller-file@2.0.5: {} get-east-asian-width@1.3.0: {} @@ -8260,6 +11311,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-port-please@3.1.2: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -8269,6 +11322,10 @@ snapshots: dependencies: pump: 3.0.2 + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + get-stream@8.0.1: {} get-symbol-description@1.1.0: @@ -8285,6 +11342,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.6 + nypm: 0.6.0 + pathe: 2.0.3 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -8322,14 +11388,56 @@ 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: {} + gonzales-pe@4.3.0: + dependencies: + minimist: 1.2.8 + gopd@1.2.0: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} + 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.3: + 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.1 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + happy-dom@18.0.1: dependencies: '@types/node': 20.19.5 @@ -8361,12 +11469,25 @@ snapshots: he@1.2.0: {} + hookable@5.5.3: {} + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 html-escaper@2.0.2: {} + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.1 + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -8382,6 +11503,8 @@ snapshots: transitivePeerDependencies: - supports-color + http-shutdown@1.2.2: {} + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 @@ -8389,6 +11512,8 @@ snapshots: transitivePeerDependencies: - supports-color + httpxy@0.1.7: {} + human-id@4.1.1: {} human-signals@5.0.0: {} @@ -8403,6 +11528,8 @@ snapshots: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@7.0.5: {} @@ -8418,6 +11545,8 @@ snapshots: indent-string@4.0.0: {} + index-to-position@1.1.0: {} + inherits@2.0.4: {} internal-slot@1.1.0: @@ -8428,14 +11557,32 @@ snapshots: interpret@1.4.0: {} + ioredis@5.6.1: + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.4.1 + 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 + ipaddr.js@1.9.1: {} + iron-webcrypto@1.2.1: {} + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 get-intrinsic: 1.2.7 + is-arrayish@0.3.2: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -8448,11 +11595,19 @@ snapshots: dependencies: has-bigints: 1.1.0 + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + is-callable@1.2.7: {} is-core-module@2.16.1: @@ -8470,6 +11625,10 @@ snapshots: call-bound: 1.0.3 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: @@ -8495,8 +11654,14 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-map@2.0.3: {} + is-module@1.0.0: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.3 @@ -8506,8 +11671,16 @@ snapshots: is-obj@2.0.0: {} + is-path-inside@4.0.0: {} + + is-plain-obj@2.1.0: {} + is-potential-custom-element-name@1.0.1: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + is-regex@1.2.1: dependencies: call-bound: 1.0.3 @@ -8523,8 +11696,12 @@ snapshots: is-stream@1.1.0: {} + is-stream@2.0.1: {} + is-stream@3.0.0: {} + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.3 @@ -8548,6 +11725,10 @@ snapshots: dependencies: which-typed-array: 1.1.18 + is-url-superb@4.0.0: {} + + is-url@1.2.4: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -8561,8 +11742,24 @@ 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: {} + isbot@5.1.28: {} + isexe@2.0.0: {} isexe@3.1.1: {} @@ -8690,15 +11887,37 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 + junk@4.0.1: {} + + jwt-decode@4.0.0: {} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 + kleur@4.1.5: {} + + klona@2.0.6: {} + + knitwork@1.2.0: {} + kolorist@1.8.0: {} + kuler@2.0.0: {} + kysely@0.28.2: optional: true + lambda-local@2.2.0: + dependencies: + commander: 10.0.1 + dotenv: 16.6.1 + winston: 3.17.0 + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -8772,6 +11991,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.1.2 + h3: 1.15.3 + http-shutdown: 1.2.2 + jiti: 2.4.2 + mlly: 1.7.4 + 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 @@ -8788,6 +12028,12 @@ snapshots: mlly: 1.7.4 pkg-types: 1.3.1 + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.2.0 + quansync: 0.2.8 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -8796,6 +12042,18 @@ snapshots: dependencies: p-locate: 5.0.0 + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.17.21: {} + + lodash.debounce@4.0.8: {} + + lodash.defaults@4.2.0: {} + + lodash.isarguments@3.1.0: {} + lodash.merge@4.6.2: {} lodash.sortby@4.7.0: {} @@ -8812,6 +12070,15 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -8832,6 +12099,8 @@ snapshots: lunr@2.3.9: {} + luxon@3.7.1: {} + lz-string@1.5.0: {} magic-string@0.30.17: @@ -8867,12 +12136,18 @@ snapshots: merge-descriptors@1.0.3: {} + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + merge-stream@2.0.0: {} merge2@1.4.1: {} methods@1.1.2: {} + micro-api-client@3.3.0: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -8880,12 +12155,22 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + mime@1.6.0: {} + mime@3.0.0: {} + + mime@4.0.7: {} + mimic-fn@4.0.0: {} mimic-function@5.0.1: {} @@ -8904,6 +12189,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -8927,6 +12216,11 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + module-definition@6.0.1: + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + mri@1.2.0: {} ms@2.0.0: {} @@ -8949,15 +12243,162 @@ snapshots: natural-compare@1.4.0: {} - negotiator@0.6.3: {} + negotiator@0.6.3: {} + + netlify@13.3.5: + dependencies: + '@netlify/open-api': 2.37.0 + lodash-es: 4.17.21 + micro-api-client: 3.3.0 + node-fetch: 3.3.2 + p-wait-for: 5.0.2 + qs: 6.13.0 + + nice-try@1.0.5: {} + + nitropack@2.11.13(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7)): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@netlify/functions': 3.1.10(rollup@4.44.2) + '@rollup/plugin-alias': 5.1.1(rollup@4.44.2) + '@rollup/plugin-commonjs': 28.0.6(rollup@4.44.2) + '@rollup/plugin-inject': 5.0.5(rollup@4.44.2) + '@rollup/plugin-json': 6.1.0(rollup@4.44.2) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.44.2) + '@rollup/plugin-replace': 6.0.2(rollup@4.44.2) + '@rollup/plugin-terser': 0.4.4(rollup@4.44.2) + '@vercel/nft': 0.29.4(rollup@4.44.2) + archiver: 7.0.1 + c12: 3.0.4(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.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7)) + defu: 6.1.4 + destr: 2.0.5 + dot-prop: 9.0.0 + esbuild: 0.25.6 + 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.3 + hookable: 5.5.3 + httpxy: 0.1.7 + ioredis: 5.6.1 + jiti: 2.4.2 + klona: 2.0.6 + knitwork: 1.2.0 + listhen: 1.9.0 + magic-string: 0.30.17 + magicast: 0.3.5 + mime: 4.0.7 + mlly: 1.7.4 + node-fetch-native: 1.6.6 + node-mock-http: 1.0.1 + ofetch: 1.4.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.2.0 + pretty-bytes: 6.1.1 + radix3: 1.1.2 + rollup: 4.44.2 + rollup-plugin-visualizer: 6.0.3(rollup@4.44.2) + scule: 1.3.0 + semver: 7.7.2 + serve-placeholder: 2.0.2 + serve-static: 2.2.0 + source-map: 0.7.4 + 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.18 + unimport: 5.1.0 + unplugin-utils: 0.2.4 + unstorage: 1.16.0(db0@0.3.2(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.6.1) + untyped: 2.0.0 + unwasm: 0.3.9 + youch: 4.1.0-beta.8 + 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/kv' + - aws4fetch + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - rolldown + - sqlite3 + - supports-color + - uploadthing + + node-addon-api@7.1.1: {} + + node-domexception@1.0.0: {} + + node-fetch-native@1.6.6: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-forge@1.3.1: {} + + node-gyp-build@4.8.4: {} + + node-mock-http@1.0.1: {} + + node-releases@2.0.19: {} + + node-source-walk@7.0.1: + dependencies: + '@babel/parser': 7.28.0 + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 - nice-try@1.0.5: {} + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 - node-fetch@2.7.0: + normalize-path@2.1.1: dependencies: - whatwg-url: 5.0.0 + remove-trailing-separator: 1.1.0 - node-releases@2.0.19: {} + normalize-path@3.0.0: {} npm-run-path@2.0.2: dependencies: @@ -8967,8 +12408,20 @@ snapshots: dependencies: path-key: 4.0.0 + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + nwsapi@2.2.16: {} + nypm@0.6.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.2.0 + tinyexec: 0.3.2 + object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -9005,6 +12458,16 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.6 + ufo: 1.6.1 + + ohash@1.1.6: {} + + ohash@2.0.11: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -9013,6 +12476,10 @@ snapshots: dependencies: wrappy: 1.0.2 + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -9021,6 +12488,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 @@ -9040,6 +12513,10 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -9054,6 +12531,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -9062,10 +12543,22 @@ snapshots: dependencies: p-limit: 3.1.0 + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + p-map@2.1.0: {} + p-map@7.0.3: {} + + p-timeout@6.1.4: {} + p-try@2.2.0: {} + p-wait-for@5.0.2: + dependencies: + p-timeout: 6.1.4 + package-json-from-dist@1.0.1: {} package-manager-detector@0.2.11: @@ -9078,16 +12571,39 @@ snapshots: dependencies: callsites: 3.1.0 + parse-gitignore@2.0.0: {} + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.27.1 + index-to-position: 1.1.0 + type-fest: 4.41.0 + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + parse5@7.2.1: dependencies: entities: 4.5.0 + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parseurl@1.3.3: {} path-browserify@1.0.1: {} path-exists@4.0.0: {} + path-exists@5.0.0: {} + path-key@2.0.1: {} path-key@3.1.1: {} @@ -9105,10 +12621,18 @@ snapshots: path-type@4.0.0: {} + path-type@6.0.0: {} + + pathe@1.1.2: {} + pathe@2.0.3: {} pathval@2.0.0: {} + pend@1.2.0: {} + + perfect-debounce@1.0.0: {} + pg-cloudflare@1.2.7: optional: true @@ -9164,6 +12688,12 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 + pkg-types@2.2.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + possible-typed-array-names@1.1.0: {} postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0): @@ -9175,6 +12705,13 @@ snapshots: tsx: 4.20.3 yaml: 2.8.0 + postcss-values-parser@6.0.2(postcss@8.5.6): + dependencies: + color-name: 1.1.4 + is-url-superb: 4.0.0 + postcss: 8.5.6 + quote-unquote: 1.0.0 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -9193,6 +12730,26 @@ snapshots: postgres@3.4.7: {} + precinct@12.2.0: + dependencies: + '@dependents/detective-less': 5.0.1 + commander: 12.1.0 + detective-amd: 6.0.1 + detective-cjs: 6.0.1 + detective-es6: 5.0.1 + detective-postcss: 7.0.1(postcss@8.5.6) + detective-sass: 6.0.1 + detective-scss: 5.0.1 + detective-stylus: 5.0.1 + detective-typescript: 14.0.0(typescript@5.8.3) + detective-vue2: 2.2.0(typescript@5.8.3) + module-definition: 6.0.1 + node-source-walk: 7.0.1 + postcss: 8.5.6 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -9203,12 +12760,18 @@ snapshots: prettier@3.6.2: {} + pretty-bytes@6.1.1: {} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -9244,6 +12807,14 @@ snapshots: queue-microtask@1.2.3: {} + quote-unquote@1.0.0: {} + + radix3@1.1.2: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + range-parser@1.2.1: {} raw-body@2.5.2: @@ -9253,6 +12824,11 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + react-dom@19.1.0(react@19.1.0): dependencies: react: 19.1.0 @@ -9266,6 +12842,20 @@ snapshots: react@19.1.0: {} + read-package-up@11.0.0: + dependencies: + find-up-simple: 1.0.1 + read-pkg: 9.0.1 + type-fest: 4.41.0 + + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -9273,8 +12863,48 @@ 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 + readdirp@4.1.2: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + rechoir@0.6.2: dependencies: resolve: 1.22.10 @@ -9284,6 +12914,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.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -9306,10 +12942,14 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + remove-trailing-separator@1.1.0: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} + require-package-name@2.0.1: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -9343,6 +12983,15 @@ snapshots: magic-string: 0.30.17 rollup: 4.44.2 + rollup-plugin-visualizer@6.0.3(rollup@4.44.2): + dependencies: + open: 8.4.2 + picomatch: 4.0.2 + source-map: 0.7.4 + yargs: 17.7.2 + optionalDependencies: + rollup: 4.44.2 + rollup@4.34.8: dependencies: '@types/estree': 1.0.6 @@ -9416,6 +13065,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: @@ -9429,6 +13080,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} saxes@6.0.0: @@ -9437,6 +13090,8 @@ snapshots: scheduler@0.26.0: {} + scule@1.3.0: {} + semver@5.7.2: {} semver@6.3.1: {} @@ -9467,6 +13122,30 @@ snapshots: transitivePeerDependencies: - supports-color + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-placeholder@2.0.2: + dependencies: + defu: 6.1.4 + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -9476,6 +13155,15 @@ snapshots: transitivePeerDependencies: - supports-color + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -9568,8 +13256,14 @@ snapshots: transitivePeerDependencies: - supports-color + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + slash@3.0.0: {} + slash@5.1.0: {} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -9580,6 +13274,8 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + smob@1.5.0: {} + sorted-btree@1.8.1: {} source-map-js@1.2.1: {} @@ -9591,6 +13287,8 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.4: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 @@ -9600,18 +13298,43 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-license-ids@3.0.21: {} + split2@4.2.0: {} sprintf-js@1.0.3: {} stable-hash-x@0.2.0: {} + stack-trace@0.0.10: {} + stackback@0.0.2: {} + standard-as-callback@2.1.0: {} + statuses@2.0.1: {} std-env@3.9.0: {} + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.6.0 + string-argv@0.3.2: {} string-width@4.2.3: @@ -9676,6 +13399,14 @@ 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 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -9710,6 +13441,8 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + supports-color@10.0.0: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -9726,10 +13459,18 @@ snapshots: dependencies: '@pkgr/core': 0.2.7 + system-architecture@0.1.0: {} + tailwindcss@4.1.11: {} tapable@2.2.2: {} + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.1 + tar@7.4.3: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -9741,14 +13482,27 @@ snapshots: term-size@2.2.1: {} + terser@5.43.1: + dependencies: + '@jridgewell/source-map': 0.3.10 + 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.6.7 + text-extensions@2.4.0: {} + text-hex@1.0.0: {} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -9759,6 +13513,10 @@ snapshots: through@2.3.8: {} + tiny-invariant@1.3.3: {} + + tiny-warning@1.0.3: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -9785,16 +13543,24 @@ snapshots: dependencies: tldts-core: 6.1.78 + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.3 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 + tmp@0.2.3: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 toidentifier@1.0.1: {} + toml@3.0.0: {} + tough-cookie@5.1.1: dependencies: tldts: 6.1.78 @@ -9811,6 +13577,8 @@ snapshots: tree-kill@1.2.2: {} + triple-beam@1.4.1: {} + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -9868,6 +13636,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@4.41.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -9945,6 +13715,8 @@ snapshots: ufo@1.6.1: {} + ultrahtml@1.6.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.3 @@ -9952,17 +13724,85 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + uncrypto@0.1.3: {} + + unctx@2.4.1: + dependencies: + acorn: 8.15.0 + estree-walker: 3.0.3 + magic-string: 0.30.17 + unplugin: 2.3.5 + undici-types@6.21.0: {} undici-types@7.8.0: optional: true + undici@7.11.0: {} + + unenv@1.10.0: + dependencies: + consola: 3.4.0 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.6 + pathe: 1.1.2 + + unenv@2.0.0-rc.18: + dependencies: + defu: 6.1.4 + exsolve: 1.0.7 + ohash: 2.0.11 + pathe: 2.0.3 + ufo: 1.6.1 + + unicorn-magic@0.1.0: {} + + unicorn-magic@0.3.0: {} + + unimport@5.1.0: + dependencies: + acorn: 8.15.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.1.1 + magic-string: 0.30.17 + mlly: 1.7.4 + pathe: 2.0.3 + picomatch: 4.0.2 + pkg-types: 2.2.0 + scule: 1.3.0 + strip-literal: 3.0.0 + tinyglobby: 0.2.14 + unplugin: 2.3.5 + unplugin-utils: 0.2.4 + universalify@0.1.2: {} universalify@2.0.1: {} + unixify@1.0.0: + dependencies: + normalize-path: 2.1.1 + unpipe@1.0.0: {} + unplugin-utils@0.2.4: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.2 + + unplugin@1.16.1: + dependencies: + acorn: 8.15.0 + webpack-virtual-modules: 0.6.2 + + unplugin@2.3.5: + dependencies: + acorn: 8.15.0 + picomatch: 4.0.2 + webpack-virtual-modules: 0.6.2 + unrs-resolver@1.11.0: dependencies: napi-postinstall: 0.3.0 @@ -9987,31 +13827,83 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.0 '@unrs/resolver-binding-win32-x64-msvc': 1.11.0 + unstorage@1.16.0(db0@0.3.2(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.6.1): + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.3 + lru-cache: 10.4.3 + node-fetch-native: 1.6.6 + ofetch: 1.4.1 + ufo: 1.6.1 + optionalDependencies: + db0: 0.3.2(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7)) + ioredis: 5.6.1 + + 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.4.2 + knitwork: 1.2.0 + scule: 1.3.0 + + unwasm@0.3.9: + dependencies: + knitwork: 1.2.0 + magic-string: 0.30.17 + mlly: 1.7.4 + pathe: 1.1.2 + pkg-types: 1.3.1 + unplugin: 1.16.1 + update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: browserslist: 4.25.1 escalade: 3.2.0 picocolors: 1.1.1 + uqr@0.1.2: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 + urlpattern-polyfill@10.1.0: {} + + urlpattern-polyfill@8.0.2: {} + use-sync-external-store@1.5.0(react@19.1.0): dependencies: react: 19.1.0 + util-deprecate@1.0.2: {} + utils-merge@1.0.1: {} + uuid@11.1.0: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + vary@1.1.2: {} - vite-node@3.2.4(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -10026,13 +13918,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -10047,7 +13939,7 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.2.3(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-dts@4.2.3(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@22.16.1) '@rollup/pluginutils': 5.2.0(rollup@4.44.2) @@ -10060,28 +13952,28 @@ snapshots: magic-string: 0.30.17 typescript: 5.8.3 optionalDependencies: - vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-externalize-deps@0.9.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): dependencies: - vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.6 fdir: 6.4.6(picomatch@4.0.2) @@ -10094,10 +13986,11 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 + terser: 5.43.1 tsx: 4.20.3 yaml: 2.8.0 - vite@6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vite@6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.6 fdir: 6.4.6(picomatch@4.0.2) @@ -10110,10 +14003,11 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 + terser: 5.43.1 tsx: 4.20.3 yaml: 2.8.0 - vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.6 fdir: 6.4.6(picomatch@4.0.2) @@ -10126,14 +14020,15 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 + terser: 5.43.1 tsx: 4.20.3 yaml: 2.8.0 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.1)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.1)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -10151,8 +14046,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -10173,11 +14068,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -10195,8 +14090,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.20.3)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -10246,12 +14141,16 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} webidl-conversions@7.0.0: {} + webpack-virtual-modules@0.6.2: {} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -10334,6 +14233,26 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.17.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -10356,10 +14275,22 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@6.0.0: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + ws@8.18.0: {} xml-name-validator@5.0.0: {} + xmlbuilder2@3.1.1: + dependencies: + '@oozcitak/dom': 1.15.10 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + js-yaml: 3.14.1 + xmlchars@2.2.0: {} xtend@4.0.2: {} @@ -10386,6 +14317,32 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + yocto-queue@0.1.0: {} + yocto-queue@1.2.1: {} + + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.2 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.8: + 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 + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 + zod@3.25.76: {} From 5461a06c9bf06b44174ca05c245a19b9ecc20a6c Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Thu, 10 Jul 2025 16:11:34 -0600 Subject: [PATCH 03/25] remove --- .github/workflows/pr.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 2294e32b1..9440df60c 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -57,15 +57,3 @@ jobs: repo-token: "${{ secrets.GITHUB_TOKEN }}" pattern: "./packages/react-db/dist/**/*.{js,mjs}" comment-key: "react-db-package-size" - build-example: - name: Build Example Site - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4.2.2 - - name: Setup Tools - uses: tanstack/config/.github/setup@main - - name: Build Example Site - run: | - cd examples/react/todo - pnpm build From 20993ce00824e799c96d01b34bc68915de7801f6 Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Thu, 10 Jul 2025 16:13:19 -0600 Subject: [PATCH 04/25] prettier --- examples/react/todo/src/styles.css | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/react/todo/src/styles.css b/examples/react/todo/src/styles.css index 870aa4650..80cb92ada 100644 --- a/examples/react/todo/src/styles.css +++ b/examples/react/todo/src/styles.css @@ -13,4 +13,3 @@ code { font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } - From 92b5bda09a6ac08b0e9152be61a08db431cbecd3 Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Thu, 10 Jul 2025 16:17:40 -0600 Subject: [PATCH 05/25] Add not found --- examples/react/todo/app.config.ts | 3 -- .../react/todo/src/components/NotFound.tsx | 38 +++++++++++++++++++ examples/react/todo/src/router.tsx | 2 + 3 files changed, 40 insertions(+), 3 deletions(-) delete mode 100644 examples/react/todo/app.config.ts create mode 100644 examples/react/todo/src/components/NotFound.tsx diff --git a/examples/react/todo/app.config.ts b/examples/react/todo/app.config.ts deleted file mode 100644 index 94fd0245c..000000000 --- a/examples/react/todo/app.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { defineConfig } from "@tanstack/react-start/config" - -export default defineConfig({}) diff --git a/examples/react/todo/src/components/NotFound.tsx b/examples/react/todo/src/components/NotFound.tsx new file mode 100644 index 000000000..fe05cd827 --- /dev/null +++ b/examples/react/todo/src/components/NotFound.tsx @@ -0,0 +1,38 @@ +import { Link } from "@tanstack/react-router" + +export function NotFound() { + return ( +
+
+
404
+

+ Page Not Found +

+

+ The page you're looking for doesn't exist or has been moved. +

+ +
+ + + + +
+ + + + + + +
+
+
+
+ ) +} diff --git a/examples/react/todo/src/router.tsx b/examples/react/todo/src/router.tsx index a32f135f4..3dd715f8c 100644 --- a/examples/react/todo/src/router.tsx +++ b/examples/react/todo/src/router.tsx @@ -2,6 +2,7 @@ import { createRouter as createTanstackRouter } from "@tanstack/react-router" // Import the generated route tree import { routeTree } from "./routeTree.gen" +import { NotFound } from "./components/NotFound" import "./styles.css" @@ -11,6 +12,7 @@ export const createRouter = () => { routeTree, scrollRestoration: true, defaultPreloadStaleTime: 0, + defaultNotFoundComponent: NotFound, }) return router From f07fd9fa2b8a83d486a591f9d657d366157eeb44 Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Thu, 10 Jul 2025 16:25:05 -0600 Subject: [PATCH 06/25] prettier --- .gitignore | 6 + .prettierignore | 1 + docs/config.json | 4 +- docs/framework/react/adapter.md | 1 - docs/framework/solid/adapter.md | 5 +- docs/framework/svelte/adapter.md | 5 +- docs/framework/vue/adapter.md | 5 +- docs/overview.md | 250 +- pnpm-lock.yaml | 14339 +++++++++++++++++++---------- 9 files changed, 9567 insertions(+), 5049 deletions(-) diff --git a/.gitignore b/.gitignore index 3259c8956..528e53f21 100644 --- a/.gitignore +++ b/.gitignore @@ -145,3 +145,9 @@ dev-debug.log # Task files tasks.json tasks/ + +## Tanstack Start +.nitro +.output +.tanstack +.claude diff --git a/.prettierignore b/.prettierignore index 244bfdf59..9a9a6363b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,3 +6,4 @@ **/docs **/snap pnpm-lock.yaml +**/routeTree.gen.ts diff --git a/docs/config.json b/docs/config.json index 136aadea4..e41b8bca5 100644 --- a/docs/config.json +++ b/docs/config.json @@ -45,9 +45,7 @@ }, { "label": "Guides", - "children": [ - - ] + "children": [] }, { "label": "API Reference", diff --git a/docs/framework/react/adapter.md b/docs/framework/react/adapter.md index 8923cef24..7a3b17c60 100644 --- a/docs/framework/react/adapter.md +++ b/docs/framework/react/adapter.md @@ -14,4 +14,3 @@ npm install @tanstack/react-db See the [React Functions Reference](../reference/index.md) to see the full list of hooks available in the React Adapter. ## Basic Usage - diff --git a/docs/framework/solid/adapter.md b/docs/framework/solid/adapter.md index 780f781ca..c5cde978a 100644 --- a/docs/framework/solid/adapter.md +++ b/docs/framework/solid/adapter.md @@ -1,8 +1,5 @@ --- title: TanStack DB Solid Adapter ref: docs/framework/react/adapter.md -replace: { - "React": "Solid", - "react": "solid" -} +replace: { "React": "Solid", "react": "solid" } --- diff --git a/docs/framework/svelte/adapter.md b/docs/framework/svelte/adapter.md index 70eeff0eb..079ec6d9b 100644 --- a/docs/framework/svelte/adapter.md +++ b/docs/framework/svelte/adapter.md @@ -1,8 +1,5 @@ --- title: TanStack DB Svelte Adapter ref: docs/framework/react/adapter.md -replace: { - "React": "Svelte", - "react": "svelte" -} +replace: { "React": "Svelte", "react": "svelte" } --- diff --git a/docs/framework/vue/adapter.md b/docs/framework/vue/adapter.md index 5055d06ce..533fc7a2e 100644 --- a/docs/framework/vue/adapter.md +++ b/docs/framework/vue/adapter.md @@ -1,8 +1,5 @@ --- title: TanStack DB Vue Adapter ref: docs/framework/react/adapter.md -replace: { - "React": "Vue", - "react": "vue" -} +replace: { "React": "Vue", "react": "vue" } --- diff --git a/docs/overview.md b/docs/overview.md index 7e1b9c63b..93bc37e2b 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -28,15 +28,13 @@ TanStack DB works by: // Define collections to load data into const todoCollection = createCollection({ // ...your config - onUpdate: updateMutationFn + onUpdate: updateMutationFn, }) const Todos = () => { // Bind data using live queries const { data: todos } = useLiveQuery((q) => - q - .from({ todo: todoCollection }) - .where(({ todo }) => todo.completed) + q.from({ todo: todoCollection }).where(({ todo }) => todo.completed) ) const complete = (todo) => { @@ -48,11 +46,11 @@ const Todos = () => { return (
    - {todos.map(todo => -
  • complete(todo) }> - { todo.text } + {todos.map((todo) => ( +
  • complete(todo)}> + {todo.text}
  • - )} + ))}
) } @@ -75,14 +73,14 @@ Once you have your data in collections, you can query across them using live que Live queries are used to query data out of collections. Live queries are reactive: when the underlying data changes in a way that would affect the query result, the result is incrementally updated and returned from the query, triggering a re-render. -TanStack DB live queries are implemented using [d2ts](https://github.com/electric-sql/d2ts), a Typescript implementation of differential dataflow. This allows the query results to update *incrementally* (rather than by re-running the whole query). This makes them blazing fast, usually sub-millisecond, even for highly complex queries. +TanStack DB live queries are implemented using [d2ts](https://github.com/electric-sql/d2ts), a Typescript implementation of differential dataflow. This allows the query results to update _incrementally_ (rather than by re-running the whole query). This makes them blazing fast, usually sub-millisecond, even for highly complex queries. Live queries support joins across collections. This allows you to: 1. load normalised data into collections and then de-normalise it through queries; simplifying your backend by avoiding the need for bespoke API endpoints that match your client 2. join data from multiple sources; for example, syncing some data out of a database, fetching some other data from an external API and then joining these into a unified data model for your front-end code -Every query returns another collection which can *also* be queried. +Every query returns another collection which can _also_ be queried. ### Making optimistic mutations @@ -94,7 +92,7 @@ const todoCollection = createCollection({ id: "todos", // ... other config onUpdate: async ({ transaction }) => { - const {original, changes} = transaction.mutations[0] + const { original, changes } = transaction.mutations[0] await api.todos.update(original.id, changes) }, }) @@ -113,7 +111,7 @@ If the handler throws an error, the optimistic state is rolled back. ### Explicit transactions -Mutations are based on a `Transaction` primitive. +Mutations are based on a `Transaction` primitive. For simple state changes, directly mutating the collection and persisting with the operator handlers is enough. @@ -122,7 +120,7 @@ But for more complex use cases, you can directly create custom actions with `cre For example, in the following code, the mutationFn first sends the write to the server using `await api.todos.update(updatedTodo)` and then calls `await collection.refetch()` to trigger a re-fetch of the collection contents using TanStack Query. When this second await resolves, the collection is up-to-date with the latest changes and the optimistic state is safely discarded. ```ts -const updateTodo = createOptimisticAction<{id: string}>({ +const updateTodo = createOptimisticAction<{ id: string }>({ onMutate, mutationFn: async ({ transaction }) => { const { collection, modified: updatedTodo } = transaction.mutations[0] @@ -172,18 +170,19 @@ The collection will use the schema to do client-side validation of optimistic mu The collection will use the schema for its type so if you provide a schema, you can't also pass in an explicit type (e.g. `createCollection()`). - #### `QueryCollection` [TanStack Query](https://tanstack.com/query) fetches data using managed queries. Use `queryCollectionOptions` to fetch data into a collection using TanStack Query: ```ts -const todoCollection = createCollection(queryCollectionOptions({ - queryKey: ['todoItems'], - queryFn: async () => fetch('/api/todos'), - getKey: (item) => item.id, - schema: todoSchema // any standard schema -})) +const todoCollection = createCollection( + queryCollectionOptions({ + queryKey: ["todoItems"], + queryFn: async () => fetch("/api/todos"), + getKey: (item) => item.id, + schema: todoSchema, // any standard schema + }) +) ``` The collection will be populated with the query results. @@ -195,20 +194,22 @@ The collection will be populated with the query results. Electric's main primitive for sync is a [Shape](https://electric-sql.com/docs/guides/shapes). Use `electricCollectionOptions` to sync a shape into a collection: ```ts -import { createCollection } from '@tanstack/react-db' -import { electricCollectionOptions } from '@tanstack/db-collections' - -export const todoCollection = createCollection(electricCollectionOptions({ - id: 'todos', - shapeOptions: { - url: 'https://example.com/v1/shape', - params: { - table: 'todos' - } - }, - getKey: (item) => item.id, - schema: todoSchema -})) +import { createCollection } from "@tanstack/react-db" +import { electricCollectionOptions } from "@tanstack/db-collections" + +export const todoCollection = createCollection( + electricCollectionOptions({ + id: "todos", + shapeOptions: { + url: "https://example.com/v1/shape", + params: { + table: "todos", + }, + }, + getKey: (item) => item.id, + schema: todoSchema, + }) +) ``` The Electric collection requires two Electric-specific options: @@ -223,22 +224,24 @@ When you create the collection, sync starts automatically. Electric shapes allow you to filter data using where clauses: ```ts -export const myPendingTodos = createCollection(electricCollectionOptions({ - id: 'todos', - shapeOptions: { - url: 'https://example.com/v1/shape', - params: { - table: 'todos', - where: ` +export const myPendingTodos = createCollection( + electricCollectionOptions({ + id: "todos", + shapeOptions: { + url: "https://example.com/v1/shape", + params: { + table: "todos", + where: ` status = 'pending' AND user_id = '${user.id}' - ` - } - }, - getKey: (item) => item.id, - schema: todoSchema -})) + `, + }, + }, + getKey: (item) => item.id, + schema: todoSchema, + }) +) ``` > [!TIP] @@ -257,15 +260,17 @@ localStorage collections store small amounts of local-only state that persists a Use `localStorageCollectionOptions` to create a collection that stores data in localStorage: ```ts -import { createCollection } from '@tanstack/react-db' -import { localStorageCollectionOptions } from '@tanstack/db-collections' - -export const userPreferencesCollection = createCollection(localStorageCollectionOptions({ - id: 'user-preferences', - storageKey: 'app-user-prefs', // localStorage key - getKey: (item) => item.id, - schema: userPrefsSchema -})) +import { createCollection } from "@tanstack/react-db" +import { localStorageCollectionOptions } from "@tanstack/db-collections" + +export const userPreferencesCollection = createCollection( + localStorageCollectionOptions({ + id: "user-preferences", + storageKey: "app-user-prefs", // localStorage key + getKey: (item) => item.id, + schema: userPrefsSchema, + }) +) ``` The localStorage collection requires: @@ -276,12 +281,14 @@ The localStorage collection requires: Mutation handlers (`onInsert`, `onUpdate`, `onDelete`) are completely optional. Data will persist to localStorage whether or not you provide handlers. You can provide alternative storage backends like `sessionStorage` or custom implementations that match the localStorage API. ```ts -export const sessionCollection = createCollection(localStorageCollectionOptions({ - id: 'session-data', - storageKey: 'session-key', - storage: sessionStorage, // Use sessionStorage instead - getKey: (item) => item.id -})) +export const sessionCollection = createCollection( + localStorageCollectionOptions({ + id: "session-data", + storageKey: "session-key", + storage: sessionStorage, // Use sessionStorage instead + getKey: (item) => item.id, + }) +) ``` > [!TIP] @@ -294,19 +301,21 @@ LocalOnly collections are designed for in-memory client data or UI state that do Use `localOnlyCollectionOptions` to create a collection that stores data only in memory: ```ts -import { createCollection } from '@tanstack/react-db' -import { localOnlyCollectionOptions } from '@tanstack/db-collections' - -export const uiStateCollection = createCollection(localOnlyCollectionOptions({ - id: 'ui-state', - getKey: (item) => item.id, - schema: uiStateSchema, - // Optional initial data to populate the collection - initialData: [ - { id: 'sidebar', isOpen: false }, - { id: 'theme', mode: 'light' } - ] -})) +import { createCollection } from "@tanstack/react-db" +import { localOnlyCollectionOptions } from "@tanstack/db-collections" + +export const uiStateCollection = createCollection( + localOnlyCollectionOptions({ + id: "ui-state", + getKey: (item) => item.id, + schema: uiStateSchema, + // Optional initial data to populate the collection + initialData: [ + { id: "sidebar", isOpen: false }, + { id: "theme", mode: "light" }, + ], + }) +) ``` The LocalOnly collection requires: @@ -321,19 +330,21 @@ Optional configuration: Mutation handlers are completely optional. When provided, they are called before the optimistic state is confirmed. The collection automatically manages the transition from optimistic to confirmed state internally. ```ts -export const tempDataCollection = createCollection(localOnlyCollectionOptions({ - id: 'temp-data', - getKey: (item) => item.id, - onInsert: async ({ transaction }) => { - // Custom logic before confirming the insert - console.log('Inserting:', transaction.mutations[0].modified) - }, - onUpdate: async ({ transaction }) => { - // Custom logic before confirming the update - const { original, modified } = transaction.mutations[0] - console.log('Updating from', original, 'to', modified) - } -})) +export const tempDataCollection = createCollection( + localOnlyCollectionOptions({ + id: "temp-data", + getKey: (item) => item.id, + onInsert: async ({ transaction }) => { + // Custom logic before confirming the insert + console.log("Inserting:", transaction.mutations[0].modified) + }, + onUpdate: async ({ transaction }) => { + // Custom logic before confirming the update + const { original, modified } = transaction.mutations[0] + console.log("Updating from", original, "to", modified) + }, + }) +) ``` > [!TIP] @@ -357,9 +368,7 @@ const todoCollection = createCollection({ const completedTodoCollection = createLiveQueryCollection({ startSync: true, query: (q) => - q - .from({ todo: todoCollection }) - .where(({ todo }) => todo.completed) + q.from({ todo: todoCollection }).where(({ todo }) => todo.completed), }) ``` @@ -434,8 +443,9 @@ import { createLiveQueryCollection, eq } from "@tanstack/db" const completedTodos = createLiveQueryCollection({ startSync: true, query: (q) => - q.from({ todo: todoCollection }) - .where(({ todo }) => eq(todo.completed, true)) + q + .from({ todo: todoCollection }) + .where(({ todo }) => eq(todo.completed, true)), }) const results = completedTodos.toArray @@ -462,7 +472,7 @@ Mutators are created with a `mutationFn`. You can define a single, generic `muta The `mutationFn` is responsible for handling the local changes and processing them, usually to send them to a server or database to be stored, e.g.: ```tsx -import type { MutationFn } from '@tanstack/react-db' +import type { MutationFn } from "@tanstack/react-db" const mutationFn: MutationFn = async ({ transaction }) => { const response = await api.todos.create(transaction.mutations) @@ -486,7 +496,7 @@ const mutationFn: MutationFn = async ({ transaction }) => { Use `createOptimisticAction` with your `mutationFn` and `onMutate` functions to create an action that you can use to mutate data in your components in fully custom ways: ```tsx -import { createOptimisticAction } from '@tanstack/react-db' +import { createOptimisticAction } from "@tanstack/react-db" // Create the `addTodo` action, passing in your `mutationFn` and `onMutate`. const addTodo = createOptimisticAction({ @@ -495,26 +505,26 @@ const addTodo = createOptimisticAction({ todoCollection.insert({ id: uuid(), text, - completed: false + completed: false, }) }, mutationFn: async (text) => { // Persist the todo to your backend - const response = await fetch('/api/todos', { - method: 'POST', + const response = await fetch("/api/todos", { + method: "POST", body: JSON.stringify({ text, completed: false }), }) return response.json() - } + }, }) const Todo = () => { const handleClick = () => { // Triggers the onMutate and then the mutationFn - addTodo('🔥 Make app faster') + addTodo("🔥 Make app faster") } - return + + + + + + ) +} + +const PiPPanel: Component<{ + children: JSX.Element +}> = (props) => { + const pip = usePiPWindow() + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const getPanelDynamicStyles = () => { + const { colors } = tokens + const t = (light: string, dark: string) => + theme() === 'dark' ? dark : light + if (panelWidth() < secondBreakpoint) { + return css` + flex-direction: column; + background-color: ${t(colors.gray[300], colors.gray[600])}; + ` + } + return css` + flex-direction: row; + background-color: ${t(colors.gray[200], colors.darkGray[900])}; + ` + } + + createEffect(() => { + const win = pip().pipWindow + const resizeCB = () => { + if (!win) return + setPanelWidth(win.innerWidth) + } + if (win) { + win.addEventListener('resize', resizeCB) + resizeCB() + } + + onCleanup(() => { + if (win) { + win.removeEventListener('resize', resizeCB) + } + }) + }) + + return ( +
+ {props.children} +
+ ) +} + +export const ParentPanel: Component<{ + children: JSX.Element +}> = (props) => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + let panelRef!: HTMLDivElement + + onMount(() => { + createResizeObserver(panelRef, ({ width }, el) => { + if (el === panelRef) { + setPanelWidth(width) + } + }) + }) + + const getPanelDynamicStyles = () => { + const { colors } = tokens + const t = (light: string, dark: string) => + theme() === 'dark' ? dark : light + if (panelWidth() < secondBreakpoint) { + return css` + flex-direction: column; + background-color: ${t(colors.gray[300], colors.gray[600])}; + ` + } + return css` + flex-direction: row; + background-color: ${t(colors.gray[200], colors.darkGray[900])}; + ` + } + + return ( +
+ {props.children} +
+ ) +} + +const DraggablePanel: Component = (props) => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const [isResizing, setIsResizing] = createSignal(false) + + const position = createMemo( + () => + (props.localStore.position || + useQueryDevtoolsContext().position || + POSITION) as DevtoolsPosition, + ) + + const handleDragStart: JSX.EventHandler = ( + event, + ) => { + const panelElement = event.currentTarget.parentElement + if (!panelElement) return + setIsResizing(true) + const { height, width } = panelElement.getBoundingClientRect() + const startX = event.clientX + const startY = event.clientY + let newSize = 0 + const minHeight = convertRemToPixels(3.5) + const minWidth = convertRemToPixels(12) + const runDrag = (moveEvent: MouseEvent) => { + moveEvent.preventDefault() + + if (position() === 'left' || position() === 'right') { + const valToAdd = + position() === 'right' + ? startX - moveEvent.clientX + : moveEvent.clientX - startX + newSize = Math.round(width + valToAdd) + if (newSize < minWidth) { + newSize = minWidth + } + props.setLocalStore('width', String(Math.round(newSize))) + + const newWidth = panelElement.getBoundingClientRect().width + // If the panel size didn't decrease, this means we have reached the minimum width + // of the panel so we restore the original width in local storage + // Restoring the width helps in smooth open/close transitions + if (Number(props.localStore.width) < newWidth) { + props.setLocalStore('width', String(newWidth)) + } + } else { + const valToAdd = + position() === 'bottom' + ? startY - moveEvent.clientY + : moveEvent.clientY - startY + newSize = Math.round(height + valToAdd) + // If the panel size is less than the minimum height, + // we set the size to the minimum height + if (newSize < minHeight) { + newSize = minHeight + setSelectedQueryHash(null) + } + props.setLocalStore('height', String(Math.round(newSize))) + } + } + + const unsubscribe = () => { + if (isResizing()) { + setIsResizing(false) + } + document.removeEventListener('mousemove', runDrag, false) + document.removeEventListener('mouseUp', unsubscribe, false) + } + + document.addEventListener('mousemove', runDrag, false) + document.addEventListener('mouseup', unsubscribe, false) + } + + let panelRef!: HTMLDivElement + + onMount(() => { + createResizeObserver(panelRef, ({ width }, el) => { + if (el === panelRef) { + setPanelWidth(width) + } + }) + }) + + createEffect(() => { + const rootContainer = panelRef.parentElement?.parentElement?.parentElement + if (!rootContainer) return + const currentPosition = (props.localStore.position || + POSITION) as DevtoolsPosition + const styleProp = getSidedProp('padding', currentPosition) + const isVertical = + props.localStore.position === 'left' || + props.localStore.position === 'right' + const previousPaddings = (({ + padding, + paddingTop, + paddingBottom, + paddingLeft, + paddingRight, + }) => ({ + padding, + paddingTop, + paddingBottom, + paddingLeft, + paddingRight, + }))(rootContainer.style) + + rootContainer.style[styleProp] = `${ + isVertical ? props.localStore.width : props.localStore.height + }px` + + onCleanup(() => { + Object.entries(previousPaddings).forEach(([property, previousValue]) => { + rootContainer.style[property as keyof typeof previousPaddings] = + previousValue + }) + }) + }) + + const getPanelDynamicStyles = () => { + const { colors } = tokens + const t = (light: string, dark: string) => + theme() === 'dark' ? dark : light + if (panelWidth() < secondBreakpoint) { + return css` + flex-direction: column; + background-color: ${t(colors.gray[300], colors.gray[600])}; + ` + } + return css` + flex-direction: row; + background-color: ${t(colors.gray[200], colors.darkGray[900])}; + ` + } + + return ( + + ) +} + +export const ContentView: Component = (props) => { + setupQueryCacheSubscription() + setupMutationCacheSubscription() + let containerRef!: HTMLDivElement + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const pip = usePiPWindow() + + const [selectedView, setSelectedView] = createSignal<'queries' | 'mutations'>( + 'queries', + ) + + const sort = createMemo(() => props.localStore.sort || DEFAULT_SORT_FN_NAME) + const sortOrder = createMemo( + () => Number(props.localStore.sortOrder) || DEFAULT_SORT_ORDER, + ) as () => 1 | -1 + + const mutationSort = createMemo( + () => props.localStore.mutationSort || DEFAULT_MUTATION_SORT_FN_NAME, + ) + const mutationSortOrder = createMemo( + () => Number(props.localStore.mutationSortOrder) || DEFAULT_SORT_ORDER, + ) as () => 1 | -1 + + const sortFn = createMemo(() => sortFns[sort() as string]) + const mutationSortFn = createMemo( + () => mutationSortFns[mutationSort() as string], + ) + + const onlineManager = createMemo( + () => useQueryDevtoolsContext().onlineManager, + ) + + const query_cache = createMemo(() => { + return useQueryDevtoolsContext().client.getQueryCache() + }) + + const mutation_cache = createMemo(() => { + return useQueryDevtoolsContext().client.getMutationCache() + }) + + const queryCount = createSubscribeToQueryCacheBatcher((queryCache) => { + return queryCache().getAll().length + }, false) + + const queries = createMemo( + on( + () => [queryCount(), props.localStore.filter, sort(), sortOrder()], + () => { + const curr = query_cache().getAll() + + const filtered = props.localStore.filter + ? curr.filter( + (item) => + rankItem(item.queryHash, props.localStore.filter || '').passed, + ) + : [...curr] + + const sorted = sortFn() + ? filtered.sort((a, b) => sortFn()!(a, b) * sortOrder()) + : filtered + return sorted + }, + ), + ) + + const mutationCount = createSubscribeToMutationCacheBatcher( + (mutationCache) => { + return mutationCache().getAll().length + }, + false, + ) + + const mutations = createMemo( + on( + () => [ + mutationCount(), + props.localStore.mutationFilter, + mutationSort(), + mutationSortOrder(), + ], + () => { + const curr = mutation_cache().getAll() + + const filtered = props.localStore.mutationFilter + ? curr.filter((item) => { + const value = `${ + item.options.mutationKey + ? JSON.stringify(item.options.mutationKey) + ' - ' + : '' + }${new Date(item.state.submittedAt).toLocaleString()}` + return rankItem(value, props.localStore.mutationFilter || '') + .passed + }) + : [...curr] + + const sorted = mutationSortFn() + ? filtered.sort( + (a, b) => mutationSortFn()!(a, b) * mutationSortOrder(), + ) + : filtered + return sorted + }, + ), + ) + + const setDevtoolsPosition = (pos: DevtoolsPosition) => { + props.setLocalStore('position', pos) + } + + // Sets the Font Size variable on portal menu elements since they will be outside + // the main panel container + const setComputedVariables = (el: HTMLDivElement) => { + const computedStyle = getComputedStyle(containerRef) + const variable = computedStyle.getPropertyValue('--tsqd-font-size') + el.style.setProperty('--tsqd-font-size', variable) + } + return ( + <> +
+
+
+ + { + setSelectedView(value as 'queries' | 'mutations') + setSelectedQueryHash(null) + setSelectedMutationId(null) + }} + > + + + + + + + Queries + + + + + + + + + Mutations + + + +
+ + + + + + + +
+
+
+
+ + { + if (selectedView() === 'queries') { + props.setLocalStore('filter', e.currentTarget.value) + } else { + props.setLocalStore('mutationFilter', e.currentTarget.value) + } + }} + class={cx('tsqd-query-filter-textfield')} + name="tsqd-query-filter-input" + value={ + selectedView() === 'queries' + ? props.localStore.filter || '' + : props.localStore.mutationFilter || '' + } + /> +
+
+ + + + + + + +
+ +
+ +
+ + + + + + + + + + + setComputedVariables(el as HTMLDivElement)} + mount={ + pip().pipWindow + ? pip().pipWindow!.document.body + : document.body + } + > + +
+ Settings +
+ + + + Position + + + setComputedVariables(el as HTMLDivElement)} + mount={ + pip().pipWindow + ? pip().pipWindow!.document.body + : document.body + } + > + + { + setDevtoolsPosition('top') + }} + as="button" + class={cx( + styles().settingsSubButton, + 'tsqd-settings-menu-position-btn', + 'tsqd-settings-menu-position-btn-top', + )} + > + Top + + + { + setDevtoolsPosition('bottom') + }} + as="button" + class={cx( + styles().settingsSubButton, + 'tsqd-settings-menu-position-btn', + 'tsqd-settings-menu-position-btn-bottom', + )} + > + Bottom + + + { + setDevtoolsPosition('left') + }} + as="button" + class={cx( + styles().settingsSubButton, + 'tsqd-settings-menu-position-btn', + 'tsqd-settings-menu-position-btn-left', + )} + > + Left + + + { + setDevtoolsPosition('right') + }} + as="button" + class={cx( + styles().settingsSubButton, + 'tsqd-settings-menu-position-btn', + 'tsqd-settings-menu-position-btn-right', + )} + > + Right + + + + + + + + + Theme + + + setComputedVariables(el as HTMLDivElement)} + mount={ + pip().pipWindow + ? pip().pipWindow!.document.body + : document.body + } + > + + { + props.setLocalStore('theme_preference', 'light') + }} + as="button" + class={cx( + styles().settingsSubButton, + props.localStore.theme_preference === 'light' && + styles().themeSelectedButton, + 'tsqd-settings-menu-position-btn', + 'tsqd-settings-menu-position-btn-top', + )} + > + Light + + + { + props.setLocalStore('theme_preference', 'dark') + }} + as="button" + class={cx( + styles().settingsSubButton, + props.localStore.theme_preference === 'dark' && + styles().themeSelectedButton, + 'tsqd-settings-menu-position-btn', + 'tsqd-settings-menu-position-btn-bottom', + )} + > + Dark + + + { + props.setLocalStore('theme_preference', 'system') + }} + as="button" + class={cx( + styles().settingsSubButton, + props.localStore.theme_preference === 'system' && + styles().themeSelectedButton, + 'tsqd-settings-menu-position-btn', + 'tsqd-settings-menu-position-btn-left', + )} + > + System + + + + + +
+
+
+
+
+ +
+
+ q.queryHash} each={queries()}> + {(query) => } + +
+
+
+ +
+
+ m.mutationId} each={mutations()}> + {(mutation) => } + +
+
+
+
+ + + + + + + + + ) +} + +const QueryRow: Component<{ query: Query }> = (props) => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const { colors, alpha } = tokens + const t = (light: string, dark: string) => (theme() === 'dark' ? dark : light) + + const queryState = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache().find({ + queryKey: props.query.queryKey, + })?.state, + true, + (e) => e.query.queryHash === props.query.queryHash, + ) + + const isDisabled = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .find({ + queryKey: props.query.queryKey, + }) + ?.isDisabled() ?? false, + true, + (e) => e.query.queryHash === props.query.queryHash, + ) + + const isStatic = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .find({ + queryKey: props.query.queryKey, + }) + ?.isStatic() ?? false, + true, + (e) => e.query.queryHash === props.query.queryHash, + ) + + const isStale = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .find({ + queryKey: props.query.queryKey, + }) + ?.isStale() ?? false, + true, + (e) => e.query.queryHash === props.query.queryHash, + ) + + const observers = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .find({ + queryKey: props.query.queryKey, + }) + ?.getObserversCount() ?? 0, + true, + (e) => e.query.queryHash === props.query.queryHash, + ) + + const color = createMemo(() => + getQueryStatusColor({ + queryState: queryState()!, + observerCount: observers(), + isStale: isStale(), + }), + ) + + const getObserverCountColorStyles = () => { + if (color() === 'gray') { + return css` + background-color: ${t(colors[color()][200], colors[color()][700])}; + color: ${t(colors[color()][700], colors[color()][300])}; + ` + } + + return css` + background-color: ${t( + colors[color()][200] + alpha[80], + colors[color()][900], + )}; + color: ${t(colors[color()][800], colors[color()][300])}; + ` + } + + return ( + + + + ) +} + +const MutationRow: Component<{ mutation: Mutation }> = (props) => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const { colors, alpha } = tokens + const t = (light: string, dark: string) => (theme() === 'dark' ? dark : light) + + const mutationState = createSubscribeToMutationCacheBatcher( + (mutationCache) => { + const mutations = mutationCache().getAll() + const mutation = mutations.find( + (m) => m.mutationId === props.mutation.mutationId, + ) + return mutation?.state + }, + ) + + const isPaused = createSubscribeToMutationCacheBatcher((mutationCache) => { + const mutations = mutationCache().getAll() + const mutation = mutations.find( + (m) => m.mutationId === props.mutation.mutationId, + ) + if (!mutation) return false + return mutation.state.isPaused + }) + + const status = createSubscribeToMutationCacheBatcher((mutationCache) => { + const mutations = mutationCache().getAll() + const mutation = mutations.find( + (m) => m.mutationId === props.mutation.mutationId, + ) + if (!mutation) return 'idle' + return mutation.state.status + }) + + const color = createMemo(() => + getMutationStatusColor({ + isPaused: isPaused(), + status: status(), + }), + ) + + const getObserverCountColorStyles = () => { + if (color() === 'gray') { + return css` + background-color: ${t(colors[color()][200], colors[color()][700])}; + color: ${t(colors[color()][700], colors[color()][300])}; + ` + } + + return css` + background-color: ${t( + colors[color()][200] + alpha[80], + colors[color()][900], + )}; + color: ${t(colors[color()][800], colors[color()][300])}; + ` + } + + return ( + + + + ) +} + +const QueryStatusCount: Component = () => { + const stale = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .getAll() + .filter((q) => getQueryStatusLabel(q) === 'stale').length, + ) + + const fresh = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .getAll() + .filter((q) => getQueryStatusLabel(q) === 'fresh').length, + ) + + const fetching = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .getAll() + .filter((q) => getQueryStatusLabel(q) === 'fetching').length, + ) + + const paused = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .getAll() + .filter((q) => getQueryStatusLabel(q) === 'paused').length, + ) + + const inactive = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .getAll() + .filter((q) => getQueryStatusLabel(q) === 'inactive').length, + ) + + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + return ( +
+ + + + + +
+ ) +} + +const MutationStatusCount: Component = () => { + const success = createSubscribeToMutationCacheBatcher( + (mutationCache) => + mutationCache() + .getAll() + .filter( + (m) => + getMutationStatusColor({ + isPaused: m.state.isPaused, + status: m.state.status, + }) === 'green', + ).length, + ) + + const pending = createSubscribeToMutationCacheBatcher( + (mutationCache) => + mutationCache() + .getAll() + .filter( + (m) => + getMutationStatusColor({ + isPaused: m.state.isPaused, + status: m.state.status, + }) === 'yellow', + ).length, + ) + + const paused = createSubscribeToMutationCacheBatcher( + (mutationCache) => + mutationCache() + .getAll() + .filter( + (m) => + getMutationStatusColor({ + isPaused: m.state.isPaused, + status: m.state.status, + }) === 'purple', + ).length, + ) + + const error = createSubscribeToMutationCacheBatcher( + (mutationCache) => + mutationCache() + .getAll() + .filter( + (m) => + getMutationStatusColor({ + isPaused: m.state.isPaused, + status: m.state.status, + }) === 'red', + ).length, + ) + + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + return ( +
+ + + + +
+ ) +} + +const QueryStatus: Component = (props) => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const { colors, alpha } = tokens + const t = (light: string, dark: string) => (theme() === 'dark' ? dark : light) + + let tagRef!: HTMLButtonElement + + const [mouseOver, setMouseOver] = createSignal(false) + const [focused, setFocused] = createSignal(false) + + const showLabel = createMemo(() => { + if (selectedQueryHash()) { + if (panelWidth() < firstBreakpoint && panelWidth() > secondBreakpoint) { + return false + } + } + if (panelWidth() < secondBreakpoint) { + return false + } + + return true + }) + + return ( + + ) +} + +const QueryDetails = () => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const { colors } = tokens + const t = (light: string, dark: string) => (theme() === 'dark' ? dark : light) + + const queryClient = useQueryDevtoolsContext().client + + const [restoringLoading, setRestoringLoading] = createSignal(false) + const [dataMode, setDataMode] = createSignal<'view' | 'edit'>('view') + const [dataEditError, setDataEditError] = createSignal(false) + + const errorTypes = createMemo(() => { + return useQueryDevtoolsContext().errorTypes || [] + }) + + const activeQuery = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .getAll() + .find((query) => query.queryHash === selectedQueryHash()), + false, + ) + + const activeQueryFresh = createSubscribeToQueryCacheBatcher((queryCache) => { + return queryCache() + .getAll() + .find((query) => query.queryHash === selectedQueryHash()) + }, false) + + const activeQueryState = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .getAll() + .find((query) => query.queryHash === selectedQueryHash())?.state, + false, + ) + + const activeQueryStateData = createSubscribeToQueryCacheBatcher( + (queryCache) => { + return queryCache() + .getAll() + .find((query) => query.queryHash === selectedQueryHash())?.state.data + }, + false, + ) + + const statusLabel = createSubscribeToQueryCacheBatcher((queryCache) => { + const query = queryCache() + .getAll() + .find((q) => q.queryHash === selectedQueryHash()) + if (!query) return 'inactive' + return getQueryStatusLabel(query) + }) + + const queryStatus = createSubscribeToQueryCacheBatcher((queryCache) => { + const query = queryCache() + .getAll() + .find((q) => q.queryHash === selectedQueryHash()) + if (!query) return 'pending' + return query.state.status + }) + + const observerCount = createSubscribeToQueryCacheBatcher( + (queryCache) => + queryCache() + .getAll() + .find((query) => query.queryHash === selectedQueryHash()) + ?.getObserversCount() ?? 0, + ) + + const color = createMemo(() => getQueryStatusColorByLabel(statusLabel())) + + const handleRefetch = () => { + sendDevToolsEvent({ type: 'REFETCH', queryHash: activeQuery()?.queryHash }) + const promise = activeQuery()?.fetch() + promise?.catch(() => {}) + } + + const triggerError = (errorType?: DevtoolsErrorType) => { + const activeQueryVal = activeQuery() + if (!activeQueryVal) return + sendDevToolsEvent({ + type: 'TRIGGER_ERROR', + queryHash: activeQueryVal.queryHash, + metadata: { error: errorType?.name }, + }) + const error = + errorType?.initializer(activeQueryVal) ?? + new Error('Unknown error from devtools') + + const __previousQueryOptions = activeQueryVal.options + + activeQueryVal.setState({ + status: 'error', + error, + fetchMeta: { + ...activeQueryVal.state.fetchMeta, + __previousQueryOptions, + } as any, + } as QueryState) + } + + const restoreQueryAfterLoadingOrError = () => { + const activeQueryVal = activeQuery() + if (!activeQueryVal) return + + sendDevToolsEvent({ + type: 'RESTORE_LOADING', + queryHash: activeQueryVal.queryHash, + }) + const previousState = activeQueryVal.state + const previousOptions = activeQueryVal.state.fetchMeta + ? (activeQueryVal.state.fetchMeta as any).__previousQueryOptions + : null + + activeQueryVal.cancel({ silent: true }) + activeQueryVal.setState({ + ...previousState, + fetchStatus: 'idle', + fetchMeta: null, + }) + + if (previousOptions) { + activeQueryVal.fetch(previousOptions) + } + } + + createEffect(() => { + if (statusLabel() !== 'fetching') { + setRestoringLoading(false) + } + }) + + const getQueryStatusColors = () => { + if (color() === 'gray') { + return css` + background-color: ${t(colors[color()][200], colors[color()][700])}; + color: ${t(colors[color()][700], colors[color()][300])}; + border-color: ${t(colors[color()][400], colors[color()][600])}; + ` + } + return css` + background-color: ${t(colors[color()][100], colors[color()][900])}; + color: ${t(colors[color()][700], colors[color()][300])}; + border-color: ${t(colors[color()][400], colors[color()][600])}; + ` + } + + return ( + +
+
+ Query Details +
+
+
+
+              {displayValue(activeQuery()!.queryKey, true)}
+            
+ + {statusLabel()} + +
+
+ Observers: + {observerCount()} +
+
+ Last Updated: + + {new Date(activeQueryState()!.dataUpdatedAt).toLocaleTimeString()} + +
+
+
+ Actions +
+
+ + + + + + + + + +
+ + Trigger Error + + +
+
+
+
+ Data {dataMode() === 'view' ? 'Explorer' : 'Editor'} +
+ +
+ setDataMode('edit')} + activeQuery={activeQuery()} + /> +
+
+ +
{ + e.preventDefault() + const formData = new FormData(e.currentTarget) + const data = formData.get('data') as string + try { + const parsedData = JSON.parse(data) + activeQuery()!.setState({ + ...activeQuery()!.state, + data: parsedData, + }) + setDataMode('view') + } catch (error) { + setDataEditError(true) + } + }} + > + +
+ + {dataEditError() ? 'Invalid Value' : ''} + +
+ + +
+
+
+
+
+ Query Explorer +
+
+ +
+
+
+ ) +} + +const MutationDetails = () => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const { colors } = tokens + const t = (light: string, dark: string) => (theme() === 'dark' ? dark : light) + + const isPaused = createSubscribeToMutationCacheBatcher((mutationCache) => { + const mutations = mutationCache().getAll() + const mutation = mutations.find( + (m) => m.mutationId === selectedMutationId(), + ) + if (!mutation) return false + return mutation.state.isPaused + }) + + const status = createSubscribeToMutationCacheBatcher((mutationCache) => { + const mutations = mutationCache().getAll() + const mutation = mutations.find( + (m) => m.mutationId === selectedMutationId(), + ) + if (!mutation) return 'idle' + return mutation.state.status + }) + + const color = createMemo(() => + getMutationStatusColor({ + isPaused: isPaused(), + status: status(), + }), + ) + + const activeMutation = createSubscribeToMutationCacheBatcher( + (mutationCache) => + mutationCache() + .getAll() + .find((mutation) => mutation.mutationId === selectedMutationId()), + false, + ) + + const getQueryStatusColors = () => { + if (color() === 'gray') { + return css` + background-color: ${t(colors[color()][200], colors[color()][700])}; + color: ${t(colors[color()][700], colors[color()][300])}; + border-color: ${t(colors[color()][400], colors[color()][600])}; + ` + } + return css` + background-color: ${t(colors[color()][100], colors[color()][900])}; + color: ${t(colors[color()][700], colors[color()][300])}; + border-color: ${t(colors[color()][400], colors[color()][600])}; + ` + } + + return ( + +
+
+ Mutation Details +
+
+
+
+              
+                
+                  {displayValue(activeMutation()!.options.mutationKey, true)}
+                
+              
+            
+ + pending + {status()} + +
+
+ Submitted At: + + {new Date( + activeMutation()!.state.submittedAt, + ).toLocaleTimeString()} + +
+
+
+ Variables Details +
+
+ +
+
+ Context Details +
+
+ +
+
+ Data Explorer +
+
+ +
+
+ Mutations Explorer +
+
+ +
+
+
+ ) +} + +const queryCacheMap = new Map< + (q: Accessor) => any, + { + setter: Setter + shouldUpdate: (event: QueryCacheNotifyEvent) => boolean + } +>() + +const setupQueryCacheSubscription = () => { + const queryCache = createMemo(() => { + const client = useQueryDevtoolsContext().client + return client.getQueryCache() + }) + + const unsubscribe = queryCache().subscribe((q) => { + batch(() => { + for (const [callback, value] of queryCacheMap.entries()) { + if (!value.shouldUpdate(q)) continue + value.setter(callback(queryCache)) + } + }) + }) + + onCleanup(() => { + queryCacheMap.clear() + unsubscribe() + }) + + return unsubscribe +} + +const createSubscribeToQueryCacheBatcher = ( + callback: (queryCache: Accessor) => Exclude, + equalityCheck: boolean = true, + shouldUpdate: (event: QueryCacheNotifyEvent) => boolean = () => true, +) => { + const queryCache = createMemo(() => { + const client = useQueryDevtoolsContext().client + return client.getQueryCache() + }) + + const [value, setValue] = createSignal( + callback(queryCache), + !equalityCheck ? { equals: false } : undefined, + ) + + createEffect(() => { + setValue(callback(queryCache)) + }) + + queryCacheMap.set(callback, { + setter: setValue, + shouldUpdate: shouldUpdate, + }) + + onCleanup(() => { + queryCacheMap.delete(callback) + }) + + return value +} + +const mutationCacheMap = new Map< + (q: Accessor) => any, + Setter +>() + +const setupMutationCacheSubscription = () => { + const mutationCache = createMemo(() => { + const client = useQueryDevtoolsContext().client + return client.getMutationCache() + }) + + const unsubscribe = mutationCache().subscribe(() => { + for (const [callback, setter] of mutationCacheMap.entries()) { + queueMicrotask(() => { + setter(callback(mutationCache)) + }) + } + }) + + onCleanup(() => { + mutationCacheMap.clear() + unsubscribe() + }) + + return unsubscribe +} + +const createSubscribeToMutationCacheBatcher = ( + callback: (queryCache: Accessor) => Exclude, + equalityCheck: boolean = true, +) => { + const mutationCache = createMemo(() => { + const client = useQueryDevtoolsContext().client + return client.getMutationCache() + }) + + const [value, setValue] = createSignal( + callback(mutationCache), + !equalityCheck ? { equals: false } : undefined, + ) + + createEffect(() => { + setValue(callback(mutationCache)) + }) + + mutationCacheMap.set(callback, setValue) + + onCleanup(() => { + mutationCacheMap.delete(callback) + }) + + return value +} + +type DevToolsActionType = + | 'REFETCH' + | 'INVALIDATE' + | 'RESET' + | 'REMOVE' + | 'TRIGGER_ERROR' + | 'RESTORE_ERROR' + | 'TRIGGER_LOADING' + | 'RESTORE_LOADING' + | 'CLEAR_MUTATION_CACHE' + | 'CLEAR_QUERY_CACHE' + +const DEV_TOOLS_EVENT = '@tanstack/query-devtools-event' + +const sendDevToolsEvent = ({ + type, + queryHash, + metadata, +}: { + type: DevToolsActionType + queryHash?: string + metadata?: Record +}) => { + const event = new CustomEvent(DEV_TOOLS_EVENT, { + detail: { type, queryHash, metadata }, + bubbles: true, + cancelable: true, + }) + window.dispatchEvent(event) +} + +const stylesFactory = ( + theme: 'light' | 'dark', + css: (typeof goober)['css'], +) => { + const { colors, font, size, alpha, shadow, border } = tokens + + const t = (light: string, dark: string) => (theme === 'light' ? light : dark) + + return { + devtoolsBtn: css` + z-index: 100000; + position: fixed; + padding: 4px; + text-align: left; + + display: flex; + align-items: center; + justify-content: center; + border-radius: 9999px; + box-shadow: ${shadow.md()}; + overflow: hidden; + + & div { + position: absolute; + top: -8px; + left: -8px; + right: -8px; + bottom: -8px; + border-radius: 9999px; + + & svg { + position: absolute; + width: 100%; + height: 100%; + } + filter: blur(6px) saturate(1.2) contrast(1.1); + } + + &:focus-within { + outline-offset: 2px; + outline: 3px solid ${colors.green[600]}; + } + + & button { + position: relative; + z-index: 1; + padding: 0; + border-radius: 9999px; + background-color: transparent; + border: none; + height: 40px; + display: flex; + width: 40px; + overflow: hidden; + cursor: pointer; + outline: none; + & svg { + position: absolute; + width: 100%; + height: 100%; + } + } + `, + panel: css` + position: fixed; + z-index: 9999; + display: flex; + gap: ${tokens.size[0.5]}; + & * { + box-sizing: border-box; + text-transform: none; + } + + & *::-webkit-scrollbar { + width: 7px; + } + + & *::-webkit-scrollbar-track { + background: transparent; + } + + & *::-webkit-scrollbar-thumb { + background: ${t(colors.gray[300], colors.darkGray[200])}; + } + + & *::-webkit-scrollbar-thumb:hover { + background: ${t(colors.gray[400], colors.darkGray[300])}; + } + `, + parentPanel: css` + z-index: 9999; + display: flex; + height: 100%; + gap: ${tokens.size[0.5]}; + & * { + box-sizing: border-box; + text-transform: none; + } + + & *::-webkit-scrollbar { + width: 7px; + } + + & *::-webkit-scrollbar-track { + background: transparent; + } + + & *::-webkit-scrollbar-thumb { + background: ${t(colors.gray[300], colors.darkGray[200])}; + } + + & *::-webkit-scrollbar-thumb:hover { + background: ${t(colors.gray[400], colors.darkGray[300])}; + } + `, + 'devtoolsBtn-position-bottom-right': css` + bottom: 12px; + right: 12px; + `, + 'devtoolsBtn-position-bottom-left': css` + bottom: 12px; + left: 12px; + `, + 'devtoolsBtn-position-top-left': css` + top: 12px; + left: 12px; + `, + 'devtoolsBtn-position-top-right': css` + top: 12px; + right: 12px; + `, + 'devtoolsBtn-position-relative': css` + position: relative; + `, + 'panel-position-top': css` + top: 0; + right: 0; + left: 0; + max-height: 90%; + min-height: ${size[14]}; + border-bottom: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + `, + 'panel-position-bottom': css` + bottom: 0; + right: 0; + left: 0; + max-height: 90%; + min-height: ${size[14]}; + border-top: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + `, + 'panel-position-right': css` + bottom: 0; + right: 0; + top: 0; + border-left: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + max-width: 90%; + `, + 'panel-position-left': css` + bottom: 0; + left: 0; + top: 0; + border-right: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + max-width: 90%; + `, + closeBtn: css` + position: absolute; + cursor: pointer; + z-index: 5; + display: flex; + align-items: center; + justify-content: center; + outline: none; + background-color: ${t(colors.gray[50], colors.darkGray[700])}; + &:hover { + background-color: ${t(colors.gray[200], colors.darkGray[500])}; + } + &:focus-visible { + outline: 2px solid ${colors.blue[600]}; + } + & svg { + color: ${t(colors.gray[600], colors.gray[400])}; + width: ${size[2]}; + height: ${size[2]}; + } + `, + 'closeBtn-position-top': css` + bottom: 0; + right: ${size[2]}; + transform: translate(0, 100%); + border-right: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-left: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-top: none; + border-bottom: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-radius: 0px 0px ${border.radius.sm} ${border.radius.sm}; + padding: ${size[0.5]} ${size[1.5]} ${size[1]} ${size[1.5]}; + + &::after { + content: ' '; + position: absolute; + bottom: 100%; + left: -${size[2.5]}; + height: ${size[1.5]}; + width: calc(100% + ${size[5]}); + } + + & svg { + transform: rotate(180deg); + } + `, + 'closeBtn-position-bottom': css` + top: 0; + right: ${size[2]}; + transform: translate(0, -100%); + border-right: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-left: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-top: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-bottom: none; + border-radius: ${border.radius.sm} ${border.radius.sm} 0px 0px; + padding: ${size[1]} ${size[1.5]} ${size[0.5]} ${size[1.5]}; + + &::after { + content: ' '; + position: absolute; + top: 100%; + left: -${size[2.5]}; + height: ${size[1.5]}; + width: calc(100% + ${size[5]}); + } + `, + 'closeBtn-position-right': css` + bottom: ${size[2]}; + left: 0; + transform: translate(-100%, 0); + border-right: none; + border-left: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-top: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-bottom: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-radius: ${border.radius.sm} 0px 0px ${border.radius.sm}; + padding: ${size[1.5]} ${size[0.5]} ${size[1.5]} ${size[1]}; + + &::after { + content: ' '; + position: absolute; + left: 100%; + height: calc(100% + ${size[5]}); + width: ${size[1.5]}; + } + + & svg { + transform: rotate(-90deg); + } + `, + 'closeBtn-position-left': css` + bottom: ${size[2]}; + right: 0; + transform: translate(100%, 0); + border-left: none; + border-right: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-top: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-bottom: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; + border-radius: 0px ${border.radius.sm} ${border.radius.sm} 0px; + padding: ${size[1.5]} ${size[1]} ${size[1.5]} ${size[0.5]}; + + &::after { + content: ' '; + position: absolute; + right: 100%; + height: calc(100% + ${size[5]}); + width: ${size[1.5]}; + } + + & svg { + transform: rotate(90deg); + } + `, + queriesContainer: css` + flex: 1 1 700px; + background-color: ${t(colors.gray[50], colors.darkGray[700])}; + display: flex; + flex-direction: column; + & * { + font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; + } + `, + dragHandle: css` + position: absolute; + transition: background-color 0.125s ease; + &:hover { + background-color: ${colors.purple[400]}${t('', alpha[90])}; + } + z-index: 4; + `, + 'dragHandle-position-top': css` + bottom: 0; + width: 100%; + height: 3px; + cursor: ns-resize; + `, + 'dragHandle-position-bottom': css` + top: 0; + width: 100%; + height: 3px; + cursor: ns-resize; + `, + 'dragHandle-position-right': css` + left: 0; + width: 3px; + height: 100%; + cursor: ew-resize; + `, + 'dragHandle-position-left': css` + right: 0; + width: 3px; + height: 100%; + cursor: ew-resize; + `, + row: css` + display: flex; + justify-content: space-between; + align-items: center; + padding: ${tokens.size[2]} ${tokens.size[2.5]}; + gap: ${tokens.size[2.5]}; + border-bottom: ${t(colors.gray[300], colors.darkGray[500])} 1px solid; + align-items: center; + & > button { + padding: 0; + background: transparent; + border: none; + display: flex; + gap: ${size[0.5]}; + flex-direction: column; + } + `, + logoAndToggleContainer: css` + display: flex; + gap: ${tokens.size[3]}; + align-items: center; + `, + logo: css` + cursor: pointer; + display: flex; + flex-direction: column; + background-color: transparent; + border: none; + gap: ${tokens.size[0.5]}; + padding: 0px; + &:hover { + opacity: 0.7; + } + &:focus-visible { + outline-offset: 4px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + `, + tanstackLogo: css` + font-size: ${font.size.md}; + font-weight: ${font.weight.bold}; + line-height: ${font.lineHeight.xs}; + white-space: nowrap; + color: ${t(colors.gray[600], colors.gray[300])}; + `, + queryFlavorLogo: css` + font-weight: ${font.weight.semibold}; + font-size: ${font.size.xs}; + background: linear-gradient( + to right, + ${t('#ea4037, #ff9b11', '#dd524b, #e9a03b')} + ); + background-clip: text; + -webkit-background-clip: text; + line-height: 1; + -webkit-text-fill-color: transparent; + white-space: nowrap; + `, + queryStatusContainer: css` + display: flex; + gap: ${tokens.size[2]}; + height: min-content; + `, + queryStatusTag: css` + display: flex; + gap: ${tokens.size[1.5]}; + box-sizing: border-box; + height: ${tokens.size[6.5]}; + background: ${t(colors.gray[50], colors.darkGray[500])}; + color: ${t(colors.gray[700], colors.gray[300])}; + border-radius: ${tokens.border.radius.sm}; + font-size: ${font.size.sm}; + padding: ${tokens.size[1]}; + padding-left: ${tokens.size[1.5]}; + align-items: center; + font-weight: ${font.weight.medium}; + border: ${t('1px solid ' + colors.gray[300], '1px solid transparent')}; + user-select: none; + position: relative; + &:focus-visible { + outline-offset: 2px; + outline: 2px solid ${colors.blue[800]}; + } + `, + queryStatusTagLabel: css` + font-size: ${font.size.xs}; + `, + queryStatusCount: css` + font-size: ${font.size.xs}; + padding: 0 5px; + display: flex; + align-items: center; + justify-content: center; + color: ${t(colors.gray[500], colors.gray[400])}; + background-color: ${t(colors.gray[200], colors.darkGray[300])}; + border-radius: 2px; + font-variant-numeric: tabular-nums; + height: ${tokens.size[4.5]}; + `, + statusTooltip: css` + position: absolute; + z-index: 1; + background-color: ${t(colors.gray[50], colors.darkGray[500])}; + top: 100%; + left: 50%; + transform: translate(-50%, calc(${tokens.size[2]})); + padding: ${tokens.size[0.5]} ${tokens.size[2]}; + border-radius: ${tokens.border.radius.sm}; + font-size: ${font.size.xs}; + border: 1px solid ${t(colors.gray[400], colors.gray[600])}; + color: ${t(colors['gray'][600], colors['gray'][300])}; + + &::before { + top: 0px; + content: ' '; + display: block; + left: 50%; + transform: translate(-50%, -100%); + position: absolute; + border-color: transparent transparent + ${t(colors.gray[400], colors.gray[600])} transparent; + border-style: solid; + border-width: 7px; + /* transform: rotate(180deg); */ + } + + &::after { + top: 0px; + content: ' '; + display: block; + left: 50%; + transform: translate(-50%, calc(-100% + 2px)); + position: absolute; + border-color: transparent transparent + ${t(colors.gray[100], colors.darkGray[500])} transparent; + border-style: solid; + border-width: 7px; + } + `, + filtersContainer: css` + display: flex; + gap: ${tokens.size[2]}; + & > button { + cursor: pointer; + padding: ${tokens.size[0.5]} ${tokens.size[1.5]} ${tokens.size[0.5]} + ${tokens.size[2]}; + border-radius: ${tokens.border.radius.sm}; + background-color: ${t(colors.gray[100], colors.darkGray[400])}; + border: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; + color: ${t(colors.gray[700], colors.gray[300])}; + font-size: ${font.size.xs}; + display: flex; + align-items: center; + line-height: ${font.lineHeight.sm}; + gap: ${tokens.size[1.5]}; + max-width: 160px; + &:focus-visible { + outline-offset: 2px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + & svg { + width: ${tokens.size[3]}; + height: ${tokens.size[3]}; + color: ${t(colors.gray[500], colors.gray[400])}; + } + } + `, + filterInput: css` + padding: ${size[0.5]} ${size[2]}; + border-radius: ${tokens.border.radius.sm}; + background-color: ${t(colors.gray[100], colors.darkGray[400])}; + display: flex; + box-sizing: content-box; + align-items: center; + gap: ${tokens.size[1.5]}; + max-width: 160px; + min-width: 100px; + border: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; + height: min-content; + color: ${t(colors.gray[600], colors.gray[400])}; + & > svg { + width: ${size[3]}; + height: ${size[3]}; + } + & input { + font-size: ${font.size.xs}; + width: 100%; + background-color: ${t(colors.gray[100], colors.darkGray[400])}; + border: none; + padding: 0; + line-height: ${font.lineHeight.sm}; + color: ${t(colors.gray[700], colors.gray[300])}; + &::placeholder { + color: ${t(colors.gray[700], colors.gray[300])}; + } + &:focus { + outline: none; + } + } + + &:focus-within { + outline-offset: 2px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + `, + filterSelect: css` + padding: ${tokens.size[0.5]} ${tokens.size[2]}; + border-radius: ${tokens.border.radius.sm}; + background-color: ${t(colors.gray[100], colors.darkGray[400])}; + display: flex; + align-items: center; + gap: ${tokens.size[1.5]}; + box-sizing: content-box; + max-width: 160px; + border: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; + height: min-content; + & > svg { + color: ${t(colors.gray[600], colors.gray[400])}; + width: ${tokens.size[2]}; + height: ${tokens.size[2]}; + } + & > select { + appearance: none; + color: ${t(colors.gray[700], colors.gray[300])}; + min-width: 100px; + line-height: ${font.lineHeight.sm}; + font-size: ${font.size.xs}; + background-color: ${t(colors.gray[100], colors.darkGray[400])}; + border: none; + &:focus { + outline: none; + } + } + &:focus-within { + outline-offset: 2px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + `, + actionsContainer: css` + display: flex; + gap: ${tokens.size[2]}; + `, + actionsBtn: css` + border-radius: ${tokens.border.radius.sm}; + background-color: ${t(colors.gray[100], colors.darkGray[400])}; + border: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; + width: ${tokens.size[6.5]}; + height: ${tokens.size[6.5]}; + justify-content: center; + display: flex; + align-items: center; + gap: ${tokens.size[1.5]}; + max-width: 160px; + cursor: pointer; + padding: 0; + &:hover { + background-color: ${t(colors.gray[200], colors.darkGray[500])}; + } + & svg { + color: ${t(colors.gray[700], colors.gray[300])}; + width: ${tokens.size[3]}; + height: ${tokens.size[3]}; + } + &:focus-visible { + outline-offset: 2px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + `, + actionsBtnOffline: css` + & svg { + stroke: ${t(colors.yellow[700], colors.yellow[500])}; + fill: ${t(colors.yellow[700], colors.yellow[500])}; + } + `, + overflowQueryContainer: css` + flex: 1; + overflow-y: auto; + & > div { + display: flex; + flex-direction: column; + } + `, + queryRow: css` + display: flex; + align-items: center; + padding: 0; + border: none; + cursor: pointer; + color: ${t(colors.gray[700], colors.gray[300])}; + background-color: ${t(colors.gray[50], colors.darkGray[700])}; + line-height: 1; + &:focus { + outline: none; + } + &:focus-visible { + outline-offset: -2px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + &:hover .tsqd-query-hash { + background-color: ${t(colors.gray[200], colors.darkGray[600])}; + } + + & .tsqd-query-observer-count { + padding: 0 ${tokens.size[1]}; + user-select: none; + min-width: ${tokens.size[6.5]}; + align-self: stretch; + display: flex; + align-items: center; + justify-content: center; + font-size: ${font.size.xs}; + font-weight: ${font.weight.medium}; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom: 1px solid ${t(colors.gray[300], colors.darkGray[700])}; + } + & .tsqd-query-hash { + user-select: text; + font-size: ${font.size.xs}; + display: flex; + align-items: center; + min-height: ${tokens.size[6]}; + flex: 1; + padding: ${tokens.size[1]} ${tokens.size[2]}; + font-family: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + 'Liberation Mono', 'Courier New', monospace; + border-bottom: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; + text-align: left; + text-overflow: clip; + word-break: break-word; + } + + & .tsqd-query-disabled-indicator { + align-self: stretch; + display: flex; + align-items: center; + padding: 0 ${tokens.size[2]}; + color: ${t(colors.gray[800], colors.gray[300])}; + background-color: ${t(colors.gray[300], colors.darkGray[600])}; + border-bottom: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; + font-size: ${font.size.xs}; + } + + & .tsqd-query-static-indicator { + align-self: stretch; + display: flex; + align-items: center; + padding: 0 ${tokens.size[2]}; + color: ${t(colors.teal[800], colors.teal[300])}; + background-color: ${t(colors.teal[100], colors.teal[900])}; + border-bottom: 1px solid ${t(colors.teal[300], colors.teal[700])}; + font-size: ${font.size.xs}; + } + `, + selectedQueryRow: css` + background-color: ${t(colors.gray[200], colors.darkGray[500])}; + `, + detailsContainer: css` + flex: 1 1 700px; + background-color: ${t(colors.gray[50], colors.darkGray[700])}; + color: ${t(colors.gray[700], colors.gray[300])}; + font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; + display: flex; + flex-direction: column; + overflow-y: auto; + display: flex; + text-align: left; + `, + detailsHeader: css` + font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; + position: sticky; + top: 0; + z-index: 2; + background-color: ${t(colors.gray[200], colors.darkGray[600])}; + padding: ${tokens.size[1.5]} ${tokens.size[2]}; + font-weight: ${font.weight.medium}; + font-size: ${font.size.xs}; + line-height: ${font.lineHeight.xs}; + text-align: left; + `, + detailsBody: css` + margin: ${tokens.size[1.5]} 0px ${tokens.size[2]} 0px; + & > div { + display: flex; + align-items: stretch; + padding: 0 ${tokens.size[2]}; + line-height: ${font.lineHeight.sm}; + justify-content: space-between; + & > span { + font-size: ${font.size.xs}; + } + & > span:nth-child(2) { + font-variant-numeric: tabular-nums; + } + } + + & > div:first-child { + margin-bottom: ${tokens.size[1.5]}; + } + + & code { + font-family: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + 'Liberation Mono', 'Courier New', monospace; + margin: 0; + font-size: ${font.size.xs}; + line-height: ${font.lineHeight.xs}; + } + + & pre { + margin: 0; + display: flex; + align-items: center; + } + `, + queryDetailsStatus: css` + border: 1px solid ${colors.darkGray[200]}; + border-radius: ${tokens.border.radius.sm}; + font-weight: ${font.weight.medium}; + padding: ${tokens.size[1]} ${tokens.size[2.5]}; + `, + actionsBody: css` + flex-wrap: wrap; + margin: ${tokens.size[2]} 0px ${tokens.size[2]} 0px; + display: flex; + gap: ${tokens.size[2]}; + padding: 0px ${tokens.size[2]}; + & > button { + font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; + font-size: ${font.size.xs}; + padding: ${tokens.size[1]} ${tokens.size[2]}; + display: flex; + border-radius: ${tokens.border.radius.sm}; + background-color: ${t(colors.gray[100], colors.darkGray[600])}; + border: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; + align-items: center; + gap: ${tokens.size[2]}; + font-weight: ${font.weight.medium}; + line-height: ${font.lineHeight.xs}; + cursor: pointer; + &:focus-visible { + outline-offset: 2px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + &:hover { + background-color: ${t(colors.gray[200], colors.darkGray[500])}; + } + + &:disabled { + opacity: 0.6; + cursor: not-allowed; + } + + & > span { + width: ${size[1.5]}; + height: ${size[1.5]}; + border-radius: ${tokens.border.radius.full}; + } + } + `, + actionsSelect: css` + font-size: ${font.size.xs}; + padding: ${tokens.size[0.5]} ${tokens.size[2]}; + display: flex; + border-radius: ${tokens.border.radius.sm}; + overflow: hidden; + background-color: ${t(colors.gray[100], colors.darkGray[600])}; + border: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; + align-items: center; + gap: ${tokens.size[2]}; + font-weight: ${font.weight.medium}; + line-height: ${font.lineHeight.sm}; + color: ${t(colors.red[500], colors.red[400])}; + cursor: pointer; + position: relative; + &:hover { + background-color: ${t(colors.gray[200], colors.darkGray[500])}; + } + & > span { + width: ${size[1.5]}; + height: ${size[1.5]}; + border-radius: ${tokens.border.radius.full}; + } + &:focus-within { + outline-offset: 2px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + & select { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + appearance: none; + background-color: transparent; + border: none; + color: transparent; + outline: none; + } + + & svg path { + stroke: ${tokens.colors.red[400]}; + } + & svg { + width: ${tokens.size[2]}; + height: ${tokens.size[2]}; + } + `, + settingsMenu: css` + display: flex; + & * { + font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; + } + flex-direction: column; + gap: ${size[0.5]}; + border-radius: ${tokens.border.radius.sm}; + border: 1px solid ${t(colors.gray[300], colors.gray[700])}; + background-color: ${t(colors.gray[50], colors.darkGray[600])}; + font-size: ${font.size.xs}; + color: ${t(colors.gray[700], colors.gray[300])}; + z-index: 99999; + min-width: 120px; + padding: ${size[0.5]}; + `, + settingsSubTrigger: css` + display: flex; + align-items: center; + justify-content: space-between; + border-radius: ${tokens.border.radius.xs}; + padding: ${tokens.size[1]} ${tokens.size[1]}; + cursor: pointer; + background-color: transparent; + border: none; + color: ${t(colors.gray[700], colors.gray[300])}; + & svg { + color: ${t(colors.gray[600], colors.gray[400])}; + transform: rotate(-90deg); + width: ${tokens.size[2]}; + height: ${tokens.size[2]}; + } + &:hover { + background-color: ${t(colors.gray[200], colors.darkGray[500])}; + } + &:focus-visible { + outline-offset: 2px; + outline: 2px solid ${colors.blue[800]}; + } + &.data-disabled { + opacity: 0.6; + cursor: not-allowed; + } + `, + settingsMenuHeader: css` + padding: ${tokens.size[1]} ${tokens.size[1]}; + font-weight: ${font.weight.medium}; + border-bottom: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; + color: ${t(colors.gray[500], colors.gray[400])}; + font-size: ${font.size['xs']}; + `, + settingsSubButton: css` + display: flex; + align-items: center; + justify-content: space-between; + color: ${t(colors.gray[700], colors.gray[300])}; + font-size: ${font.size['xs']}; + border-radius: ${tokens.border.radius.xs}; + padding: ${tokens.size[1]} ${tokens.size[1]}; + cursor: pointer; + background-color: transparent; + border: none; + & svg { + color: ${t(colors.gray[600], colors.gray[400])}; + } + &:hover { + background-color: ${t(colors.gray[200], colors.darkGray[500])}; + } + &:focus-visible { + outline-offset: 2px; + outline: 2px solid ${colors.blue[800]}; + } + `, + themeSelectedButton: css` + background-color: ${t(colors.purple[100], colors.purple[900])}; + color: ${t(colors.purple[700], colors.purple[300])}; + & svg { + color: ${t(colors.purple[700], colors.purple[300])}; + } + &:hover { + background-color: ${t(colors.purple[100], colors.purple[900])}; + } + `, + viewToggle: css` + border-radius: ${tokens.border.radius.sm}; + background-color: ${t(colors.gray[200], colors.darkGray[600])}; + border: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; + display: flex; + padding: 0; + font-size: ${font.size.xs}; + color: ${t(colors.gray[700], colors.gray[300])}; + overflow: hidden; + + &:has(:focus-visible) { + outline: 2px solid ${colors.blue[800]}; + } + + & .tsqd-radio-toggle { + opacity: 0.5; + display: flex; + & label { + display: flex; + align-items: center; + cursor: pointer; + line-height: ${font.lineHeight.md}; + } + + & label:hover { + background-color: ${t(colors.gray[100], colors.darkGray[500])}; + } + } + + & > [data-checked] { + opacity: 1; + background-color: ${t(colors.gray[100], colors.darkGray[400])}; + & label:hover { + background-color: ${t(colors.gray[100], colors.darkGray[400])}; + } + } + + & .tsqd-radio-toggle:first-child { + & label { + padding: 0 ${tokens.size[1.5]} 0 ${tokens.size[2]}; + } + border-right: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; + } + + & .tsqd-radio-toggle:nth-child(2) { + & label { + padding: 0 ${tokens.size[2]} 0 ${tokens.size[1.5]}; + } + } + `, + devtoolsEditForm: css` + padding: ${size[2]}; + & > [data-error='true'] { + outline: 2px solid ${t(colors.red[200], colors.red[800])}; + outline-offset: 2px; + border-radius: ${border.radius.xs}; + } + `, + devtoolsEditTextarea: css` + width: 100%; + max-height: 500px; + font-family: 'Fira Code', monospace; + font-size: ${font.size.xs}; + border-radius: ${border.radius.sm}; + field-sizing: content; + padding: ${size[2]}; + background-color: ${t(colors.gray[100], colors.darkGray[800])}; + color: ${t(colors.gray[900], colors.gray[100])}; + border: 1px solid ${t(colors.gray[200], colors.gray[700])}; + resize: none; + &:focus { + outline-offset: 2px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${t(colors.blue[200], colors.blue[800])}; + } + `, + devtoolsEditFormActions: css` + display: flex; + justify-content: space-between; + gap: ${size[2]}; + align-items: center; + padding-top: ${size[1]}; + font-size: ${font.size.xs}; + `, + devtoolsEditFormError: css` + color: ${t(colors.red[700], colors.red[500])}; + `, + devtoolsEditFormActionContainer: css` + display: flex; + gap: ${size[2]}; + `, + devtoolsEditFormAction: css` + font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; + font-size: ${font.size.xs}; + padding: ${size[1]} ${tokens.size[2]}; + display: flex; + border-radius: ${border.radius.sm}; + background-color: ${t(colors.gray[100], colors.darkGray[600])}; + border: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; + align-items: center; + gap: ${size[2]}; + font-weight: ${font.weight.medium}; + line-height: ${font.lineHeight.xs}; + cursor: pointer; + &:focus-visible { + outline-offset: 2px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + &:hover { + background-color: ${t(colors.gray[200], colors.darkGray[500])}; + } + + &:disabled { + opacity: 0.6; + cursor: not-allowed; + } + `, + } +} + +const lightStyles = (css: (typeof goober)['css']) => stylesFactory('light', css) +const darkStyles = (css: (typeof goober)['css']) => stylesFactory('dark', css) diff --git a/devtools-reference/tanstack-query/query-devtools/src/DevtoolsComponent.tsx b/devtools-reference/tanstack-query/query-devtools/src/DevtoolsComponent.tsx new file mode 100644 index 000000000..45d93204e --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/DevtoolsComponent.tsx @@ -0,0 +1,36 @@ +import { createLocalStorage } from '@solid-primitives/storage' +import { createMemo } from 'solid-js' +import { Devtools } from './Devtools' +import { getPreferredColorScheme } from './utils' +import { THEME_PREFERENCE } from './constants' +import { PiPProvider, QueryDevtoolsContext, ThemeContext } from './contexts' +import type { DevtoolsComponentType } from './Devtools' + +const DevtoolsComponent: DevtoolsComponentType = (props) => { + const [localStore, setLocalStore] = createLocalStorage({ + prefix: 'TanstackQueryDevtools', + }) + + const colorScheme = getPreferredColorScheme() + + const theme = createMemo(() => { + const preference = (localStore.theme_preference || THEME_PREFERENCE) as + | 'system' + | 'dark' + | 'light' + if (preference !== 'system') return preference + return colorScheme() + }) + + return ( + + + + + + + + ) +} + +export default DevtoolsComponent diff --git a/devtools-reference/tanstack-query/query-devtools/src/DevtoolsPanelComponent.tsx b/devtools-reference/tanstack-query/query-devtools/src/DevtoolsPanelComponent.tsx new file mode 100644 index 000000000..eb3d19e4d --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/DevtoolsPanelComponent.tsx @@ -0,0 +1,47 @@ +import { createLocalStorage } from '@solid-primitives/storage' +import { createMemo } from 'solid-js' +import { ContentView, ParentPanel } from './Devtools' +import { getPreferredColorScheme } from './utils' +import { THEME_PREFERENCE } from './constants' +import { PiPProvider, QueryDevtoolsContext, ThemeContext } from './contexts' +import type { DevtoolsComponentType } from './Devtools' + +const DevtoolsPanelComponent: DevtoolsComponentType = (props) => { + const [localStore, setLocalStore] = createLocalStorage({ + prefix: 'TanstackQueryDevtools', + }) + + const colorScheme = getPreferredColorScheme() + + const theme = createMemo(() => { + const preference = (localStore.theme_preference || THEME_PREFERENCE) as + | 'system' + | 'dark' + | 'light' + if (preference !== 'system') return preference + return colorScheme() + }) + + return ( + + + + + + + + + + ) +} + +export default DevtoolsPanelComponent diff --git a/devtools-reference/tanstack-query/query-devtools/src/Explorer.tsx b/devtools-reference/tanstack-query/query-devtools/src/Explorer.tsx new file mode 100644 index 000000000..8bf42fe4e --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/Explorer.tsx @@ -0,0 +1,660 @@ +import { serialize, stringify } from 'superjson' +import { clsx as cx } from 'clsx' +import { Index, Match, Show, Switch, createMemo, createSignal } from 'solid-js' +import { Key } from '@solid-primitives/keyed' +import * as goober from 'goober' +import { tokens } from './theme' +import { + deleteNestedDataByPath, + displayValue, + updateNestedDataByPath, +} from './utils' +import { + Check, + CopiedCopier, + Copier, + ErrorCopier, + List, + Pencil, + Trash, +} from './icons' +import { useQueryDevtoolsContext, useTheme } from './contexts' +import type { Query } from '@tanstack/query-core' + +/** + * Chunk elements in the array by size + * + * when the array cannot be chunked evenly by size, the last chunk will be + * filled with the remaining elements + * + * @example + * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']] + */ +function chunkArray( + array: Array, + size: number, +): Array> { + if (size < 1) return [] + let i = 0 + const result: Array> = [] + while (i < array.length) { + result.push(array.slice(i, i + size)) + i = i + size + } + return result +} + +const Expander = (props: { expanded: boolean }) => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + return ( + + + + + + ) +} + +type CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy' +const CopyButton = (props: { value: unknown }) => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + const [copyState, setCopyState] = createSignal('NoCopy') + + return ( + + ) +} + +const ClearArrayButton = (props: { + dataPath: Array + activeQuery: Query +}) => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + const queryClient = useQueryDevtoolsContext().client + + return ( + + ) +} + +const DeleteItemButton = (props: { + dataPath: Array + activeQuery: Query +}) => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + const queryClient = useQueryDevtoolsContext().client + + return ( + + ) +} + +const ToggleValueButton = (props: { + dataPath: Array + activeQuery: Query + value: boolean +}) => { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + const queryClient = useQueryDevtoolsContext().client + + return ( + + ) +} + +type ExplorerProps = { + editable?: boolean + label: string + value: unknown + defaultExpanded?: Array + dataPath?: Array + activeQuery?: Query + itemsDeletable?: boolean + onEdit?: () => void +} + +function isIterable(x: any): x is Iterable { + return Symbol.iterator in x +} + +export default function Explorer(props: ExplorerProps) { + const theme = useTheme() + const css = useQueryDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + const queryClient = useQueryDevtoolsContext().client + + const [expanded, setExpanded] = createSignal( + (props.defaultExpanded || []).includes(props.label), + ) + const toggleExpanded = () => setExpanded((old) => !old) + const [expandedPages, setExpandedPages] = createSignal>([]) + + const subEntries = createMemo(() => { + if (Array.isArray(props.value)) { + return props.value.map((d, i) => ({ + label: i.toString(), + value: d, + })) + } else if ( + props.value !== null && + typeof props.value === 'object' && + isIterable(props.value) && + typeof props.value[Symbol.iterator] === 'function' + ) { + if (props.value instanceof Map) { + return Array.from(props.value, ([key, val]) => ({ + label: key, + value: val, + })) + } + return Array.from(props.value, (val, i) => ({ + label: i.toString(), + value: val, + })) + } else if (typeof props.value === 'object' && props.value !== null) { + return Object.entries(props.value).map(([key, val]) => ({ + label: key, + value: val, + })) + } + return [] + }) + + const type = createMemo(() => { + if (Array.isArray(props.value)) { + return 'array' + } else if ( + props.value !== null && + typeof props.value === 'object' && + isIterable(props.value) && + typeof props.value[Symbol.iterator] === 'function' + ) { + return 'Iterable' + } else if (typeof props.value === 'object' && props.value !== null) { + return 'object' + } + return typeof props.value + }) + + const subEntryPages = createMemo(() => chunkArray(subEntries(), 100)) + + const currentDataPath = props.dataPath ?? [] + + return ( +
+ +
+ + +
+ + + + + + + + + + + + + +
+
+
+ + +
+ item.label}> + {(entry) => { + return ( + + ) + }} + +
+
+ 1}> +
+ + {(entries, index) => ( +
+
+ + +
+ entry.label}> + {(entry) => ( + + )} + +
+
+
+
+ )} +
+
+
+
+
+ +
+ {props.label}: + {displayValue(props.value)} + } + > + + { + const oldData = props.activeQuery!.state.data + + const newData = updateNestedDataByPath( + oldData, + currentDataPath, + type() === 'number' + ? changeEvent.target.valueAsNumber + : changeEvent.target.value, + ) + + queryClient.setQueryData(props.activeQuery!.queryKey, newData) + }} + /> + + + + + + {displayValue(props.value)} + + + + + + + +
+
+
+ ) +} + +const stylesFactory = ( + theme: 'light' | 'dark', + css: (typeof goober)['css'], +) => { + const { colors, font, size, border } = tokens + const t = (light: string, dark: string) => (theme === 'light' ? light : dark) + return { + entry: css` + & * { + font-size: ${font.size.xs}; + font-family: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + 'Liberation Mono', 'Courier New', monospace; + } + position: relative; + outline: none; + word-break: break-word; + `, + subEntry: css` + margin: 0 0 0 0.5em; + padding-left: 0.75em; + border-left: 2px solid ${t(colors.gray[300], colors.darkGray[400])}; + /* outline: 1px solid ${colors.teal[400]}; */ + `, + expander: css` + & path { + stroke: ${colors.gray[400]}; + } + & svg { + width: ${size[3]}; + height: ${size[3]}; + } + display: inline-flex; + align-items: center; + transition: all 0.1s ease; + /* outline: 1px solid ${colors.blue[400]}; */ + `, + expanderButtonContainer: css` + display: flex; + align-items: center; + line-height: ${size[4]}; + min-height: ${size[4]}; + gap: ${size[2]}; + `, + expanderButton: css` + cursor: pointer; + color: inherit; + font: inherit; + outline: inherit; + height: ${size[5]}; + background: transparent; + border: none; + padding: 0; + display: inline-flex; + align-items: center; + gap: ${size[1]}; + position: relative; + /* outline: 1px solid ${colors.green[400]}; */ + + &:focus-visible { + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + + & svg { + position: relative; + left: 1px; + } + `, + info: css` + color: ${t(colors.gray[500], colors.gray[500])}; + font-size: ${font.size.xs}; + margin-left: ${size[1]}; + /* outline: 1px solid ${colors.yellow[400]}; */ + `, + label: css` + color: ${t(colors.gray[700], colors.gray[300])}; + white-space: nowrap; + `, + value: css` + color: ${t(colors.purple[600], colors.purple[400])}; + flex-grow: 1; + `, + actions: css` + display: inline-flex; + gap: ${size[2]}; + align-items: center; + `, + row: css` + display: inline-flex; + gap: ${size[2]}; + width: 100%; + margin: ${size[0.25]} 0px; + line-height: ${size[4.5]}; + align-items: center; + `, + editableInput: css` + border: none; + padding: ${size[0.5]} ${size[1]} ${size[0.5]} ${size[1.5]}; + flex-grow: 1; + border-radius: ${border.radius.xs}; + background-color: ${t(colors.gray[200], colors.darkGray[500])}; + + &:hover { + background-color: ${t(colors.gray[300], colors.darkGray[600])}; + } + `, + actionButton: css` + background-color: transparent; + color: ${t(colors.gray[500], colors.gray[500])}; + border: none; + display: inline-flex; + padding: 0px; + align-items: center; + justify-content: center; + cursor: pointer; + width: ${size[3]}; + height: ${size[3]}; + position: relative; + z-index: 1; + + &:hover svg { + color: ${t(colors.gray[600], colors.gray[400])}; + } + + &:focus-visible { + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + outline-offset: 2px; + } + `, + } +} + +const lightStyles = (css: (typeof goober)['css']) => stylesFactory('light', css) +const darkStyles = (css: (typeof goober)['css']) => stylesFactory('dark', css) diff --git a/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtools.tsx b/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtools.tsx new file mode 100644 index 000000000..4b14c083f --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtools.tsx @@ -0,0 +1,141 @@ +import { render } from 'solid-js/web' +import { createSignal, lazy } from 'solid-js' +import { setupStyleSheet } from './utils' +import type { + QueryClient, + onlineManager as TOnlineManager, +} from '@tanstack/query-core' +import type { DevtoolsComponentType } from './Devtools' +import type { + DevtoolsButtonPosition, + DevtoolsErrorType, + DevtoolsPosition, + QueryDevtoolsProps, +} from './contexts' +import type { Signal } from 'solid-js' + +export interface TanstackQueryDevtoolsConfig extends QueryDevtoolsProps { + styleNonce?: string + shadowDOMTarget?: ShadowRoot +} + +class TanstackQueryDevtools { + #client: Signal + #onlineManager: typeof TOnlineManager + #queryFlavor: string + #version: string + #isMounted = false + #styleNonce?: string + #shadowDOMTarget?: ShadowRoot + #buttonPosition: Signal + #position: Signal + #initialIsOpen: Signal + #errorTypes: Signal | undefined> + #Component: DevtoolsComponentType | undefined + #dispose?: () => void + + constructor(config: TanstackQueryDevtoolsConfig) { + const { + client, + queryFlavor, + version, + onlineManager, + buttonPosition, + position, + initialIsOpen, + errorTypes, + styleNonce, + shadowDOMTarget, + } = config + this.#client = createSignal(client) + this.#queryFlavor = queryFlavor + this.#version = version + this.#onlineManager = onlineManager + this.#styleNonce = styleNonce + this.#shadowDOMTarget = shadowDOMTarget + this.#buttonPosition = createSignal(buttonPosition) + this.#position = createSignal(position) + this.#initialIsOpen = createSignal(initialIsOpen) + this.#errorTypes = createSignal(errorTypes) + } + + setButtonPosition(position: DevtoolsButtonPosition) { + this.#buttonPosition[1](position) + } + + setPosition(position: DevtoolsPosition) { + this.#position[1](position) + } + + setInitialIsOpen(isOpen: boolean) { + this.#initialIsOpen[1](isOpen) + } + + setErrorTypes(errorTypes: Array) { + this.#errorTypes[1](errorTypes) + } + + setClient(client: QueryClient) { + this.#client[1](client) + } + + mount(el: T) { + if (this.#isMounted) { + throw new Error('Devtools is already mounted') + } + const dispose = render(() => { + const [btnPosition] = this.#buttonPosition + const [pos] = this.#position + const [isOpen] = this.#initialIsOpen + const [errors] = this.#errorTypes + const [queryClient] = this.#client + let Devtools: DevtoolsComponentType + + if (this.#Component) { + Devtools = this.#Component + } else { + Devtools = lazy(() => import('./DevtoolsComponent')) + this.#Component = Devtools + } + + setupStyleSheet(this.#styleNonce, this.#shadowDOMTarget) + return ( + + ) + }, el) + this.#isMounted = true + this.#dispose = dispose + } + + unmount() { + if (!this.#isMounted) { + throw new Error('Devtools is not mounted') + } + this.#dispose?.() + this.#isMounted = false + } +} + +export { TanstackQueryDevtools } diff --git a/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtoolsPanel.tsx b/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtoolsPanel.tsx new file mode 100644 index 000000000..bf2619885 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtoolsPanel.tsx @@ -0,0 +1,153 @@ +import { render } from 'solid-js/web' +import { createSignal, lazy } from 'solid-js' +import { setupStyleSheet } from './utils' +import type { + QueryClient, + onlineManager as TOnlineManager, +} from '@tanstack/query-core' +import type { DevtoolsComponentType } from './Devtools' +import type { + DevtoolsButtonPosition, + DevtoolsErrorType, + DevtoolsPosition, + QueryDevtoolsProps, +} from './contexts' +import type { Signal } from 'solid-js' + +export interface TanstackQueryDevtoolsPanelConfig extends QueryDevtoolsProps { + styleNonce?: string + shadowDOMTarget?: ShadowRoot + onClose?: () => unknown +} + +class TanstackQueryDevtoolsPanel { + #client: Signal + #onlineManager: typeof TOnlineManager + #queryFlavor: string + #version: string + #isMounted = false + #styleNonce?: string + #shadowDOMTarget?: ShadowRoot + #buttonPosition: Signal + #position: Signal + #initialIsOpen: Signal + #errorTypes: Signal | undefined> + #onClose: Signal<(() => unknown) | undefined> + #Component: DevtoolsComponentType | undefined + #dispose?: () => void + + constructor(config: TanstackQueryDevtoolsPanelConfig) { + const { + client, + queryFlavor, + version, + onlineManager, + buttonPosition, + position, + initialIsOpen, + errorTypes, + styleNonce, + shadowDOMTarget, + onClose, + } = config + this.#client = createSignal(client) + this.#queryFlavor = queryFlavor + this.#version = version + this.#onlineManager = onlineManager + this.#styleNonce = styleNonce + this.#shadowDOMTarget = shadowDOMTarget + this.#buttonPosition = createSignal(buttonPosition) + this.#position = createSignal(position) + this.#initialIsOpen = createSignal(initialIsOpen) + this.#errorTypes = createSignal(errorTypes) + this.#onClose = createSignal(onClose) + } + + setButtonPosition(position: DevtoolsButtonPosition) { + this.#buttonPosition[1](position) + } + + setPosition(position: DevtoolsPosition) { + this.#position[1](position) + } + + setInitialIsOpen(isOpen: boolean) { + this.#initialIsOpen[1](isOpen) + } + + setErrorTypes(errorTypes: Array) { + this.#errorTypes[1](errorTypes) + } + + setClient(client: QueryClient) { + this.#client[1](client) + } + + setOnClose(onClose: () => unknown) { + this.#onClose[1](() => onClose) + } + + mount(el: T) { + if (this.#isMounted) { + throw new Error('Devtools is already mounted') + } + const dispose = render(() => { + const [btnPosition] = this.#buttonPosition + const [pos] = this.#position + const [isOpen] = this.#initialIsOpen + const [errors] = this.#errorTypes + const [queryClient] = this.#client + const [onClose] = this.#onClose + let Devtools: DevtoolsComponentType + + if (this.#Component) { + Devtools = this.#Component + } else { + Devtools = lazy(() => import('./DevtoolsPanelComponent')) + this.#Component = Devtools + } + + setupStyleSheet(this.#styleNonce, this.#shadowDOMTarget) + return ( + + ) + }, el) + this.#isMounted = true + this.#dispose = dispose + } + + unmount() { + if (!this.#isMounted) { + throw new Error('Devtools is not mounted') + } + this.#dispose?.() + this.#isMounted = false + } +} + +export { TanstackQueryDevtoolsPanel } diff --git a/devtools-reference/tanstack-query/query-devtools/src/__tests__/devtools.test.tsx b/devtools-reference/tanstack-query/query-devtools/src/__tests__/devtools.test.tsx new file mode 100644 index 000000000..0e44d74db --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/__tests__/devtools.test.tsx @@ -0,0 +1,7 @@ +import { describe, expect, it } from 'vitest' + +describe('ReactQueryDevtools', () => { + it('should be able to open and close devtools', () => { + expect(1).toBe(1) + }) +}) diff --git a/devtools-reference/tanstack-query/query-devtools/src/__tests__/utils.test.ts b/devtools-reference/tanstack-query/query-devtools/src/__tests__/utils.test.ts new file mode 100644 index 000000000..60fbcf130 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/__tests__/utils.test.ts @@ -0,0 +1,732 @@ +import { describe, expect, it } from 'vitest' +import { deleteNestedDataByPath, updateNestedDataByPath } from '../utils' + +describe('Utils tests', () => { + describe('updatedNestedDataByPath', () => { + describe('array', () => { + it('should update data correctly', () => { + const oldData = ['one', 'two', 'three'] + + const newData = updateNestedDataByPath(oldData, ['1'], 'new') + + expect(newData).not.toBe(oldData) // should not be the same reference + + expect(oldData).toMatchInlineSnapshot(` + [ + "one", + "two", + "three", + ] + `) + expect(newData).toMatchInlineSnapshot(` + [ + "one", + "new", + "three", + ] + `) + }) + }) + + describe('object', () => { + it('should update data correctly', () => { + const oldData = { title: 'Hello world', id: 1, createdAt: '2021-01-01' } + + const newData = updateNestedDataByPath( + oldData, + ['title'], + 'Brave new world', + ) + + expect(newData).not.toBe(oldData) // should not be the same reference + + expect(oldData).toMatchInlineSnapshot(` + { + "createdAt": "2021-01-01", + "id": 1, + "title": "Hello world", + } + `) + expect(newData).toMatchInlineSnapshot(` + { + "createdAt": "2021-01-01", + "id": 1, + "title": "Brave new world", + } + `) + }) + }) + + describe('set', () => { + it('should update data correctly', () => { + const oldData = new Set([123, 321, 'hello', 'world']) + + const newData = updateNestedDataByPath(oldData, ['2'], 'hi') + + expect(newData).not.toBe(oldData) // should not be the same reference + + expect(oldData).toMatchInlineSnapshot(` + Set { + 123, + 321, + "hello", + "world", + } + `) + expect(newData).toMatchInlineSnapshot(` + Set { + 123, + 321, + "hi", + "world", + } + `) + }) + }) + + describe('map', () => { + it('should update data correctly', () => { + const oldData = new Map([ + ['en', 'hello'], + ['fr', 'bonjour'], + ]) + + /* eslint-disable cspell/spellchecker */ + const newData = updateNestedDataByPath(oldData, ['fr'], 'salut') + + expect(newData).not.toBe(oldData) // should not be the same reference + + expect(oldData).toMatchInlineSnapshot(` + Map { + "en" => "hello", + "fr" => "bonjour", + } + `) + expect(newData).toMatchInlineSnapshot(` + Map { + "en" => "hello", + "fr" => "salut", + } + `) + }) + /* eslint-enable */ + }) + + describe('nested data', () => { + it('should update data correctly', () => { + /* eslint-disable cspell/spellchecker */ + const oldData = new Map([ + [ + 'pumpkin-pie', + { + id: 1, + title: 'Pumpkin pie', + ingredients: new Set(['pumpkin', 'sugar', 'spices']), + steps: ['mix', 'bake', 'eat'], + translations: new Map([ + ['en', 'Pumpkin pie'], + ['fr', 'Tarte à la citrouille'], + ]), + }, + ], + [ + 'spaghetti-bolonese', + { + id: 2, + title: 'Spaghetti bolonese', + ingredients: new Set([ + 'spaghetti', + 'tomato sauce', + 'minced meat', + ]), + steps: ['cook', 'eat'], + translations: new Map([ + ['en', 'Spaghetti bolonese'], + ['fr', 'Spaghetti bolonaise'], + ]), + }, + ], + ]) + + const updatedObject = updateNestedDataByPath( + oldData, + ['pumpkin-pie', 'title'], + 'Pumpkin pie with whipped cream', + ) + + const updatedArray = updateNestedDataByPath( + oldData, + ['spaghetti-bolonese', 'steps', '0'], + 'prepare', + ) + + const updatedSet = updateNestedDataByPath( + oldData, + ['pumpkin-pie', 'ingredients', '1'], + 'honey', + ) + + const updatedMap = updateNestedDataByPath( + oldData, + ['pumpkin-pie', 'translations', 'en'], + 'Best pie ever', + ) + + expect(oldData).toMatchInlineSnapshot(` + Map { + "pumpkin-pie" => { + "id": 1, + "ingredients": Set { + "pumpkin", + "sugar", + "spices", + }, + "steps": [ + "mix", + "bake", + "eat", + ], + "title": "Pumpkin pie", + "translations": Map { + "en" => "Pumpkin pie", + "fr" => "Tarte à la citrouille", + }, + }, + "spaghetti-bolonese" => { + "id": 2, + "ingredients": Set { + "spaghetti", + "tomato sauce", + "minced meat", + }, + "steps": [ + "cook", + "eat", + ], + "title": "Spaghetti bolonese", + "translations": Map { + "en" => "Spaghetti bolonese", + "fr" => "Spaghetti bolonaise", + }, + }, + } + `) + + expect(updatedObject).toMatchInlineSnapshot(` + Map { + "pumpkin-pie" => { + "id": 1, + "ingredients": Set { + "pumpkin", + "sugar", + "spices", + }, + "steps": [ + "mix", + "bake", + "eat", + ], + "title": "Pumpkin pie with whipped cream", + "translations": Map { + "en" => "Pumpkin pie", + "fr" => "Tarte à la citrouille", + }, + }, + "spaghetti-bolonese" => { + "id": 2, + "ingredients": Set { + "spaghetti", + "tomato sauce", + "minced meat", + }, + "steps": [ + "cook", + "eat", + ], + "title": "Spaghetti bolonese", + "translations": Map { + "en" => "Spaghetti bolonese", + "fr" => "Spaghetti bolonaise", + }, + }, + } + `) + + expect(updatedArray).toMatchInlineSnapshot(` + Map { + "pumpkin-pie" => { + "id": 1, + "ingredients": Set { + "pumpkin", + "sugar", + "spices", + }, + "steps": [ + "mix", + "bake", + "eat", + ], + "title": "Pumpkin pie", + "translations": Map { + "en" => "Pumpkin pie", + "fr" => "Tarte à la citrouille", + }, + }, + "spaghetti-bolonese" => { + "id": 2, + "ingredients": Set { + "spaghetti", + "tomato sauce", + "minced meat", + }, + "steps": [ + "prepare", + "eat", + ], + "title": "Spaghetti bolonese", + "translations": Map { + "en" => "Spaghetti bolonese", + "fr" => "Spaghetti bolonaise", + }, + }, + } + `) + + expect(updatedSet).toMatchInlineSnapshot(` + Map { + "pumpkin-pie" => { + "id": 1, + "ingredients": Set { + "pumpkin", + "honey", + "spices", + }, + "steps": [ + "mix", + "bake", + "eat", + ], + "title": "Pumpkin pie", + "translations": Map { + "en" => "Pumpkin pie", + "fr" => "Tarte à la citrouille", + }, + }, + "spaghetti-bolonese" => { + "id": 2, + "ingredients": Set { + "spaghetti", + "tomato sauce", + "minced meat", + }, + "steps": [ + "cook", + "eat", + ], + "title": "Spaghetti bolonese", + "translations": Map { + "en" => "Spaghetti bolonese", + "fr" => "Spaghetti bolonaise", + }, + }, + } + `) + + expect(updatedMap).toMatchInlineSnapshot(` + Map { + "pumpkin-pie" => { + "id": 1, + "ingredients": Set { + "pumpkin", + "sugar", + "spices", + }, + "steps": [ + "mix", + "bake", + "eat", + ], + "title": "Pumpkin pie", + "translations": Map { + "en" => "Best pie ever", + "fr" => "Tarte à la citrouille", + }, + }, + "spaghetti-bolonese" => { + "id": 2, + "ingredients": Set { + "spaghetti", + "tomato sauce", + "minced meat", + }, + "steps": [ + "cook", + "eat", + ], + "title": "Spaghetti bolonese", + "translations": Map { + "en" => "Spaghetti bolonese", + "fr" => "Spaghetti bolonaise", + }, + }, + } + `) + /* eslint-enable */ + }) + }) + }) + + describe('deleteNestedDataByPath', () => { + it('should delete item from array correctly', () => { + const oldData = ['one', 'two', 'three'] + + const newData = deleteNestedDataByPath(oldData, ['1']) + + expect(newData).not.toBe(oldData) // should not be the same reference + + expect(oldData).toMatchInlineSnapshot(` + [ + "one", + "two", + "three", + ] + `) + expect(newData).toMatchInlineSnapshot(` + [ + "one", + "three", + ] + `) + }) + + it('should delete item from object correctly', () => { + const oldData = { title: 'Hello world', id: 1, createdAt: '2021-01-01' } + + const newData = deleteNestedDataByPath(oldData, ['createdAt']) + + expect(newData).not.toBe(oldData) // should not be the same reference + + expect(oldData).toMatchInlineSnapshot(` + { + "createdAt": "2021-01-01", + "id": 1, + "title": "Hello world", + } + `) + expect(newData).toMatchInlineSnapshot(` + { + "id": 1, + "title": "Hello world", + } + `) + }) + + it('should delete item from set', () => { + const oldData = new Set([123, 321, false, true]) + + const newData = deleteNestedDataByPath(oldData, ['1']) + + expect(newData).not.toBe(oldData) // should not be the same reference + + expect(oldData).toMatchInlineSnapshot(` + Set { + 123, + 321, + false, + true, + } + `) + expect(newData).toMatchInlineSnapshot(` + Set { + 123, + false, + true, + } + `) + }) + + it('should delete item from map', () => { + const oldData = new Map([ + ['123', 'one'], + ['hello', 'two'], + ['world', 'three'], + ]) + + const newData = deleteNestedDataByPath(oldData, ['world']) + + expect(newData).not.toBe(oldData) // should not be the same reference + + expect(oldData).toMatchInlineSnapshot(` + Map { + "123" => "one", + "hello" => "two", + "world" => "three", + } + `) + expect(newData).toMatchInlineSnapshot(` + Map { + "123" => "one", + "hello" => "two", + } + `) + }) + + describe('nested data', () => { + it('should delete nested items correctly', () => { + /* eslint-disable cspell/spellchecker */ + const oldData = new Map([ + [ + 'pumpkin-pie', + { + id: 1, + title: 'Pumpkin pie', + ingredients: new Set(['pumpkin', 'sugar', 'spices']), + steps: ['mix', 'bake', 'eat'], + translations: new Map([ + ['en', 'Pumpkin pie'], + ['fr', 'Tarte à la citrouille'], + ]), + }, + ], + [ + 'spaghetti-bolonese', + { + id: 2, + title: 'Spaghetti bolonese', + ingredients: new Set([ + 'spaghetti', + 'tomato sauce', + 'minced meat', + ]), + steps: ['cook', 'eat'], + translations: new Map([ + ['en', 'Spaghetti bolonese'], + ['fr', 'Spaghetti bolonaise'], + ]), + }, + ], + ]) + + const deletedFromSet = deleteNestedDataByPath(oldData, [ + 'spaghetti-bolonese', + 'ingredients', + '0', + ]) + + const deletedFromArray = deleteNestedDataByPath(oldData, [ + 'pumpkin-pie', + 'steps', + '1', + ]) + + const deletedFromObject = deleteNestedDataByPath(oldData, [ + 'pumpkin-pie', + 'title', + ]) + + const deletedFromMap = deleteNestedDataByPath(oldData, [ + 'spaghetti-bolonese', + 'translations', + 'fr', + ]) + + expect(oldData).toMatchInlineSnapshot(` + Map { + "pumpkin-pie" => { + "id": 1, + "ingredients": Set { + "pumpkin", + "sugar", + "spices", + }, + "steps": [ + "mix", + "bake", + "eat", + ], + "title": "Pumpkin pie", + "translations": Map { + "en" => "Pumpkin pie", + "fr" => "Tarte à la citrouille", + }, + }, + "spaghetti-bolonese" => { + "id": 2, + "ingredients": Set { + "spaghetti", + "tomato sauce", + "minced meat", + }, + "steps": [ + "cook", + "eat", + ], + "title": "Spaghetti bolonese", + "translations": Map { + "en" => "Spaghetti bolonese", + "fr" => "Spaghetti bolonaise", + }, + }, + } + `) + + expect(deletedFromSet).toMatchInlineSnapshot(` + Map { + "pumpkin-pie" => { + "id": 1, + "ingredients": Set { + "pumpkin", + "sugar", + "spices", + }, + "steps": [ + "mix", + "bake", + "eat", + ], + "title": "Pumpkin pie", + "translations": Map { + "en" => "Pumpkin pie", + "fr" => "Tarte à la citrouille", + }, + }, + "spaghetti-bolonese" => { + "id": 2, + "ingredients": Set { + "tomato sauce", + "minced meat", + }, + "steps": [ + "cook", + "eat", + ], + "title": "Spaghetti bolonese", + "translations": Map { + "en" => "Spaghetti bolonese", + "fr" => "Spaghetti bolonaise", + }, + }, + } + `) + + expect(deletedFromArray).toMatchInlineSnapshot(` + Map { + "pumpkin-pie" => { + "id": 1, + "ingredients": Set { + "pumpkin", + "sugar", + "spices", + }, + "steps": [ + "mix", + "eat", + ], + "title": "Pumpkin pie", + "translations": Map { + "en" => "Pumpkin pie", + "fr" => "Tarte à la citrouille", + }, + }, + "spaghetti-bolonese" => { + "id": 2, + "ingredients": Set { + "spaghetti", + "tomato sauce", + "minced meat", + }, + "steps": [ + "cook", + "eat", + ], + "title": "Spaghetti bolonese", + "translations": Map { + "en" => "Spaghetti bolonese", + "fr" => "Spaghetti bolonaise", + }, + }, + } + `) + + expect(deletedFromObject).toMatchInlineSnapshot(` + Map { + "pumpkin-pie" => { + "id": 1, + "ingredients": Set { + "pumpkin", + "sugar", + "spices", + }, + "steps": [ + "mix", + "bake", + "eat", + ], + "translations": Map { + "en" => "Pumpkin pie", + "fr" => "Tarte à la citrouille", + }, + }, + "spaghetti-bolonese" => { + "id": 2, + "ingredients": Set { + "spaghetti", + "tomato sauce", + "minced meat", + }, + "steps": [ + "cook", + "eat", + ], + "title": "Spaghetti bolonese", + "translations": Map { + "en" => "Spaghetti bolonese", + "fr" => "Spaghetti bolonaise", + }, + }, + } + `) + + expect(deletedFromMap).toMatchInlineSnapshot(` + Map { + "pumpkin-pie" => { + "id": 1, + "ingredients": Set { + "pumpkin", + "sugar", + "spices", + }, + "steps": [ + "mix", + "bake", + "eat", + ], + "title": "Pumpkin pie", + "translations": Map { + "en" => "Pumpkin pie", + "fr" => "Tarte à la citrouille", + }, + }, + "spaghetti-bolonese" => { + "id": 2, + "ingredients": Set { + "spaghetti", + "tomato sauce", + "minced meat", + }, + "steps": [ + "cook", + "eat", + ], + "title": "Spaghetti bolonese", + "translations": Map { + "en" => "Spaghetti bolonese", + }, + }, + } + `) + /* eslint-enable */ + }) + }) + }) +}) diff --git a/devtools-reference/tanstack-query/query-devtools/src/constants.ts b/devtools-reference/tanstack-query/query-devtools/src/constants.ts new file mode 100644 index 000000000..b4c0c2250 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/constants.ts @@ -0,0 +1,17 @@ +import { mutationSortFns, sortFns } from './utils' +import type { DevtoolsButtonPosition, DevtoolsPosition } from './contexts' + +export const firstBreakpoint = 1024 +export const secondBreakpoint = 796 +export const thirdBreakpoint = 700 + +export const BUTTON_POSITION: DevtoolsButtonPosition = 'bottom-right' +export const POSITION: DevtoolsPosition = 'bottom' +export const THEME_PREFERENCE = 'system' +export const INITIAL_IS_OPEN = false +export const DEFAULT_HEIGHT = 500 +export const PIP_DEFAULT_HEIGHT = 500 +export const DEFAULT_WIDTH = 500 +export const DEFAULT_SORT_FN_NAME = Object.keys(sortFns)[0] +export const DEFAULT_SORT_ORDER = 1 +export const DEFAULT_MUTATION_SORT_FN_NAME = Object.keys(mutationSortFns)[0] diff --git a/devtools-reference/tanstack-query/query-devtools/src/contexts/PiPContext.tsx b/devtools-reference/tanstack-query/query-devtools/src/contexts/PiPContext.tsx new file mode 100644 index 000000000..378f46973 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/contexts/PiPContext.tsx @@ -0,0 +1,191 @@ +import { + createContext, + createEffect, + createMemo, + createSignal, + onCleanup, + useContext, +} from 'solid-js' +import { clearDelegatedEvents, delegateEvents } from 'solid-js/web' +import { PIP_DEFAULT_HEIGHT } from '../constants' +import { useQueryDevtoolsContext } from './QueryDevtoolsContext' +import type { Accessor, JSX } from 'solid-js' +import type { StorageObject, StorageSetter } from '@solid-primitives/storage' + +interface PiPProviderProps { + children: JSX.Element + localStore: StorageObject + setLocalStore: StorageSetter + disabled?: boolean +} + +type PiPContextType = { + pipWindow: Window | null + requestPipWindow: (width: number, height: number) => void + closePipWindow: () => void + disabled: boolean +} + +const PiPContext = createContext | undefined>( + undefined, +) + +export const PiPProvider = (props: PiPProviderProps) => { + // Expose pipWindow that is currently active + const [pipWindow, setPipWindow] = createSignal(null) + + // Close pipWindow programmatically + const closePipWindow = () => { + const w = pipWindow() + if (w != null) { + w.close() + setPipWindow(null) + } + } + + // Open new pipWindow + const requestPipWindow = (width: number, height: number) => { + // We don't want to allow multiple requests. + if (pipWindow() != null) { + return + } + + const pip = window.open( + '', + 'TSQD-Devtools-Panel', + `width=${width},height=${height},popup`, + ) + + if (!pip) { + throw new Error( + 'Failed to open popup. Please allow popups for this site to view the devtools in picture-in-picture mode.', + ) + } + + // Remove existing styles + pip.document.head.innerHTML = '' + // Remove existing body + pip.document.body.innerHTML = '' + // Clear Delegated Events + clearDelegatedEvents(pip.document) + + pip.document.title = 'TanStack Query Devtools' + pip.document.body.style.margin = '0' + + // Detect when window is closed by user + pip.addEventListener('pagehide', () => { + props.setLocalStore('pip_open', 'false') + setPipWindow(null) + }) + + // It is important to copy all parent window styles. Otherwise, there would be no CSS available at all + // https://developer.chrome.com/docs/web-platform/document-picture-in-picture/#copy-style-sheets-to-the-picture-in-picture-window + ;[ + ...(useQueryDevtoolsContext().shadowDOMTarget || document).styleSheets, + ].forEach((styleSheet) => { + try { + const cssRules = [...styleSheet.cssRules] + .map((rule) => rule.cssText) + .join('') + const style = document.createElement('style') + const style_node = styleSheet.ownerNode + let style_id = '' + + if (style_node && 'id' in style_node) { + style_id = style_node.id + } + + if (style_id) { + style.setAttribute('id', style_id) + } + style.textContent = cssRules + pip.document.head.appendChild(style) + } catch (e) { + const link = document.createElement('link') + if (styleSheet.href == null) { + return + } + + link.rel = 'stylesheet' + link.type = styleSheet.type + link.media = styleSheet.media.toString() + link.href = styleSheet.href + pip.document.head.appendChild(link) + } + }) + delegateEvents( + [ + 'focusin', + 'focusout', + 'pointermove', + 'keydown', + 'pointerdown', + 'pointerup', + 'click', + 'mousedown', + 'input', + ], + pip.document, + ) + props.setLocalStore('pip_open', 'true') + setPipWindow(pip) + } + + createEffect(() => { + const pip_open = (props.localStore.pip_open ?? 'false') as 'true' | 'false' + if (pip_open === 'true' && !props.disabled) { + requestPipWindow( + Number(window.innerWidth), + Number(props.localStore.height || PIP_DEFAULT_HEIGHT), + ) + } + }) + + createEffect(() => { + // Setup mutation observer for goober styles with id `_goober + const gooberStyles = ( + useQueryDevtoolsContext().shadowDOMTarget || document + ).querySelector('#_goober') + const w = pipWindow() + if (gooberStyles && w) { + const observer = new MutationObserver(() => { + const pip_style = ( + useQueryDevtoolsContext().shadowDOMTarget || w.document + ).querySelector('#_goober') + if (pip_style) { + pip_style.textContent = gooberStyles.textContent + } + }) + observer.observe(gooberStyles, { + childList: true, // observe direct children + subtree: true, // and lower descendants too + characterDataOldValue: true, // pass old data to callback + }) + onCleanup(() => { + observer.disconnect() + }) + } + }) + + const value = createMemo(() => ({ + pipWindow: pipWindow(), + requestPipWindow, + closePipWindow, + disabled: props.disabled ?? false, + })) + + return ( + {props.children} + ) +} + +export const usePiPWindow = () => { + const context = createMemo(() => { + const ctx = useContext(PiPContext) + if (!ctx) { + throw new Error('usePiPWindow must be used within a PiPProvider') + } + return ctx() + }) + return context +} diff --git a/devtools-reference/tanstack-query/query-devtools/src/contexts/QueryDevtoolsContext.ts b/devtools-reference/tanstack-query/query-devtools/src/contexts/QueryDevtoolsContext.ts new file mode 100644 index 000000000..5af5ba3f7 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/contexts/QueryDevtoolsContext.ts @@ -0,0 +1,44 @@ +import { createContext, useContext } from 'solid-js' +import type { Query, QueryClient, onlineManager } from '@tanstack/query-core' + +type XPosition = 'left' | 'right' +type YPosition = 'top' | 'bottom' +export type DevtoolsPosition = XPosition | YPosition +export type DevtoolsButtonPosition = `${YPosition}-${XPosition}` | 'relative' + +export interface DevtoolsErrorType { + /** + * The name of the error. + */ + name: string + /** + * How the error is initialized. + */ + initializer: (query: Query) => Error +} + +export interface QueryDevtoolsProps { + readonly client: QueryClient + queryFlavor: string + version: string + onlineManager: typeof onlineManager + + buttonPosition?: DevtoolsButtonPosition + position?: DevtoolsPosition + initialIsOpen?: boolean + errorTypes?: Array + shadowDOMTarget?: ShadowRoot + onClose?: () => unknown +} + +export const QueryDevtoolsContext = createContext({ + client: undefined as unknown as QueryClient, + onlineManager: undefined as unknown as typeof onlineManager, + queryFlavor: '', + version: '', + shadowDOMTarget: undefined, +}) + +export function useQueryDevtoolsContext() { + return useContext(QueryDevtoolsContext) +} diff --git a/devtools-reference/tanstack-query/query-devtools/src/contexts/ThemeContext.ts b/devtools-reference/tanstack-query/query-devtools/src/contexts/ThemeContext.ts new file mode 100644 index 000000000..dfb286341 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/contexts/ThemeContext.ts @@ -0,0 +1,10 @@ +import { createContext, useContext } from 'solid-js' +import type { Accessor } from 'solid-js' + +export const ThemeContext = createContext>( + () => 'dark' as const, +) + +export function useTheme() { + return useContext(ThemeContext) +} diff --git a/devtools-reference/tanstack-query/query-devtools/src/contexts/index.ts b/devtools-reference/tanstack-query/query-devtools/src/contexts/index.ts new file mode 100644 index 000000000..b9329a3cd --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/contexts/index.ts @@ -0,0 +1,3 @@ +export * from './PiPContext' +export * from './QueryDevtoolsContext' +export * from './ThemeContext' diff --git a/devtools-reference/tanstack-query/query-devtools/src/icons/index.tsx b/devtools-reference/tanstack-query/query-devtools/src/icons/index.tsx new file mode 100644 index 000000000..7075634de --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/icons/index.tsx @@ -0,0 +1,1385 @@ +import { Show, createUniqueId } from 'solid-js' + +export function Search() { + return ( + + + + ) +} + +export function Trash() { + return ( + + + + ) +} + +export function ChevronDown() { + return ( + + + + ) +} + +export function ArrowUp() { + return ( + + + + ) +} + +export function ArrowDown() { + return ( + + + + ) +} + +export function ArrowLeft() { + return ( + + + + ) +} + +export function ArrowRight() { + return ( + + + + ) +} + +export function Sun() { + return ( + + + + ) +} + +export function Moon() { + return ( + + + + ) +} + +export function Monitor() { + return ( + + + + ) +} + +export function Wifi() { + return ( + + + + + ) +} + +export function Offline() { + return ( + + + + + ) +} + +export function Settings() { + return ( + + + + + ) +} + +export function PiPIcon() { + return ( + + + + ) +} + +export function Copier() { + return ( + + + + ) +} + +export function Pencil() { + return ( + + + + ) +} + +export function CopiedCopier(props: { theme: 'light' | 'dark' }) { + return ( + + + + ) +} + +export function ErrorCopier() { + return ( + + + + ) +} + +export function List() { + return ( + + + + + + + ) +} + +export function Check(props: { checked: boolean; theme: 'light' | 'dark' }) { + return ( + <> + + + + + + + + + + + + ) +} + +export function CheckCircle() { + return ( + + + + ) +} + +export function LoadingCircle() { + return ( + + + + + ) +} + +export function XCircle() { + return ( + + + + ) +} + +export function PauseCircle() { + return ( + + + + ) +} + +export function TanstackLogo() { + const id = createUniqueId() + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/devtools-reference/tanstack-query/query-devtools/src/index.ts b/devtools-reference/tanstack-query/query-devtools/src/index.ts new file mode 100644 index 000000000..1cf3cedd1 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/index.ts @@ -0,0 +1,13 @@ +export type { + DevtoolsButtonPosition, + DevtoolsErrorType, + DevtoolsPosition, +} from './contexts' +export { + TanstackQueryDevtools, + type TanstackQueryDevtoolsConfig, +} from './TanstackQueryDevtools' +export { + TanstackQueryDevtoolsPanel, + type TanstackQueryDevtoolsPanelConfig, +} from './TanstackQueryDevtoolsPanel' diff --git a/devtools-reference/tanstack-query/query-devtools/src/theme.ts b/devtools-reference/tanstack-query/query-devtools/src/theme.ts new file mode 100644 index 000000000..6f515f359 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/theme.ts @@ -0,0 +1,299 @@ +export const tokens = { + colors: { + inherit: 'inherit', + current: 'currentColor', + transparent: 'transparent', + black: '#000000', + white: '#ffffff', + neutral: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + darkGray: { + 50: '#525c7a', + 100: '#49536e', + 200: '#414962', + 300: '#394056', + 400: '#313749', + 500: '#292e3d', + 600: '#212530', + 700: '#191c24', + 800: '#111318', + 900: '#0b0d10', + }, + gray: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + blue: { + 25: '#F5FAFF', + 50: '#EFF8FF', + 100: '#D1E9FF', + 200: '#B2DDFF', + 300: '#84CAFF', + 400: '#53B1FD', + 500: '#2E90FA', + 600: '#1570EF', + 700: '#175CD3', + 800: '#1849A9', + 900: '#194185', + }, + green: { + 25: '#F6FEF9', + 50: '#ECFDF3', + 100: '#D1FADF', + 200: '#A6F4C5', + 300: '#6CE9A6', + 400: '#32D583', + 500: '#12B76A', + 600: '#039855', + 700: '#027A48', + 800: '#05603A', + 900: '#054F31', + }, + red: { + 50: '#fef2f2', + 100: '#fee2e2', + 200: '#fecaca', + 300: '#fca5a5', + 400: '#f87171', + 500: '#ef4444', + 600: '#dc2626', + 700: '#b91c1c', + 800: '#991b1b', + 900: '#7f1d1d', + 950: '#450a0a', + }, + yellow: { + 25: '#FFFCF5', + 50: '#FFFAEB', + 100: '#FEF0C7', + 200: '#FEDF89', + 300: '#FEC84B', + 400: '#FDB022', + 500: '#F79009', + 600: '#DC6803', + 700: '#B54708', + 800: '#93370D', + 900: '#7A2E0E', + }, + purple: { + 25: '#FAFAFF', + 50: '#F4F3FF', + 100: '#EBE9FE', + 200: '#D9D6FE', + 300: '#BDB4FE', + 400: '#9B8AFB', + 500: '#7A5AF8', + 600: '#6938EF', + 700: '#5925DC', + 800: '#4A1FB8', + 900: '#3E1C96', + }, + teal: { + 25: '#F6FEFC', + 50: '#F0FDF9', + 100: '#CCFBEF', + 200: '#99F6E0', + 300: '#5FE9D0', + 400: '#2ED3B7', + 500: '#15B79E', + 600: '#0E9384', + 700: '#107569', + 800: '#125D56', + 900: '#134E48', + }, + pink: { + 25: '#fdf2f8', + 50: '#fce7f3', + 100: '#fbcfe8', + 200: '#f9a8d4', + 300: '#f472b6', + 400: '#ec4899', + 500: '#db2777', + 600: '#be185d', + 700: '#9d174d', + 800: '#831843', + 900: '#500724', + }, + cyan: { + 25: '#ecfeff', + 50: '#cffafe', + 100: '#a5f3fc', + 200: '#67e8f9', + 300: '#22d3ee', + 400: '#06b6d4', + 500: '#0891b2', + 600: '#0e7490', + 700: '#155e75', + 800: '#164e63', + 900: '#083344', + }, + }, + alpha: { + 100: 'ff', + 90: 'e5', + 80: 'cc', + 70: 'b3', + 60: '99', + 50: '80', + 40: '66', + 30: '4d', + 20: '33', + 10: '1a', + 0: '00', + }, + font: { + size: { + '2xs': 'calc(var(--tsqd-font-size) * 0.625)', + xs: 'calc(var(--tsqd-font-size) * 0.75)', + sm: 'calc(var(--tsqd-font-size) * 0.875)', + md: 'var(--tsqd-font-size)', + lg: 'calc(var(--tsqd-font-size) * 1.125)', + xl: 'calc(var(--tsqd-font-size) * 1.25)', + '2xl': 'calc(var(--tsqd-font-size) * 1.5)', + '3xl': 'calc(var(--tsqd-font-size) * 1.875)', + '4xl': 'calc(var(--tsqd-font-size) * 2.25)', + '5xl': 'calc(var(--tsqd-font-size) * 3)', + '6xl': 'calc(var(--tsqd-font-size) * 3.75)', + '7xl': 'calc(var(--tsqd-font-size) * 4.5)', + '8xl': 'calc(var(--tsqd-font-size) * 6)', + '9xl': 'calc(var(--tsqd-font-size) * 8)', + }, + lineHeight: { + xs: 'calc(var(--tsqd-font-size) * 1)', + sm: 'calc(var(--tsqd-font-size) * 1.25)', + md: 'calc(var(--tsqd-font-size) * 1.5)', + lg: 'calc(var(--tsqd-font-size) * 1.75)', + xl: 'calc(var(--tsqd-font-size) * 2)', + '2xl': 'calc(var(--tsqd-font-size) * 2.25)', + '3xl': 'calc(var(--tsqd-font-size) * 2.5)', + '4xl': 'calc(var(--tsqd-font-size) * 2.75)', + '5xl': 'calc(var(--tsqd-font-size) * 3)', + '6xl': 'calc(var(--tsqd-font-size) * 3.25)', + '7xl': 'calc(var(--tsqd-font-size) * 3.5)', + '8xl': 'calc(var(--tsqd-font-size) * 3.75)', + '9xl': 'calc(var(--tsqd-font-size) * 4)', + }, + weight: { + thin: '100', + extralight: '200', + light: '300', + normal: '400', + medium: '500', + semibold: '600', + bold: '700', + extrabold: '800', + black: '900', + }, + }, + breakpoints: { + xs: '320px', + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + '2xl': '1536px', + }, + border: { + radius: { + none: '0px', + xs: 'calc(var(--tsqd-font-size) * 0.125)', + sm: 'calc(var(--tsqd-font-size) * 0.25)', + md: 'calc(var(--tsqd-font-size) * 0.375)', + lg: 'calc(var(--tsqd-font-size) * 0.5)', + xl: 'calc(var(--tsqd-font-size) * 0.75)', + '2xl': 'calc(var(--tsqd-font-size) * 1)', + '3xl': 'calc(var(--tsqd-font-size) * 1.5)', + full: '9999px', + }, + }, + size: { + 0: '0px', + 0.25: 'calc(var(--tsqd-font-size) * 0.0625)', + 0.5: 'calc(var(--tsqd-font-size) * 0.125)', + 1: 'calc(var(--tsqd-font-size) * 0.25)', + 1.5: 'calc(var(--tsqd-font-size) * 0.375)', + 2: 'calc(var(--tsqd-font-size) * 0.5)', + 2.5: 'calc(var(--tsqd-font-size) * 0.625)', + 3: 'calc(var(--tsqd-font-size) * 0.75)', + 3.5: 'calc(var(--tsqd-font-size) * 0.875)', + 4: 'calc(var(--tsqd-font-size) * 1)', + 4.5: 'calc(var(--tsqd-font-size) * 1.125)', + 5: 'calc(var(--tsqd-font-size) * 1.25)', + 5.5: 'calc(var(--tsqd-font-size) * 1.375)', + 6: 'calc(var(--tsqd-font-size) * 1.5)', + 6.5: 'calc(var(--tsqd-font-size) * 1.625)', + 7: 'calc(var(--tsqd-font-size) * 1.75)', + 8: 'calc(var(--tsqd-font-size) * 2)', + 9: 'calc(var(--tsqd-font-size) * 2.25)', + 10: 'calc(var(--tsqd-font-size) * 2.5)', + 11: 'calc(var(--tsqd-font-size) * 2.75)', + 12: 'calc(var(--tsqd-font-size) * 3)', + 14: 'calc(var(--tsqd-font-size) * 3.5)', + 16: 'calc(var(--tsqd-font-size) * 4)', + 20: 'calc(var(--tsqd-font-size) * 5)', + 24: 'calc(var(--tsqd-font-size) * 6)', + 28: 'calc(var(--tsqd-font-size) * 7)', + 32: 'calc(var(--tsqd-font-size) * 8)', + 36: 'calc(var(--tsqd-font-size) * 9)', + 40: 'calc(var(--tsqd-font-size) * 10)', + 44: 'calc(var(--tsqd-font-size) * 11)', + 48: 'calc(var(--tsqd-font-size) * 12)', + 52: 'calc(var(--tsqd-font-size) * 13)', + 56: 'calc(var(--tsqd-font-size) * 14)', + 60: 'calc(var(--tsqd-font-size) * 15)', + 64: 'calc(var(--tsqd-font-size) * 16)', + 72: 'calc(var(--tsqd-font-size) * 18)', + 80: 'calc(var(--tsqd-font-size) * 20)', + 96: 'calc(var(--tsqd-font-size) * 24)', + }, + shadow: { + xs: (_: string = 'rgb(0 0 0 / 0.1)') => + `0 1px 2px 0 rgb(0 0 0 / 0.05)` as const, + sm: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}` as const, + md: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}` as const, + lg: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}` as const, + xl: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}` as const, + '2xl': (color: string = 'rgb(0 0 0 / 0.25)') => + `0 25px 50px -12px ${color}` as const, + inner: (color: string = 'rgb(0 0 0 / 0.05)') => + `inset 0 2px 4px 0 ${color}` as const, + none: () => `none` as const, + }, + zIndices: { + hide: -1, + auto: 'auto', + base: 0, + docked: 10, + dropdown: 1000, + sticky: 1100, + banner: 1200, + overlay: 1300, + modal: 1400, + popover: 1500, + skipLink: 1600, + toast: 1700, + tooltip: 1800, + }, +} as const diff --git a/devtools-reference/tanstack-query/query-devtools/src/utils.tsx b/devtools-reference/tanstack-query/query-devtools/src/utils.tsx new file mode 100644 index 000000000..9a826cd21 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/src/utils.tsx @@ -0,0 +1,323 @@ +import { serialize } from 'superjson' +import { createSignal, onCleanup, onMount } from 'solid-js' +import type { Mutation, Query } from '@tanstack/query-core' +import type { DevtoolsPosition } from './contexts' + +export function getQueryStatusLabel(query: Query) { + return query.state.fetchStatus === 'fetching' + ? 'fetching' + : !query.getObserversCount() + ? 'inactive' + : query.state.fetchStatus === 'paused' + ? 'paused' + : query.isStale() + ? 'stale' + : 'fresh' +} + +type QueryStatusLabel = 'fresh' | 'stale' | 'paused' | 'inactive' | 'fetching' + +export function getSidedProp( + prop: T, + side: DevtoolsPosition, +) { + return `${prop}${ + side.charAt(0).toUpperCase() + side.slice(1) + }` as `${T}${Capitalize}` +} + +export function getQueryStatusColor({ + queryState, + observerCount, + isStale, +}: { + queryState: Query['state'] + observerCount: number + isStale: boolean +}) { + return queryState.fetchStatus === 'fetching' + ? 'blue' + : !observerCount + ? 'gray' + : queryState.fetchStatus === 'paused' + ? 'purple' + : isStale + ? 'yellow' + : 'green' +} + +export function getMutationStatusColor({ + status, + isPaused, +}: { + status: Mutation['state']['status'] + isPaused: boolean +}) { + return isPaused + ? 'purple' + : status === 'error' + ? 'red' + : status === 'pending' + ? 'yellow' + : status === 'success' + ? 'green' + : 'gray' +} + +export function getQueryStatusColorByLabel(label: QueryStatusLabel) { + return label === 'fresh' + ? 'green' + : label === 'stale' + ? 'yellow' + : label === 'paused' + ? 'purple' + : label === 'inactive' + ? 'gray' + : 'blue' +} + +/** + * Displays a string regardless the type of the data + * @param {unknown} value Value to be stringified + * @param {boolean} beautify Formats json to multiline + */ +export const displayValue = (value: unknown, beautify: boolean = false) => { + const { json } = serialize(value) + + return JSON.stringify(json, null, beautify ? 2 : undefined) +} + +// Sorting functions +type SortFn = (a: Query, b: Query) => number + +const getStatusRank = (q: Query) => + q.state.fetchStatus !== 'idle' + ? 0 + : !q.getObserversCount() + ? 3 + : q.isStale() + ? 2 + : 1 + +const queryHashSort: SortFn = (a, b) => a.queryHash.localeCompare(b.queryHash) + +const dateSort: SortFn = (a, b) => + a.state.dataUpdatedAt < b.state.dataUpdatedAt ? 1 : -1 + +const statusAndDateSort: SortFn = (a, b) => { + if (getStatusRank(a) === getStatusRank(b)) { + return dateSort(a, b) + } + + return getStatusRank(a) > getStatusRank(b) ? 1 : -1 +} + +export const sortFns: Record = { + status: statusAndDateSort, + 'query hash': queryHashSort, + 'last updated': dateSort, +} + +type MutationSortFn = (a: Mutation, b: Mutation) => number + +const getMutationStatusRank = (m: Mutation) => + m.state.isPaused + ? 0 + : m.state.status === 'error' + ? 2 + : m.state.status === 'pending' + ? 1 + : 3 + +const mutationDateSort: MutationSortFn = (a, b) => + a.state.submittedAt < b.state.submittedAt ? 1 : -1 + +const mutationStatusSort: MutationSortFn = (a, b) => { + if (getMutationStatusRank(a) === getMutationStatusRank(b)) { + return mutationDateSort(a, b) + } + + return getMutationStatusRank(a) > getMutationStatusRank(b) ? 1 : -1 +} + +export const mutationSortFns: Record = { + status: mutationStatusSort, + 'last updated': mutationDateSort, +} + +export const convertRemToPixels = (rem: number) => { + return rem * parseFloat(getComputedStyle(document.documentElement).fontSize) +} + +export const getPreferredColorScheme = () => { + const [colorScheme, setColorScheme] = createSignal<'light' | 'dark'>('dark') + + onMount(() => { + const query = window.matchMedia('(prefers-color-scheme: dark)') + setColorScheme(query.matches ? 'dark' : 'light') + const listener = (e: MediaQueryListEvent) => { + setColorScheme(e.matches ? 'dark' : 'light') + } + query.addEventListener('change', listener) + onCleanup(() => query.removeEventListener('change', listener)) + }) + + return colorScheme +} + +/** + * updates nested data by path + * + * @param {unknown} oldData Data to be updated + * @param {Array} updatePath Path to the data to be updated + * @param {unknown} value New value + */ +export const updateNestedDataByPath = ( + oldData: unknown, + updatePath: Array, + value: unknown, +): any => { + if (updatePath.length === 0) { + return value + } + + if (oldData instanceof Map) { + const newData = new Map(oldData) + + if (updatePath.length === 1) { + newData.set(updatePath[0], value) + return newData + } + + const [head, ...tail] = updatePath + newData.set(head, updateNestedDataByPath(newData.get(head), tail, value)) + return newData + } + + if (oldData instanceof Set) { + const setAsArray = updateNestedDataByPath( + Array.from(oldData), + updatePath, + value, + ) + + return new Set(setAsArray) + } + + if (Array.isArray(oldData)) { + const newData = [...oldData] + + if (updatePath.length === 1) { + // @ts-expect-error + newData[updatePath[0]] = value + return newData + } + + const [head, ...tail] = updatePath + // @ts-expect-error + newData[head] = updateNestedDataByPath(newData[head], tail, value) + + return newData + } + + if (oldData instanceof Object) { + const newData = { ...oldData } + + if (updatePath.length === 1) { + // @ts-expect-error + newData[updatePath[0]] = value + return newData + } + + const [head, ...tail] = updatePath + // @ts-expect-error + newData[head] = updateNestedDataByPath(newData[head], tail, value) + + return newData + } + + return oldData +} + +/** + * Deletes nested data by path + * + * @param {unknown} oldData Data to be updated + * @param {Array} deletePath Path to the data to be deleted + * @returns newData without the deleted items by path + */ +export const deleteNestedDataByPath = ( + oldData: unknown, + deletePath: Array, +): any => { + if (oldData instanceof Map) { + const newData = new Map(oldData) + + if (deletePath.length === 1) { + newData.delete(deletePath[0]) + return newData + } + + const [head, ...tail] = deletePath + newData.set(head, deleteNestedDataByPath(newData.get(head), tail)) + return newData + } + + if (oldData instanceof Set) { + const setAsArray = deleteNestedDataByPath(Array.from(oldData), deletePath) + return new Set(setAsArray) + } + + if (Array.isArray(oldData)) { + const newData = [...oldData] + + if (deletePath.length === 1) { + return newData.filter((_, idx) => idx.toString() !== deletePath[0]) + } + + const [head, ...tail] = deletePath + + // @ts-expect-error + newData[head] = deleteNestedDataByPath(newData[head], tail) + + return newData + } + + if (oldData instanceof Object) { + const newData = { ...oldData } + + if (deletePath.length === 1) { + // @ts-expect-error + delete newData[deletePath[0]] + return newData + } + + const [head, ...tail] = deletePath + // @ts-expect-error + newData[head] = deleteNestedDataByPath(newData[head], tail) + + return newData + } + + return oldData +} + +// Sets up the goober stylesheet +// Adds a nonce to the style tag if needed +export const setupStyleSheet = (nonce?: string, target?: ShadowRoot) => { + if (!nonce) return + const styleExists = + document.querySelector('#_goober') || target?.querySelector('#_goober') + + if (styleExists) return + const styleTag = document.createElement('style') + const textNode = document.createTextNode('') + styleTag.appendChild(textNode) + styleTag.id = '_goober' + styleTag.setAttribute('nonce', nonce) + if (target) { + target.appendChild(styleTag) + } else { + document.head.appendChild(styleTag) + } +} diff --git a/devtools-reference/tanstack-query/query-devtools/tsconfig.json b/devtools-reference/tanstack-query/query-devtools/tsconfig.json new file mode 100644 index 000000000..bdcd7fcb6 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist-ts", + "rootDir": ".", + "jsx": "preserve", + "jsxImportSource": "solid-js" + }, + "include": ["src", "*.config.js", "*.config.ts", "package.json"], + "references": [{ "path": "../query-core" }] +} diff --git a/devtools-reference/tanstack-query/query-devtools/tsconfig.prod.json b/devtools-reference/tanstack-query/query-devtools/tsconfig.prod.json new file mode 100644 index 000000000..0f4c92da0 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/tsconfig.prod.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "incremental": false, + "composite": false, + "rootDir": "../../" + } +} diff --git a/devtools-reference/tanstack-query/query-devtools/tsup.config.ts b/devtools-reference/tanstack-query/query-devtools/tsup.config.ts new file mode 100644 index 000000000..854110ec1 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/tsup.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from 'tsup' +import { generateTsupOptions, parsePresetOptions } from 'tsup-preset-solid' + +const preset_options = { + entries: { + entry: 'src/index.ts', + dev_entry: true, + }, + cjs: true, + drop_console: true, +} + +export default defineConfig(() => { + const parsed_data = parsePresetOptions(preset_options) + const tsup_options = generateTsupOptions(parsed_data) + + tsup_options.forEach((tsup_option) => { + tsup_option.outDir = 'build' + }) + + return tsup_options +}) diff --git a/devtools-reference/tanstack-query/query-devtools/vite.config.ts b/devtools-reference/tanstack-query/query-devtools/vite.config.ts new file mode 100644 index 000000000..d3bac42e2 --- /dev/null +++ b/devtools-reference/tanstack-query/query-devtools/vite.config.ts @@ -0,0 +1,28 @@ +import solid from 'vite-plugin-solid' +import { defineConfig } from 'vitest/config' + +import packageJson from './package.json' + +export default defineConfig({ + plugins: [solid()], + // fix from https://github.com/vitest-dev/vitest/issues/6992#issuecomment-2509408660 + resolve: { + conditions: ['@tanstack/custom-condition'], + }, + environments: { + ssr: { + resolve: { + conditions: ['@tanstack/custom-condition'], + }, + }, + }, + test: { + name: packageJson.name, + dir: './src', + watch: false, + environment: 'jsdom', + coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, + typecheck: { enabled: true }, + restoreMocks: true, + }, +}) diff --git a/devtools-reference/tanstack-query/react-query-devtools/.attw.json b/devtools-reference/tanstack-query/react-query-devtools/.attw.json new file mode 100644 index 000000000..de5330c3c --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/.attw.json @@ -0,0 +1,3 @@ +{ + "ignoreRules": ["no-resolution"] +} diff --git a/devtools-reference/tanstack-query/react-query-devtools/eslint.config.js b/devtools-reference/tanstack-query/react-query-devtools/eslint.config.js new file mode 100644 index 000000000..03abe6660 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/eslint.config.js @@ -0,0 +1,24 @@ +// @ts-check + +import pluginReact from '@eslint-react/eslint-plugin' +import * as reactHooks from 'eslint-plugin-react-hooks' +import rootConfig from './root.eslint.config.js' + +export default [ + ...rootConfig, + reactHooks.configs.recommended, + { + files: ['**/*.{ts,tsx}'], + ...pluginReact.configs.recommended, + rules: { + '@eslint-react/no-context-provider': 'off', // We need to be React 18 compatible + }, + }, + { + rules: { + 'react-hooks/exhaustive-deps': 'error', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/react-compiler': 'error', + }, + }, +] diff --git a/devtools-reference/tanstack-query/react-query-devtools/package.json b/devtools-reference/tanstack-query/react-query-devtools/package.json new file mode 100644 index 000000000..82529a830 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/package.json @@ -0,0 +1,96 @@ +{ + "name": "@tanstack/react-query-devtools", + "version": "5.83.0", + "description": "Developer tools to interact with and visualize the TanStack/react-query cache", + "author": "tannerlinsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/query.git", + "directory": "packages/react-query-devtools" + }, + "homepage": "https://tanstack.com/query", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "scripts": { + "clean": "premove ./build ./coverage ./dist-ts", + "compile": "tsc --build", + "test:eslint": "eslint ./src", + "test:types": "npm-run-all --serial test:types:*", + "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js --build tsconfig.legacy.json", + "test:types:tscurrent": "tsc --build", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch", + "test:build": "publint --strict && attw --pack", + "build": "tsup --tsconfig tsconfig.prod.json", + "build:dev": "tsup --watch" + }, + "type": "module", + "types": "build/legacy/index.d.ts", + "main": "build/legacy/index.cjs", + "module": "build/legacy/index.js", + "exports": { + ".": { + "@tanstack/custom-condition": "./src/index.ts", + "import": { + "types": "./build/modern/index.d.ts", + "default": "./build/modern/index.js" + }, + "require": { + "types": "./build/modern/index.d.cts", + "default": "./build/modern/index.cjs" + } + }, + "./production": { + "import": { + "types": "./build/modern/production.d.ts", + "default": "./build/modern/production.js" + }, + "require": { + "types": "./build/modern/production.d.cts", + "default": "./build/modern/production.cjs" + } + }, + "./build/modern/production.js": { + "import": { + "types": "./build/modern/production.d.ts", + "default": "./build/modern/production.js" + }, + "require": { + "types": "./build/modern/production.d.cts", + "default": "./build/modern/production.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "build", + "src", + "!src/__tests__" + ], + "dependencies": { + "@tanstack/query-devtools": "workspace:*" + }, + "devDependencies": { + "@tanstack/react-query": "workspace:*", + "@testing-library/react": "^16.1.0", + "@types/react": "^19.0.1", + "@vitejs/plugin-react": "^4.3.4", + "npm-run-all2": "^5.0.0", + "react": "^19.0.0" + }, + "peerDependencies": { + "@tanstack/react-query": "workspace:^", + "react": "^18 || ^19" + } +} diff --git a/devtools-reference/tanstack-query/react-query-devtools/root.eslint.config.js b/devtools-reference/tanstack-query/react-query-devtools/root.eslint.config.js new file mode 120000 index 000000000..35dedbe5a --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/root.eslint.config.js @@ -0,0 +1 @@ +../../eslint.config.js \ No newline at end of file diff --git a/devtools-reference/tanstack-query/react-query-devtools/root.tsup.config.js b/devtools-reference/tanstack-query/react-query-devtools/root.tsup.config.js new file mode 120000 index 000000000..fb8e9add9 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/root.tsup.config.js @@ -0,0 +1 @@ +../../scripts/getTsupConfig.js \ No newline at end of file diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtools.tsx b/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtools.tsx new file mode 100644 index 000000000..e75475f18 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtools.tsx @@ -0,0 +1,110 @@ +'use client' +import * as React from 'react' +import { onlineManager, useQueryClient } from '@tanstack/react-query' +import { TanstackQueryDevtools } from '@tanstack/query-devtools' +import type { + DevtoolsButtonPosition, + DevtoolsErrorType, + DevtoolsPosition, +} from '@tanstack/query-devtools' +import type { QueryClient } from '@tanstack/react-query' + +export interface DevtoolsOptions { + /** + * Set this true if you want the dev tools to default to being open + */ + initialIsOpen?: boolean + /** + * The position of the React Query logo to open and close the devtools panel. + * 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + * Defaults to 'bottom-right'. + */ + buttonPosition?: DevtoolsButtonPosition + /** + * The position of the React Query devtools panel. + * 'top' | 'bottom' | 'left' | 'right' + * Defaults to 'bottom'. + */ + position?: DevtoolsPosition + /** + * Custom instance of QueryClient + */ + client?: QueryClient + /** + * Use this so you can define custom errors that can be shown in the devtools. + */ + errorTypes?: Array + /** + * Use this to pass a nonce to the style tag that is added to the document head. This is useful if you are using a Content Security Policy (CSP) nonce to allow inline styles. + */ + styleNonce?: string + /** + * Use this so you can attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +export function ReactQueryDevtools( + props: DevtoolsOptions, +): React.ReactElement | null { + const queryClient = useQueryClient(props.client) + const ref = React.useRef(null) + const { + buttonPosition, + position, + initialIsOpen, + errorTypes, + styleNonce, + shadowDOMTarget, + } = props + const [devtools] = React.useState( + new TanstackQueryDevtools({ + client: queryClient, + queryFlavor: 'React Query', + version: '5', + onlineManager, + buttonPosition, + position, + initialIsOpen, + errorTypes, + styleNonce, + shadowDOMTarget, + }), + ) + + React.useEffect(() => { + devtools.setClient(queryClient) + }, [queryClient, devtools]) + + React.useEffect(() => { + if (buttonPosition) { + devtools.setButtonPosition(buttonPosition) + } + }, [buttonPosition, devtools]) + + React.useEffect(() => { + if (position) { + devtools.setPosition(position) + } + }, [position, devtools]) + + React.useEffect(() => { + devtools.setInitialIsOpen(initialIsOpen || false) + }, [initialIsOpen, devtools]) + + React.useEffect(() => { + devtools.setErrorTypes(errorTypes || []) + }, [errorTypes, devtools]) + + React.useEffect(() => { + if (ref.current) { + devtools.mount(ref.current) + } + + return () => { + devtools.unmount() + } + }, [devtools]) + + return
+} diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtoolsPanel.tsx b/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtoolsPanel.tsx new file mode 100644 index 000000000..86afd0ba8 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtoolsPanel.tsx @@ -0,0 +1,91 @@ +'use client' +import * as React from 'react' +import { onlineManager, useQueryClient } from '@tanstack/react-query' +import { TanstackQueryDevtoolsPanel } from '@tanstack/query-devtools' +import type { DevtoolsErrorType } from '@tanstack/query-devtools' +import type { QueryClient } from '@tanstack/react-query' + +export interface DevtoolsPanelOptions { + /** + * Custom instance of QueryClient + */ + client?: QueryClient + /** + * Use this so you can define custom errors that can be shown in the devtools. + */ + errorTypes?: Array + /** + * Use this to pass a nonce to the style tag that is added to the document head. This is useful if you are using a Content Security Policy (CSP) nonce to allow inline styles. + */ + styleNonce?: string + /** + * Use this so you can attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot + + /** + * Custom styles for the devtools panel + * @default { height: '500px' } + * @example { height: '100%' } + * @example { height: '100%', width: '100%' } + */ + style?: React.CSSProperties + + /** + * Callback function that is called when the devtools panel is closed + */ + onClose?: () => unknown +} + +export function ReactQueryDevtoolsPanel( + props: DevtoolsPanelOptions, +): React.ReactElement | null { + const queryClient = useQueryClient(props.client) + const ref = React.useRef(null) + const { errorTypes, styleNonce, shadowDOMTarget } = props + const [devtools] = React.useState( + new TanstackQueryDevtoolsPanel({ + client: queryClient, + queryFlavor: 'React Query', + version: '5', + onlineManager, + buttonPosition: 'bottom-left', + position: 'bottom', + initialIsOpen: true, + errorTypes, + styleNonce, + shadowDOMTarget, + onClose: props.onClose, + }), + ) + + React.useEffect(() => { + devtools.setClient(queryClient) + }, [queryClient, devtools]) + + React.useEffect(() => { + devtools.setOnClose(props.onClose ?? (() => {})) + }, [props.onClose, devtools]) + + React.useEffect(() => { + devtools.setErrorTypes(errorTypes || []) + }, [errorTypes, devtools]) + + React.useEffect(() => { + if (ref.current) { + devtools.mount(ref.current) + } + + return () => { + devtools.unmount() + } + }, [devtools]) + + return ( +
+ ) +} diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/devtools.test.tsx b/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/devtools.test.tsx new file mode 100644 index 000000000..0e44d74db --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/devtools.test.tsx @@ -0,0 +1,7 @@ +import { describe, expect, it } from 'vitest' + +describe('ReactQueryDevtools', () => { + it('should be able to open and close devtools', () => { + expect(1).toBe(1) + }) +}) diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/not-development.test.tsx b/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/not-development.test.tsx new file mode 100644 index 000000000..6353147ed --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/not-development.test.tsx @@ -0,0 +1,9 @@ +import { describe, expect, it } from 'vitest' +import { ReactQueryDevtools } from '..' + +describe('ReactQueryDevtools not in process.env.NODE_ENV=development', () => { + it('should return null', () => { + expect(process.env.NODE_ENV).not.toBe('development') + expect(ReactQueryDevtools({})).toBeNull() + }) +}) diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/index.ts b/devtools-reference/tanstack-query/react-query-devtools/src/index.ts new file mode 100644 index 000000000..e922d8788 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/src/index.ts @@ -0,0 +1,18 @@ +'use client' + +import * as Devtools from './ReactQueryDevtools' +import * as DevtoolsPanel from './ReactQueryDevtoolsPanel' + +export const ReactQueryDevtools: (typeof Devtools)['ReactQueryDevtools'] = + process.env.NODE_ENV !== 'development' + ? function () { + return null + } + : Devtools.ReactQueryDevtools + +export const ReactQueryDevtoolsPanel: (typeof DevtoolsPanel)['ReactQueryDevtoolsPanel'] = + process.env.NODE_ENV !== 'development' + ? function () { + return null + } + : DevtoolsPanel.ReactQueryDevtoolsPanel diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/production.ts b/devtools-reference/tanstack-query/react-query-devtools/src/production.ts new file mode 100644 index 000000000..385848542 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/src/production.ts @@ -0,0 +1,7 @@ +'use client' + +import * as Devtools from './ReactQueryDevtools' +import * as DevtoolsPanel from './ReactQueryDevtoolsPanel' + +export const ReactQueryDevtools = Devtools.ReactQueryDevtools +export const ReactQueryDevtoolsPanel = DevtoolsPanel.ReactQueryDevtoolsPanel diff --git a/devtools-reference/tanstack-query/react-query-devtools/test-setup.ts b/devtools-reference/tanstack-query/react-query-devtools/test-setup.ts new file mode 100644 index 000000000..8331ed661 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/test-setup.ts @@ -0,0 +1,12 @@ +import '@testing-library/jest-dom/vitest' +import { act, cleanup } from '@testing-library/react' +import { afterEach } from 'vitest' +import { notifyManager } from '@tanstack/react-query' + +// https://testing-library.com/docs/react-testing-library/api#cleanup +afterEach(() => cleanup()) + +// Wrap notifications with act to make sure React knows about React Query updates +notifyManager.setNotifyFunction((fn) => { + act(fn) +}) diff --git a/devtools-reference/tanstack-query/react-query-devtools/tsconfig.json b/devtools-reference/tanstack-query/react-query-devtools/tsconfig.json new file mode 100644 index 000000000..46a2aea3c --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist-ts", + "rootDir": ".", + "jsx": "react-jsx" + }, + "include": [ + "src", + "test-setup.ts", + "*.config.js", + "*.config.ts", + "package.json" + ], + "references": [{ "path": "../query-devtools" }, { "path": "../react-query" }] +} diff --git a/devtools-reference/tanstack-query/react-query-devtools/tsconfig.legacy.json b/devtools-reference/tanstack-query/react-query-devtools/tsconfig.legacy.json new file mode 100644 index 000000000..28e2218e7 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/tsconfig.legacy.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "outDir": "./dist-ts/legacy" + }, + "include": ["src"], + "exclude": ["src/__tests__"], + "references": [{ "path": "../query-devtools" }, { "path": "../react-query" }] +} diff --git a/devtools-reference/tanstack-query/react-query-devtools/tsconfig.prod.json b/devtools-reference/tanstack-query/react-query-devtools/tsconfig.prod.json new file mode 100644 index 000000000..0f4c92da0 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/tsconfig.prod.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "incremental": false, + "composite": false, + "rootDir": "../../" + } +} diff --git a/devtools-reference/tanstack-query/react-query-devtools/tsup.config.ts b/devtools-reference/tanstack-query/react-query-devtools/tsup.config.ts new file mode 100644 index 000000000..ef4a978d1 --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/tsup.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'tsup' +import { legacyConfig, modernConfig } from './root.tsup.config.js' + +export default defineConfig([ + modernConfig({ entry: ['src/*.ts', 'src/*.tsx'] }), + legacyConfig({ entry: ['src/*.ts', 'src/*.tsx'] }), +]) diff --git a/devtools-reference/tanstack-query/react-query-devtools/vite.config.ts b/devtools-reference/tanstack-query/react-query-devtools/vite.config.ts new file mode 100644 index 000000000..4ecd1537b --- /dev/null +++ b/devtools-reference/tanstack-query/react-query-devtools/vite.config.ts @@ -0,0 +1,29 @@ +import { defineConfig } from 'vitest/config' +import react from '@vitejs/plugin-react' + +import packageJson from './package.json' + +export default defineConfig({ + plugins: [react()], + // fix from https://github.com/vitest-dev/vitest/issues/6992#issuecomment-2509408660 + resolve: { + conditions: ['@tanstack/custom-condition'], + }, + environments: { + ssr: { + resolve: { + conditions: ['@tanstack/custom-condition'], + }, + }, + }, + test: { + name: packageJson.name, + dir: './src', + watch: false, + environment: 'jsdom', + setupFiles: ['test-setup.ts'], + coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, + typecheck: { enabled: true }, + restoreMocks: true, + }, +}) diff --git a/devtools-reference/tanstack-query/vue-query-devtools/.attw.json b/devtools-reference/tanstack-query/vue-query-devtools/.attw.json new file mode 100644 index 000000000..864f618c2 --- /dev/null +++ b/devtools-reference/tanstack-query/vue-query-devtools/.attw.json @@ -0,0 +1,7 @@ +{ + "ignoreRules": [ + "cjs-resolves-to-esm", + "internal-resolution-error", + "no-resolution" + ] +} diff --git a/devtools-reference/tanstack-query/vue-query-devtools/eslint.config.js b/devtools-reference/tanstack-query/vue-query-devtools/eslint.config.js new file mode 100644 index 000000000..6cd1d47ba --- /dev/null +++ b/devtools-reference/tanstack-query/vue-query-devtools/eslint.config.js @@ -0,0 +1,7 @@ +// @ts-check + +// @ts-expect-error +import pluginVue from 'eslint-plugin-vue' +import rootConfig from './root.eslint.config.js' + +export default [...rootConfig, ...pluginVue.configs['flat/base']] diff --git a/devtools-reference/tanstack-query/vue-query-devtools/package.json b/devtools-reference/tanstack-query/vue-query-devtools/package.json new file mode 100644 index 000000000..49ea5ac78 --- /dev/null +++ b/devtools-reference/tanstack-query/vue-query-devtools/package.json @@ -0,0 +1,68 @@ +{ + "name": "@tanstack/vue-query-devtools", + "version": "5.83.0", + "description": "Developer tools to interact with and visualize the TanStack/vue-query cache", + "author": "tannerlinsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/query.git", + "directory": "packages/vue-query-devtools" + }, + "homepage": "https://tanstack.com/query", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "scripts": { + "clean": "premove ./build ./coverage ./dist-ts", + "compile": "vue-tsc --build", + "test:eslint": "eslint ./src", + "test:types": "vue-tsc --build", + "test:build": "publint --strict && attw --pack", + "build": "pnpm run compile && vite build" + }, + "type": "module", + "types": "dist/esm/index.d.ts", + "module": "dist/esm/index.js", + "main": "dist/esm/index.js", + "exports": { + ".": { + "@tanstack/custom-condition": "./src/index.ts", + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "./production": { + "@tanstack/custom-condition": "./src/production.ts", + "types": "./dist/esm/production.d.ts", + "default": "./dist/esm/production.js" + }, + "./dist/production.js": { + "types": "./dist/esm/production.d.ts", + "default": "./dist/esm/production.js" + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist", + "src", + "!src/__tests__" + ], + "dependencies": { + "@tanstack/query-devtools": "workspace:*" + }, + "devDependencies": { + "@tanstack/vue-query": "workspace:*", + "@vitejs/plugin-vue": "^5.2.4", + "eslint-plugin-vue": "^9.27.0", + "typescript": "5.8.3", + "vite": "^6.3.5", + "vue": "^3.4.27", + "vue-tsc": "^2.2.8" + }, + "peerDependencies": { + "@tanstack/vue-query": "workspace:^", + "vue": "^3.3.0" + } +} diff --git a/devtools-reference/tanstack-query/vue-query-devtools/root.eslint.config.js b/devtools-reference/tanstack-query/vue-query-devtools/root.eslint.config.js new file mode 120000 index 000000000..35dedbe5a --- /dev/null +++ b/devtools-reference/tanstack-query/vue-query-devtools/root.eslint.config.js @@ -0,0 +1 @@ +../../eslint.config.js \ No newline at end of file diff --git a/devtools-reference/tanstack-query/vue-query-devtools/src/devtools.vue b/devtools-reference/tanstack-query/vue-query-devtools/src/devtools.vue new file mode 100644 index 000000000..a652bc965 --- /dev/null +++ b/devtools-reference/tanstack-query/vue-query-devtools/src/devtools.vue @@ -0,0 +1,42 @@ + + + diff --git a/devtools-reference/tanstack-query/vue-query-devtools/src/index.ts b/devtools-reference/tanstack-query/vue-query-devtools/src/index.ts new file mode 100644 index 000000000..39c4912e8 --- /dev/null +++ b/devtools-reference/tanstack-query/vue-query-devtools/src/index.ts @@ -0,0 +1,11 @@ +import devtools from './devtools.vue' +import type { DefineComponent } from 'vue' +import type { DevtoolsOptions } from './types' + +export const VueQueryDevtools = ( + process.env.NODE_ENV !== 'development' + ? function () { + return null + } + : devtools +) as DefineComponent diff --git a/devtools-reference/tanstack-query/vue-query-devtools/src/production.ts b/devtools-reference/tanstack-query/vue-query-devtools/src/production.ts new file mode 100644 index 000000000..11cd60bd9 --- /dev/null +++ b/devtools-reference/tanstack-query/vue-query-devtools/src/production.ts @@ -0,0 +1,3 @@ +import devtools from './devtools.vue' + +export default devtools diff --git a/devtools-reference/tanstack-query/vue-query-devtools/src/types.ts b/devtools-reference/tanstack-query/vue-query-devtools/src/types.ts new file mode 100644 index 000000000..a392aac51 --- /dev/null +++ b/devtools-reference/tanstack-query/vue-query-devtools/src/types.ts @@ -0,0 +1,41 @@ +import type { + DevtoolsButtonPosition, + DevtoolsErrorType, + DevtoolsPosition, +} from '@tanstack/query-devtools' +import type { QueryClient } from '@tanstack/vue-query' + +export interface DevtoolsOptions { + /** + * Set this true if you want the dev tools to default to being open + */ + initialIsOpen?: boolean + /** + * The position of the React Query logo to open and close the devtools panel. + * 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + * Defaults to 'bottom-right'. + */ + buttonPosition?: DevtoolsButtonPosition + /** + * The position of the React Query devtools panel. + * 'top' | 'bottom' | 'left' | 'right' + * Defaults to 'bottom'. + */ + position?: DevtoolsPosition + /** + * Custom instance of QueryClient + */ + client?: QueryClient + /** + * Use this so you can define custom errors that can be shown in the devtools. + */ + errorTypes?: Array + /** + * Use this to pass a nonce to the style tag that is added to the document head. This is useful if you are using a Content Security Policy (CSP) nonce to allow inline styles. + */ + styleNonce?: string + /** + * Use this so you can attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} diff --git a/devtools-reference/tanstack-query/vue-query-devtools/tsconfig.json b/devtools-reference/tanstack-query/vue-query-devtools/tsconfig.json new file mode 100644 index 000000000..ec69cf7f7 --- /dev/null +++ b/devtools-reference/tanstack-query/vue-query-devtools/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist-ts", + "rootDir": "." + }, + "include": [ + "src/**/*.ts", + "src/**/*.vue", + "*.config.js", + "*.config.ts", + "package.json" + ], + "references": [{ "path": "../vue-query" }, { "path": "../query-devtools" }] +} diff --git a/devtools-reference/tanstack-query/vue-query-devtools/vite.config.ts b/devtools-reference/tanstack-query/vue-query-devtools/vite.config.ts new file mode 100644 index 000000000..6b7204301 --- /dev/null +++ b/devtools-reference/tanstack-query/vue-query-devtools/vite.config.ts @@ -0,0 +1,26 @@ +import { defineConfig, mergeConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import { tanstackViteConfig } from '@tanstack/config/vite' + +const config = defineConfig({ + plugins: [vue()], + // fix from https://github.com/vitest-dev/vitest/issues/6992#issuecomment-2509408660 + resolve: { + conditions: ['@tanstack/custom-condition'], + }, + environments: { + ssr: { + resolve: { + conditions: ['@tanstack/custom-condition'], + }, + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['src/index.ts', 'src/production.ts'], + srcDir: 'src', + }), +) diff --git a/devtools-reference/tanstack-router/react-router-devtools/README.md b/devtools-reference/tanstack-router/react-router-devtools/README.md new file mode 100644 index 000000000..7be76f46c --- /dev/null +++ b/devtools-reference/tanstack-router/react-router-devtools/README.md @@ -0,0 +1,5 @@ + + +# TanStack React Router Devtools + +See https://tanstack.com/router/latest/docs/framework/react/devtools diff --git a/devtools-reference/tanstack-router/react-router-devtools/eslint.config.js b/devtools-reference/tanstack-router/react-router-devtools/eslint.config.js new file mode 100644 index 000000000..076c5ee39 --- /dev/null +++ b/devtools-reference/tanstack-router/react-router-devtools/eslint.config.js @@ -0,0 +1,31 @@ +// @ts-check + +import pluginReact from '@eslint-react/eslint-plugin' +import pluginReactHooks from 'eslint-plugin-react-hooks' +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + { + files: ['**/*.{ts,tsx}'], + ...pluginReact.configs.recommended, + }, + { + plugins: { + 'react-hooks': pluginReactHooks, + }, + rules: { + '@eslint-react/no-unstable-context-value': 'off', + '@eslint-react/no-unstable-default-props': 'off', + '@eslint-react/dom/no-missing-button-type': 'off', + 'react-hooks/exhaustive-deps': 'error', + 'react-hooks/rules-of-hooks': 'error', + }, + }, + { + files: ['**/__tests__/**'], + rules: { + '@typescript-eslint/no-unnecessary-condition': 'off', + }, + }, +] diff --git a/devtools-reference/tanstack-router/react-router-devtools/package.json b/devtools-reference/tanstack-router/react-router-devtools/package.json new file mode 100644 index 000000000..09d5ed0ed --- /dev/null +++ b/devtools-reference/tanstack-router/react-router-devtools/package.json @@ -0,0 +1,77 @@ +{ + "name": "@tanstack/react-router-devtools", + "version": "1.127.3", + "description": "Modern and scalable routing for React applications", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/router.git", + "directory": "packages/react-router-devtools" + }, + "homepage": "https://tanstack.com/router", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "react", + "location", + "router", + "routing", + "async", + "async router", + "typescript" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf ./coverage", + "test:eslint": "eslint ./src", + "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", + "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js", + "test:types:ts58": "tsc", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", + "build": "vite build" + }, + "type": "module", + "types": "./dist/esm/index.d.ts", + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.js", + "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" + }, + "sideEffects": false, + "files": [ + "dist", + "src" + ], + "engines": { + "node": ">=12" + }, + "dependencies": { + "@tanstack/router-devtools-core": "workspace:^" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.3.4", + "react": ">=19", + "react-dom": ">=19" + }, + "peerDependencies": { + "@tanstack/react-router": "workspace:^", + "react": ">=18.0.0 || >=19.0.0", + "react-dom": ">=18.0.0 || >=19.0.0" + } +} diff --git a/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtools.tsx b/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtools.tsx new file mode 100644 index 000000000..fba93713c --- /dev/null +++ b/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtools.tsx @@ -0,0 +1,126 @@ +import { TanStackRouterDevtoolsCore } from '@tanstack/router-devtools-core' +import { Fragment, useEffect, useRef, useState } from 'react' +import { useRouter, useRouterState } from '@tanstack/react-router' +import type { ButtonHTMLAttributes, HTMLAttributes } from 'react' +import type { AnyRouter } from '@tanstack/react-router' +import type React from 'react' + +interface DevtoolsOptions { + /** + * Set this true if you want the dev tools to default to being open + */ + initialIsOpen?: boolean + /** + * Use this to add props to the panel. For example, you can add className, style (merge and override default style), etc. + */ + panelProps?: HTMLAttributes + /** + * Use this to add props to the close button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc. + */ + closeButtonProps?: ButtonHTMLAttributes + /** + * Use this to add props to the toggle button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc. + */ + toggleButtonProps?: ButtonHTMLAttributes + /** + * The position of the TanStack Router logo to open and close the devtools panel. + * Defaults to 'bottom-left'. + */ + position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + /** + * Use this to render the devtools inside a different type of container element for a11y purposes. + * Any string which corresponds to a valid intrinsic JSX element is allowed. + * Defaults to 'footer'. + */ + containerElement?: string | any + /** + * The router instance to use for the devtools. + */ + router?: AnyRouter + /** + * Use this to attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +export function TanStackRouterDevtools( + props: DevtoolsOptions, +): React.ReactElement | null { + const { + initialIsOpen, + panelProps, + closeButtonProps, + toggleButtonProps, + position, + containerElement, + shadowDOMTarget, + router: propsRouter, + } = props + + const hookRouter = useRouter({ warn: false }) + const activeRouter = propsRouter ?? hookRouter + + const activeRouterState = useRouterState({ router: activeRouter }) + + const devToolRef = useRef(null) + const [devtools] = useState( + () => + new TanStackRouterDevtoolsCore({ + initialIsOpen, + panelProps, + closeButtonProps, + toggleButtonProps, + position, + containerElement, + shadowDOMTarget, + router: activeRouter, + routerState: activeRouterState, + }), + ) + + // Update devtools when props change + useEffect(() => { + devtools.setRouter(activeRouter) + }, [devtools, activeRouter]) + + useEffect(() => { + devtools.setRouterState(activeRouterState) + }, [devtools, activeRouterState]) + + useEffect(() => { + devtools.setOptions({ + initialIsOpen: initialIsOpen, + panelProps: panelProps, + closeButtonProps: closeButtonProps, + toggleButtonProps: toggleButtonProps, + position: position, + containerElement: containerElement, + shadowDOMTarget: shadowDOMTarget, + }) + }, [ + devtools, + initialIsOpen, + panelProps, + closeButtonProps, + toggleButtonProps, + position, + containerElement, + shadowDOMTarget, + ]) + + useEffect(() => { + if (devToolRef.current) { + devtools.mount(devToolRef.current) + } + + return () => { + devtools.unmount() + } + }, [devtools]) + + return ( + +
+ + ) +} diff --git a/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtoolsPanel.tsx b/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtoolsPanel.tsx new file mode 100644 index 000000000..fc401606f --- /dev/null +++ b/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtoolsPanel.tsx @@ -0,0 +1,87 @@ +import { useRouter, useRouterState } from '@tanstack/react-router' +import { TanStackRouterDevtoolsPanelCore } from '@tanstack/router-devtools-core' +import React, { useEffect, useRef, useState } from 'react' +import type { AnyRouter } from '@tanstack/react-router' + +export interface DevtoolsPanelOptions { + /** + * The standard React style object used to style a component with inline styles + */ + style?: any + /** + * The standard React class property used to style a component with classes + */ + className?: string + /** + * A boolean variable indicating whether the panel is open or closed + */ + isOpen?: boolean + /** + * A function that toggles the open and close state of the panel + */ + setIsOpen?: (isOpen: boolean) => void + /** + * Handles the opening and closing the devtools panel + */ + handleDragStart?: (e: any) => void + /** + * A boolean variable indicating if the "lite" version of the library is being used + */ + router?: AnyRouter + /** + * Use this to attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +export const TanStackRouterDevtoolsPanel: React.FC = ( + props, +): React.ReactElement | null => { + const { router: propsRouter, ...rest } = props + const hookRouter = useRouter({ warn: false }) + const activeRouter = propsRouter ?? hookRouter + const activeRouterState = useRouterState({ router: activeRouter }) + + const devToolRef = useRef(null) + const [devtools] = useState( + () => + new TanStackRouterDevtoolsPanelCore({ + ...rest, + router: activeRouter, + routerState: activeRouterState, + }), + ) + + // Update devtools when props change + useEffect(() => { + devtools.setRouter(activeRouter) + }, [devtools, activeRouter]) + + useEffect(() => { + devtools.setRouterState(activeRouterState) + }, [devtools, activeRouterState]) + + useEffect(() => { + devtools.setOptions({ + className: props.className, + style: props.style, + shadowDOMTarget: props.shadowDOMTarget, + }) + }, [devtools, props.className, props.style, props.shadowDOMTarget]) + + useEffect(() => { + if (devToolRef.current) { + devtools.mount(devToolRef.current) + } + + return () => { + devtools.unmount() + } + }, [devtools]) + + return ( + <> +
+ + ) +} diff --git a/devtools-reference/tanstack-router/react-router-devtools/src/index.ts b/devtools-reference/tanstack-router/react-router-devtools/src/index.ts new file mode 100644 index 000000000..3db31a9b7 --- /dev/null +++ b/devtools-reference/tanstack-router/react-router-devtools/src/index.ts @@ -0,0 +1,22 @@ +import * as Devtools from './TanStackRouterDevtools' +import * as DevtoolsPanel from './TanStackRouterDevtoolsPanel' + +export const TanStackRouterDevtools: (typeof Devtools)['TanStackRouterDevtools'] = + process.env.NODE_ENV !== 'development' + ? function () { + return null + } + : Devtools.TanStackRouterDevtools + +export const TanStackRouterDevtoolsInProd: (typeof Devtools)['TanStackRouterDevtools'] = + Devtools.TanStackRouterDevtools + +export const TanStackRouterDevtoolsPanel: (typeof DevtoolsPanel)['TanStackRouterDevtoolsPanel'] = + process.env.NODE_ENV !== 'development' + ? function () { + return null + } + : DevtoolsPanel.TanStackRouterDevtoolsPanel + +export const TanStackRouterDevtoolsPanelInProd: (typeof DevtoolsPanel)['TanStackRouterDevtoolsPanel'] = + DevtoolsPanel.TanStackRouterDevtoolsPanel diff --git a/devtools-reference/tanstack-router/react-router-devtools/tsconfig.json b/devtools-reference/tanstack-router/react-router-devtools/tsconfig.json new file mode 100644 index 000000000..1599b212c --- /dev/null +++ b/devtools-reference/tanstack-router/react-router-devtools/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "react" + }, + "include": ["src", "tests", "vite.config.ts"] +} diff --git a/devtools-reference/tanstack-router/react-router-devtools/vite.config.ts b/devtools-reference/tanstack-router/react-router-devtools/vite.config.ts new file mode 100644 index 000000000..410777b82 --- /dev/null +++ b/devtools-reference/tanstack-router/react-router-devtools/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import react from '@vitejs/plugin-react' +import packageJson from './package.json' +import type { UserConfig } from 'vitest/config' + +const config = defineConfig({ + plugins: [react()] as UserConfig['plugins'], + test: { + name: packageJson.name, + dir: './tests', + watch: false, + environment: 'jsdom', + typecheck: { enabled: true }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: './src/index.ts', + srcDir: './src', + }), +) diff --git a/devtools-reference/tanstack-router/router-devtools-core/README.md b/devtools-reference/tanstack-router/router-devtools-core/README.md new file mode 100644 index 000000000..7be76f46c --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/README.md @@ -0,0 +1,5 @@ + + +# TanStack React Router Devtools + +See https://tanstack.com/router/latest/docs/framework/react/devtools diff --git a/devtools-reference/tanstack-router/router-devtools-core/eslint.config.js b/devtools-reference/tanstack-router/router-devtools-core/eslint.config.js new file mode 100644 index 000000000..bd7118fa1 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/eslint.config.js @@ -0,0 +1,20 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + { + files: ['**/*.{ts,tsx}'], + }, + { + plugins: {}, + rules: {}, + }, + { + files: ['**/__tests__/**'], + rules: { + '@typescript-eslint/no-unnecessary-condition': 'off', + }, + }, +] diff --git a/devtools-reference/tanstack-router/router-devtools-core/media/logo.sketch b/devtools-reference/tanstack-router/router-devtools-core/media/logo.sketch new file mode 100644 index 0000000000000000000000000000000000000000..068e5ed4ef537377768eb1f292298a4f9724838b GIT binary patch literal 353553 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 + + + logo-light + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/devtools-reference/tanstack-router/router-devtools-core/media/repo-dark.png b/devtools-reference/tanstack-router/router-devtools-core/media/repo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7d9c6681ad394768b854ba1460596505cf14007c GIT binary patch literal 155546 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 xekj6=12" + }, + "dependencies": { + "clsx": "^2.1.1", + "goober": "^2.1.16", + "solid-js": "^1.9.5" + }, + "devDependencies": { + "vite-plugin-solid": "^2.11.6" + }, + "peerDependencies": { + "tiny-invariant": "^1.3.3", + "@tanstack/router-core": "workspace:^", + "csstype": "^3.0.10", + "solid-js": ">=1.9.5" + }, + "peerDependenciesMeta": { + "csstype": { + "optional": true + } + } +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/AgeTicker.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/AgeTicker.tsx new file mode 100644 index 000000000..27d179fda --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/AgeTicker.tsx @@ -0,0 +1,59 @@ +import { clsx as cx } from 'clsx' +import { useStyles } from './useStyles' +import type { AnyRouteMatch, AnyRouter } from '@tanstack/router-core' +import type { Accessor } from 'solid-js' + +function formatTime(ms: number) { + const units = ['s', 'min', 'h', 'd'] + const values = [ms / 1000, ms / 60000, ms / 3600000, ms / 86400000] + + let chosenUnitIndex = 0 + for (let i = 1; i < values.length; i++) { + if (values[i]! < 1) break + chosenUnitIndex = i + } + + const formatter = new Intl.NumberFormat(navigator.language, { + compactDisplay: 'short', + notation: 'compact', + maximumFractionDigits: 0, + }) + + return formatter.format(values[chosenUnitIndex]!) + units[chosenUnitIndex] +} + +export function AgeTicker({ + match, + router, +}: { + match?: AnyRouteMatch + router: Accessor +}) { + const styles = useStyles() + + if (!match) { + return null + } + + const route = router().looseRoutesById[match.routeId]! + + if (!route.options.loader) { + return null + } + + const age = Date.now() - match.updatedAt + const staleTime = + route.options.staleTime ?? router().options.defaultStaleTime ?? 0 + const gcTime = + route.options.gcTime ?? router().options.defaultGcTime ?? 30 * 60 * 1000 + + return ( +

+ ) +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/BaseTanStackRouterDevtoolsPanel.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/BaseTanStackRouterDevtoolsPanel.tsx new file mode 100644 index 000000000..a84f318bc --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/BaseTanStackRouterDevtoolsPanel.tsx @@ -0,0 +1,632 @@ +import { clsx as cx } from 'clsx' +import { default as invariant } from 'tiny-invariant' +import { interpolatePath, rootRouteId, trimPath } from '@tanstack/router-core' +import { Show, createMemo } from 'solid-js' +import { useDevtoolsOnClose } from './context' +import { useStyles } from './useStyles' +import useLocalStorage from './useLocalStorage' +import { Explorer } from './Explorer' +import { getRouteStatusColor, getStatusColor, multiSortBy } from './utils' +import { AgeTicker } from './AgeTicker' +// import type { DevtoolsPanelOptions } from './TanStackRouterDevtoolsPanel' + +import { NavigateButton } from './NavigateButton' +import type { + AnyContext, + AnyRoute, + AnyRouter, + FileRouteTypes, + MakeRouteMatchUnion, + Route, + RouterState, +} from '@tanstack/router-core' +import type { Accessor, JSX } from 'solid-js' + +export interface BaseDevtoolsPanelOptions { + /** + * The standard React style object used to style a component with inline styles + */ + style?: Accessor + /** + * The standard React class property used to style a component with classes + */ + className?: Accessor + /** + * A boolean variable indicating whether the panel is open or closed + */ + isOpen?: boolean + /** + * A function that toggles the open and close state of the panel + */ + setIsOpen?: (isOpen: boolean) => void + /** + * Handles the opening and closing the devtools panel + */ + handleDragStart?: (e: any) => void + /** + * A boolean variable indicating if the "lite" version of the library is being used + */ + router: Accessor + routerState: Accessor + /** + * Use this to attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +function Logo(props: any) { + const { className, ...rest } = props + const styles = useStyles() + return ( + + ) +} + +function NavigateLink(props: { + class?: string + left?: JSX.Element + children?: JSX.Element + right?: JSX.Element +}) { + return ( +
+ {props.left} +
{props.children}
+ {props.right} +
+ ) +} + +function RouteComp({ + routerState, + router, + route, + isRoot, + activeId, + setActiveId, +}: { + routerState: Accessor< + RouterState< + Route< + any, + '/', + '/', + string, + '__root__', + undefined, + {}, + {}, + AnyContext, + AnyContext, + {}, + undefined, + any, + FileRouteTypes + >, + MakeRouteMatchUnion + > + > + router: Accessor + route: AnyRoute + isRoot?: boolean + activeId: Accessor + setActiveId: (id: string) => void +}) { + const styles = useStyles() + const matches = createMemo( + () => routerState().pendingMatches || routerState().matches, + ) + const match = createMemo(() => + routerState().matches.find((d) => d.routeId === route.id), + ) + + const param = createMemo(() => { + try { + if (match()?.params) { + const p = match()?.params + const r: string = route.path || trimPath(route.id) + if (r.startsWith('$')) { + const trimmed = r.slice(1) + + if (p[trimmed]) { + return `(${p[trimmed]})` + } + } + } + return '' + } catch (error) { + return '' + } + }) + + const navigationTarget = createMemo(() => { + if (isRoot) return undefined // rootRouteId has no path + if (!route.path) return undefined // no path to navigate to + + // flatten all params in the router state, into a single object + const allParams = Object.assign({}, ...matches().map((m) => m.params)) + + // interpolatePath is used by router-core to generate the `to` + // path for the navigate function in the router + const interpolated = interpolatePath({ + path: route.fullPath, + params: allParams, + leaveWildcards: false, + leaveParams: false, + decodeCharMap: router().pathParamsDecodeCharMap, + }) + + // only if `interpolated` is not missing params, return the path since this + // means that all the params are present for a successful navigation + return !interpolated.isMissingParams + ? interpolated.interpolatedPath + : undefined + }) + + return ( +
+
{ + if (match()) { + setActiveId(activeId() === route.id ? '' : route.id) + } + }} + class={cx( + styles().routesRowContainer(route.id === activeId(), !!match()), + )} + > +
+ + {(navigate) => } + + } + right={} + > + + {isRoot ? rootRouteId : route.path || trimPath(route.id)}{' '} + + {param()} + +
+ {route.children?.length ? ( +
+ {[...(route.children as Array)] + .sort((a, b) => { + return a.rank - b.rank + }) + .map((r) => ( + + ))} +
+ ) : null} +
+ ) +} + +export const BaseTanStackRouterDevtoolsPanel = + function BaseTanStackRouterDevtoolsPanel({ + ...props + }: BaseDevtoolsPanelOptions): JSX.Element { + const { + isOpen = true, + setIsOpen, + handleDragStart, + router, + routerState, + shadowDOMTarget, + ...panelProps + } = props + + const { onCloseClick } = useDevtoolsOnClose() + const styles = useStyles() + const { className, style, ...otherPanelProps } = panelProps + + invariant( + router, + 'No router was found for the TanStack Router Devtools. Please place the devtools in the component tree or pass the router instance to the devtools manually.', + ) + + // useStore(router.__store) + + const [showMatches, setShowMatches] = useLocalStorage( + 'tanstackRouterDevtoolsShowMatches', + true, + ) + + const [activeId, setActiveId] = useLocalStorage( + 'tanstackRouterDevtoolsActiveRouteId', + '', + ) + + const activeMatch = createMemo(() => { + const matches = [ + ...(routerState().pendingMatches ?? []), + ...routerState().matches, + ...routerState().cachedMatches, + ] + return matches.find( + (d) => d.routeId === activeId() || d.id === activeId(), + ) + }) + + const hasSearch = createMemo( + () => Object.keys(routerState().location.search).length, + ) + + const explorerState = createMemo(() => { + return { + ...router(), + state: routerState(), + } + }) + + const routerExplorerValue = createMemo(() => + Object.fromEntries( + multiSortBy( + Object.keys(explorerState()), + ( + [ + 'state', + 'routesById', + 'routesByPath', + 'flatRoutes', + 'options', + 'manifest', + ] as const + ).map((d) => (dd) => dd !== d), + ) + .map((key) => [key, (explorerState() as any)[key]]) + .filter( + (d) => + typeof d[1] !== 'function' && + ![ + '__store', + 'basepath', + 'injectedHtml', + 'subscribers', + 'latestLoadPromise', + 'navigateTimeout', + 'resetNextScroll', + 'tempLocationKey', + 'latestLocation', + 'routeTree', + 'history', + ].includes(d[0]), + ), + ), + ) + const activeMatchLoaderData = createMemo(() => activeMatch()?.loaderData) + const activeMatchValue = createMemo(() => activeMatch()) + const locationSearchValue = createMemo(() => routerState().location.search) + + return ( +
+ {handleDragStart ? ( +
+ ) : null} + +
+
+ { + if (setIsOpen) { + setIsOpen(false) + } + onCloseClick(e) + }} + /> +
+
+
+ { + return subEntries.filter( + (d: any) => typeof d.value() !== 'function', + ) + }} + /> +
+
+
+
+
+
+ Pathname + {routerState().location.maskedLocation ? ( +
+ masked +
+ ) : null} +
+
+ {routerState().location.pathname} + {routerState().location.maskedLocation ? ( + + {routerState().location.maskedLocation?.pathname} + + ) : null} +
+
+
+ + +
+
+
age / staleTime / gcTime
+
+
+
+ {!showMatches() ? ( + + ) : ( +
+ {(routerState().pendingMatches?.length + ? routerState().pendingMatches + : routerState().matches + )?.map((match: any, _i: any) => { + return ( +
+ setActiveId(activeId() === match.id ? '' : match.id) + } + class={cx(styles().matchRow(match === activeMatch()))} + > +
+ + } + right={} + > + + {`${match.routeId === rootRouteId ? rootRouteId : match.pathname}`} + + +
+ ) + })} +
+ )} +
+
+ {routerState().cachedMatches.length ? ( +
+
+
Cached Matches
+
+ age / staleTime / gcTime +
+
+
+ {routerState().cachedMatches.map((match: any) => { + return ( +
+ setActiveId(activeId() === match.id ? '' : match.id) + } + class={cx(styles().matchRow(match === activeMatch()))} + > +
+ + } + right={} + > + {`${match.id}`} + +
+ ) + })} +
+
+ ) : null} +
+ {activeMatch() && activeMatch()?.status ? ( +
+
Match Details
+
+
+
+
+ {activeMatch()?.status === 'success' && + activeMatch()?.isFetching + ? 'fetching' + : activeMatch()?.status} +
+
+
+
ID:
+
+ {activeMatch()?.id} +
+
+
+
State:
+
+ {routerState().pendingMatches?.find( + (d: any) => d.id === activeMatch()?.id, + ) + ? 'Pending' + : routerState().matches.find( + (d: any) => d.id === activeMatch()?.id, + ) + ? 'Active' + : 'Cached'} +
+
+
+
Last Updated:
+
+ {activeMatch()?.updatedAt + ? new Date(activeMatch()?.updatedAt).toLocaleTimeString() + : 'N/A'} +
+
+
+
+ {activeMatchLoaderData() ? ( + <> +
Loader Data
+
+ +
+ + ) : null} +
Explorer
+
+ +
+
+ ) : null} + {hasSearch() ? ( +
+
Search Params
+
+ { + obj[next] = {} + return obj + }, {})} + /> +
+
+ ) : null} +
+ ) + } + +export default BaseTanStackRouterDevtoolsPanel diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/Explorer.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/Explorer.tsx new file mode 100644 index 000000000..a43cb9c95 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/Explorer.tsx @@ -0,0 +1,339 @@ +/* eslint-disable @typescript-eslint/no-unnecessary-condition */ +import { clsx as cx } from 'clsx' +import * as goober from 'goober' +import { createMemo, createSignal, useContext } from 'solid-js' +import { tokens } from './tokens' +import { displayValue } from './utils' +import { ShadowDomTargetContext } from './context' +import type { Accessor, JSX } from 'solid-js' + +type ExpanderProps = { + expanded: boolean + style?: JSX.CSSProperties +} + +export const Expander = ({ expanded, style = {} }: ExpanderProps) => { + const styles = useStyles() + return ( + + + + + + ) +} + +type Entry = { + label: string +} + +type RendererProps = { + handleEntry: HandleEntryFn + label?: JSX.Element + value: Accessor + subEntries: Array + subEntryPages: Array> + type: string + expanded: Accessor + toggleExpanded: () => void + pageSize: number + filterSubEntries?: (subEntries: Array) => Array +} + +/** + * Chunk elements in the array by size + * + * when the array cannot be chunked evenly by size, the last chunk will be + * filled with the remaining elements + * + * @example + * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']] + */ +export function chunkArray(array: Array, size: number): Array> { + if (size < 1) return [] + let i = 0 + const result: Array> = [] + while (i < array.length) { + result.push(array.slice(i, i + size)) + i = i + size + } + return result +} + +type HandleEntryFn = (entry: Entry) => JSX.Element + +type ExplorerProps = Partial & { + defaultExpanded?: true | Record + value: Accessor +} + +type Property = { + defaultExpanded?: boolean | Record + label: string + value: unknown +} + +function isIterable(x: any): x is Iterable { + return Symbol.iterator in x +} + +export function Explorer({ + value, + defaultExpanded, + pageSize = 100, + filterSubEntries, + ...rest +}: ExplorerProps) { + const [expanded, setExpanded] = createSignal(Boolean(defaultExpanded)) + const toggleExpanded = () => setExpanded((old) => !old) + + const type = createMemo(() => typeof value()) + const subEntries = createMemo(() => { + let entries: Array = [] + + const makeProperty = (sub: { label: string; value: unknown }): Property => { + const subDefaultExpanded = + defaultExpanded === true + ? { [sub.label]: true } + : defaultExpanded?.[sub.label] + return { + ...sub, + value: () => sub.value, + defaultExpanded: subDefaultExpanded, + } + } + + if (Array.isArray(value())) { + // any[] + entries = (value() as Array).map((d, i) => + makeProperty({ + label: i.toString(), + value: d, + }), + ) + } else if ( + value() !== null && + typeof value() === 'object' && + isIterable(value()) && + typeof (value() as Iterable)[Symbol.iterator] === 'function' + ) { + // Iterable + entries = Array.from(value() as Iterable, (val, i) => + makeProperty({ + label: i.toString(), + value: val, + }), + ) + } else if (typeof value() === 'object' && value() !== null) { + // object + entries = Object.entries(value() as object).map(([key, val]) => + makeProperty({ + label: key, + value: val, + }), + ) + } + + return filterSubEntries ? filterSubEntries(entries) : entries + }) + + const subEntryPages = createMemo(() => chunkArray(subEntries(), pageSize)) + + const [expandedPages, setExpandedPages] = createSignal>([]) + const [valueSnapshot, setValueSnapshot] = createSignal(undefined) + const styles = useStyles() + + const refreshValueSnapshot = () => { + setValueSnapshot((value() as () => any)()) + } + + const handleEntry = (entry: Entry) => ( + + ) + + return ( +
+ {subEntryPages().length ? ( + <> + + {(expanded() ?? false) ? ( + subEntryPages().length === 1 ? ( +
+ {subEntries().map((entry, index) => handleEntry(entry))} +
+ ) : ( +
+ {subEntryPages().map((entries, index) => { + return ( +
+
+ + {expandedPages().includes(index) ? ( +
+ {entries.map((entry) => handleEntry(entry))} +
+ ) : null} +
+
+ ) + })} +
+ ) + ) : null} + + ) : type() === 'function' ? ( + <> + + {rest.label} 🔄{' '} + + } + value={valueSnapshot} + defaultExpanded={{}} + /> + + ) : ( + <> + {rest.label}:{' '} + {displayValue(value())} + + )} +
+ ) +} + +const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { + const { colors, font, size, alpha, shadow, border } = tokens + const { fontFamily, lineHeight, size: fontSize } = font + const css = shadowDOMTarget + ? goober.css.bind({ target: shadowDOMTarget }) + : goober.css + + return { + entry: css` + font-family: ${fontFamily.mono}; + font-size: ${fontSize.xs}; + line-height: ${lineHeight.sm}; + outline: none; + word-break: break-word; + `, + labelButton: css` + cursor: pointer; + color: inherit; + font: inherit; + outline: inherit; + background: transparent; + border: none; + padding: 0; + `, + expander: css` + display: inline-flex; + align-items: center; + justify-content: center; + width: ${size[3]}; + height: ${size[3]}; + padding-left: 3px; + box-sizing: content-box; + `, + expanderIcon: (expanded: boolean) => { + if (expanded) { + return css` + transform: rotate(90deg); + transition: transform 0.1s ease; + ` + } + return css` + transform: rotate(0deg); + transition: transform 0.1s ease; + ` + }, + expandButton: css` + display: flex; + gap: ${size[1]}; + align-items: center; + cursor: pointer; + color: inherit; + font: inherit; + outline: inherit; + background: transparent; + border: none; + padding: 0; + `, + value: css` + color: ${colors.purple[400]}; + `, + subEntries: css` + margin-left: ${size[2]}; + padding-left: ${size[2]}; + border-left: 2px solid ${colors.darkGray[400]}; + `, + info: css` + color: ${colors.gray[500]}; + font-size: ${fontSize['2xs']}; + padding-left: ${size[1]}; + `, + refreshValueBtn: css` + appearance: none; + border: 0; + cursor: pointer; + background: transparent; + color: inherit; + padding: 0; + font-family: ${fontFamily.mono}; + font-size: ${fontSize.xs}; + `, + } +} + +function useStyles() { + const shadowDomTarget = useContext(ShadowDomTargetContext) + const [_styles] = createSignal(stylesFactory(shadowDomTarget)) + return _styles +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx new file mode 100644 index 000000000..f8eca4d4b --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx @@ -0,0 +1,290 @@ +import { clsx as cx } from 'clsx' + +import { createEffect, createMemo, createSignal } from 'solid-js' +import { Dynamic } from 'solid-js/web' + +import { DevtoolsOnCloseContext } from './context' +import { useIsMounted } from './utils' +import { BaseTanStackRouterDevtoolsPanel } from './BaseTanStackRouterDevtoolsPanel' +import useLocalStorage from './useLocalStorage' +import { TanStackLogo } from './logo' +import { useStyles } from './useStyles' +import type { Accessor, JSX } from 'solid-js' +import type { AnyRouter } from '@tanstack/router-core' + +export interface FloatingDevtoolsOptions { + /** + * Set this true if you want the dev tools to default to being open + */ + initialIsOpen?: boolean + /** + * Use this to add props to the panel. For example, you can add class, style (merge and override default style), etc. + */ + panelProps?: any & { + ref?: any + } + /** + * Use this to add props to the close button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. + */ + closeButtonProps?: any & { + ref?: any + } + /** + * Use this to add props to the toggle button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. + */ + toggleButtonProps?: any & { + ref?: any + } + /** + * The position of the TanStack Router logo to open and close the devtools panel. + * Defaults to 'bottom-left'. + */ + position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + /** + * Use this to render the devtools inside a different type of container element for a11y purposes. + * Any string which corresponds to a valid intrinsic JSX element is allowed. + * Defaults to 'footer'. + */ + containerElement?: string | any + /** + * A boolean variable indicating if the "lite" version of the library is being used + */ + router: Accessor + routerState: Accessor + /** + * Use this to attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +export function FloatingTanStackRouterDevtools({ + initialIsOpen, + panelProps = {}, + closeButtonProps = {}, + toggleButtonProps = {}, + position = 'bottom-left', + containerElement: Container = 'footer', + router, + routerState, + shadowDOMTarget, +}: FloatingDevtoolsOptions): JSX.Element | null { + const [rootEl, setRootEl] = createSignal() + + // eslint-disable-next-line prefer-const + let panelRef: HTMLDivElement | undefined = undefined + + const [isOpen, setIsOpen] = useLocalStorage( + 'tanstackRouterDevtoolsOpen', + initialIsOpen, + ) + + const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage( + 'tanstackRouterDevtoolsHeight', + null, + ) + + const [isResolvedOpen, setIsResolvedOpen] = createSignal(false) + const [isResizing, setIsResizing] = createSignal(false) + const isMounted = useIsMounted() + const styles = useStyles() + + const handleDragStart = ( + panelElement: HTMLDivElement | undefined, + startEvent: any, + ) => { + if (startEvent.button !== 0) return // Only allow left click for drag + + setIsResizing(true) + + const dragInfo = { + originalHeight: panelElement?.getBoundingClientRect().height ?? 0, + pageY: startEvent.pageY, + } + + const run = (moveEvent: MouseEvent) => { + const delta = dragInfo.pageY - moveEvent.pageY + const newHeight = dragInfo.originalHeight + delta + + setDevtoolsHeight(newHeight) + + if (newHeight < 70) { + setIsOpen(false) + } else { + setIsOpen(true) + } + } + + const unsub = () => { + setIsResizing(false) + document.removeEventListener('mousemove', run) + document.removeEventListener('mouseUp', unsub) + } + + document.addEventListener('mousemove', run) + document.addEventListener('mouseup', unsub) + } + + const isButtonClosed = isOpen() ?? false + + createEffect(() => { + setIsResolvedOpen(isOpen() ?? false) + }) + + createEffect(() => { + if (isResolvedOpen()) { + const previousValue = rootEl()?.parentElement?.style.paddingBottom + + const run = () => { + const containerHeight = panelRef!.getBoundingClientRect().height + if (rootEl()?.parentElement) { + setRootEl((prev) => { + if (prev?.parentElement) { + prev.parentElement.style.paddingBottom = `${containerHeight}px` + } + return prev + }) + } + } + + run() + + if (typeof window !== 'undefined') { + window.addEventListener('resize', run) + + return () => { + window.removeEventListener('resize', run) + if (rootEl()?.parentElement && typeof previousValue === 'string') { + setRootEl((prev) => { + prev!.parentElement!.style.paddingBottom = previousValue + return prev + }) + } + } + } + } else { + // Reset padding when devtools are closed + if (rootEl()?.parentElement) { + setRootEl((prev) => { + if (prev?.parentElement) { + prev.parentElement.removeAttribute('style') + } + return prev + }) + } + } + return + }) + + createEffect(() => { + if (rootEl()) { + const el = rootEl() + const fontSize = getComputedStyle(el!).fontSize + el?.style.setProperty('--tsrd-font-size', fontSize) + } + }) + + const { style: panelStyle = {}, ...otherPanelProps } = panelProps as { + style?: Record + } + + const { + style: closeButtonStyle = {}, + onClick: onCloseClick, + ...otherCloseButtonProps + } = closeButtonProps + + const { + onClick: onToggleClick, + class: toggleButtonClassName, + ...otherToggleButtonProps + } = toggleButtonProps + + // Do not render on the server + if (!isMounted()) return null + + const resolvedHeight = createMemo(() => devtoolsHeight() ?? 500) + + const basePanelClass = createMemo(() => { + return cx( + styles().devtoolsPanelContainer, + styles().devtoolsPanelContainerVisibility(!!isOpen()), + styles().devtoolsPanelContainerResizing(isResizing), + styles().devtoolsPanelContainerAnimation( + isResolvedOpen(), + resolvedHeight() + 16, + ), + ) + }) + + const basePanelStyle = createMemo(() => { + return { + height: `${resolvedHeight()}px`, + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + ...(panelStyle || {}), + } + }) + + const buttonStyle = createMemo(() => { + return cx( + styles().mainCloseBtn, + styles().mainCloseBtnPosition(position), + styles().mainCloseBtnAnimation(!!isOpen()), + toggleButtonClassName, + ) + }) + + return ( + + {}), + }} + > + {/* {router() ? ( */} + handleDragStart(panelRef, e)} + shadowDOMTarget={shadowDOMTarget} + /> + {/* ) : ( +

No router

+ )} */} +
+ + +
+ ) +} + +export default FloatingTanStackRouterDevtools diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/NavigateButton.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/NavigateButton.tsx new file mode 100644 index 000000000..8f9e5161f --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/NavigateButton.tsx @@ -0,0 +1,25 @@ +import { useStyles } from './useStyles' +import type { AnyRouter, NavigateOptions } from '@tanstack/router-core' +import type { Accessor } from 'solid-js' + +interface Props extends NavigateOptions { + router: Accessor +} + +export function NavigateButton({ to, params, search, router }: Props) { + const styles = useStyles() + + return ( + + ) +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx new file mode 100644 index 000000000..4fcd27c93 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx @@ -0,0 +1,163 @@ +import { createSignal, lazy } from 'solid-js' +import { render } from 'solid-js/web' +import { ShadowDomTargetContext } from './context' +import type { AnyRouter } from '@tanstack/router-core' +import type { Signal } from 'solid-js' + +interface DevtoolsOptions { + /** + * Set this true if you want the dev tools to default to being open + */ + initialIsOpen?: boolean + /** + * Use this to add props to the panel. For example, you can add class, style (merge and override default style), etc. + */ + panelProps?: any & { + ref?: any + } + /** + * Use this to add props to the close button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. + */ + closeButtonProps?: any & { + ref?: any + } + /** + * Use this to add props to the toggle button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. + */ + toggleButtonProps?: any & { + ref?: any + } + /** + * The position of the TanStack Router logo to open and close the devtools panel. + * Defaults to 'bottom-left'. + */ + position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + /** + * Use this to render the devtools inside a different type of container element for a11y purposes. + * Any string which corresponds to a valid intrinsic JSX element is allowed. + * Defaults to 'footer'. + */ + containerElement?: string | any + /** + * A boolean variable indicating if the "lite" version of the library is being used + */ + router: AnyRouter + routerState: any + /** + * Use this to attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +class TanStackRouterDevtoolsCore { + #router: Signal + #routerState: Signal + #position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + #initialIsOpen: boolean + #shadowDOMTarget?: ShadowRoot + + #panelProps: any + #closeButtonProps: any + #toggleButtonProps: any + #containerElement?: string | any + + #isMounted = false + #Component: any + #dispose?: () => void + + constructor(config: DevtoolsOptions) { + this.#router = createSignal(config.router) + this.#routerState = createSignal(config.routerState) + this.#position = config.position ?? 'bottom-left' + this.#initialIsOpen = config.initialIsOpen ?? false + this.#shadowDOMTarget = config.shadowDOMTarget + + this.#panelProps = config.panelProps + this.#closeButtonProps = config.closeButtonProps + this.#toggleButtonProps = config.toggleButtonProps + this.#containerElement = config.containerElement + } + + mount(el: T) { + if (this.#isMounted) { + throw new Error('Devtools is already mounted') + } + + const dispose = render(() => { + const [router] = this.#router + const [routerState] = this.#routerState + const position = this.#position + const initialIsOpen = this.#initialIsOpen + const shadowDOMTarget = this.#shadowDOMTarget + + const panelProps = this.#panelProps + const closeButtonProps = this.#closeButtonProps + const toggleButtonProps = this.#toggleButtonProps + const containerElement = this.#containerElement + + let Devtools + + if (this.#Component) { + Devtools = this.#Component + } else { + Devtools = lazy(() => import('./FloatingTanStackRouterDevtools')) + this.#Component = Devtools + } + + return ( + + + + ) + }, el) + + this.#isMounted = true + this.#dispose = dispose + } + + unmount() { + if (!this.#isMounted) { + throw new Error('Devtools is not mounted') + } + this.#dispose?.() + this.#isMounted = false + } + + setRouter(router: AnyRouter) { + this.#router[1](router) + } + + setRouterState(routerState: any) { + this.#routerState[1](routerState) + } + + setOptions(options: Partial) { + if (options.position !== undefined) { + this.#position = options.position + } + + if (options.initialIsOpen !== undefined) { + this.#initialIsOpen = options.initialIsOpen + } + + if (options.shadowDOMTarget !== undefined) { + this.#shadowDOMTarget = options.shadowDOMTarget + } + + if (options.containerElement !== undefined) { + this.#containerElement = options.containerElement + } + } +} + +export { TanStackRouterDevtoolsCore } diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsPanelCore.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsPanelCore.tsx new file mode 100644 index 000000000..a76ebdf36 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsPanelCore.tsx @@ -0,0 +1,131 @@ +import { render } from 'solid-js/web' +import { createSignal, lazy } from 'solid-js' +import { DevtoolsOnCloseContext, ShadowDomTargetContext } from './context' +import type { JSX } from 'solid-js' +import type { AnyRouter } from '@tanstack/router-core' + +interface TanStackRouterDevtoolsPanelCoreOptions { + /** + * The standard React style object used to style a component with inline styles + */ + style?: JSX.CSSProperties + /** + * The standard React class property used to style a component with classes + */ + className?: string + /** + * A boolean variable indicating whether the panel is open or closed + */ + isOpen?: boolean + /** + * A function that toggles the open and close state of the panel + */ + setIsOpen?: (isOpen: boolean) => void + /** + * Handles the opening and closing the devtools panel + */ + handleDragStart?: (e: any) => void + /** + * A boolean variable indicating if the "lite" version of the library is being used + */ + router: AnyRouter + + routerState: any + /** + * Use this to attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +class TanStackRouterDevtoolsPanelCore { + #router: any + #routerState: any + #shadowDOMTarget?: ShadowRoot + #isMounted = false + #setIsOpen?: (isOpen: boolean) => void + #dispose?: () => void + #Component: any + + constructor(config: TanStackRouterDevtoolsPanelCoreOptions) { + const { router, routerState, shadowDOMTarget, setIsOpen } = config + + this.#router = createSignal(router) + this.#routerState = createSignal(routerState) + this.#shadowDOMTarget = shadowDOMTarget + this.#setIsOpen = setIsOpen + } + + mount(el: T) { + if (this.#isMounted) { + throw new Error('Devtools is already mounted') + } + + const dispose = render(() => { + const [router] = this.#router + const [routerState] = this.#routerState + const shadowDOMTarget = this.#shadowDOMTarget + const setIsOpen = this.#setIsOpen + + let BaseTanStackRouterDevtoolsPanel + + if (this.#Component) { + BaseTanStackRouterDevtoolsPanel = this.#Component + } else { + BaseTanStackRouterDevtoolsPanel = lazy( + () => import('./BaseTanStackRouterDevtoolsPanel'), + ) + this.#Component = BaseTanStackRouterDevtoolsPanel + } + + return ( + + {}, + }} + > + + + + ) + }, el) + + this.#isMounted = true + this.#dispose = dispose + } + + unmount() { + if (!this.#isMounted) { + throw new Error('Devtools is not mounted') + } + this.#dispose?.() + this.#isMounted = false + } + + setRouter(router: AnyRouter) { + this.#router[1](router) + } + + setRouterState(routerState: any) { + this.#routerState[1](routerState) + } + + setOptions(options: Partial) { + if (options.shadowDOMTarget !== undefined) { + this.#shadowDOMTarget = options.shadowDOMTarget + } + if (options.router !== undefined) { + this.setRouter(options.router) + } + if (options.routerState !== undefined) { + this.setRouterState(options.routerState) + } + } +} + +export { TanStackRouterDevtoolsPanelCore } diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/context.ts b/devtools-reference/tanstack-router/router-devtools-core/src/context.ts new file mode 100644 index 000000000..c95021207 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/context.ts @@ -0,0 +1,24 @@ +import { createContext, useContext } from 'solid-js' + +export const ShadowDomTargetContext = createContext( + undefined, +) + +export const DevtoolsOnCloseContext = createContext< + | { + onCloseClick: ( + e: MouseEvent & { currentTarget: HTMLButtonElement; target: Element }, + ) => void + } + | undefined +>(undefined) + +export const useDevtoolsOnClose = () => { + const context = useContext(DevtoolsOnCloseContext) + if (!context) { + throw new Error( + 'useDevtoolsOnClose must be used within a TanStackRouterDevtools component', + ) + } + return context +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/index.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/index.tsx new file mode 100644 index 000000000..a24a59a74 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/index.tsx @@ -0,0 +1,2 @@ +export { TanStackRouterDevtoolsCore } from './TanStackRouterDevtoolsCore' +export { TanStackRouterDevtoolsPanelCore } from './TanStackRouterDevtoolsPanelCore' diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/logo.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/logo.tsx new file mode 100644 index 000000000..c5a0b79a0 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/logo.tsx @@ -0,0 +1,817 @@ +import { createUniqueId } from 'solid-js' + +export function TanStackLogo() { + const id = createUniqueId() + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/theme.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/theme.tsx new file mode 100644 index 000000000..4053cc8fd --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/theme.tsx @@ -0,0 +1,36 @@ +import { createContext, useContext } from 'solid-js' +import type { JSX } from 'solid-js' + +export const defaultTheme = { + background: '#222222', + backgroundAlt: '#292929', + foreground: 'white', + gray: '#444', + grayAlt: '#444', + inputBackgroundColor: '#fff', + inputTextColor: '#000', + success: '#80cb00', + danger: '#ff0085', + active: '#0099ff', + warning: '#ffb200', +} as const + +export type Theme = typeof defaultTheme +interface ProviderProps { + theme: Theme + children?: JSX.Element +} + +const ThemeContext = createContext(defaultTheme) + +export function ThemeProvider({ children, theme, ...rest }: ProviderProps) { + return ( + + {children} + + ) +} + +export function useTheme() { + return useContext(ThemeContext) +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/tokens.ts b/devtools-reference/tanstack-router/router-devtools-core/src/tokens.ts new file mode 100644 index 000000000..9d247cf18 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/tokens.ts @@ -0,0 +1,305 @@ +export const tokens = { + colors: { + inherit: 'inherit', + current: 'currentColor', + transparent: 'transparent', + black: '#000000', + white: '#ffffff', + neutral: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + darkGray: { + 50: '#525c7a', + 100: '#49536e', + 200: '#414962', + 300: '#394056', + 400: '#313749', + 500: '#292e3d', + 600: '#212530', + 700: '#191c24', + 800: '#111318', + 900: '#0b0d10', + }, + gray: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + blue: { + 25: '#F5FAFF', + 50: '#EFF8FF', + 100: '#D1E9FF', + 200: '#B2DDFF', + 300: '#84CAFF', + 400: '#53B1FD', + 500: '#2E90FA', + 600: '#1570EF', + 700: '#175CD3', + 800: '#1849A9', + 900: '#194185', + }, + green: { + 25: '#F6FEF9', + 50: '#ECFDF3', + 100: '#D1FADF', + 200: '#A6F4C5', + 300: '#6CE9A6', + 400: '#32D583', + 500: '#12B76A', + 600: '#039855', + 700: '#027A48', + 800: '#05603A', + 900: '#054F31', + }, + red: { + 50: '#fef2f2', + 100: '#fee2e2', + 200: '#fecaca', + 300: '#fca5a5', + 400: '#f87171', + 500: '#ef4444', + 600: '#dc2626', + 700: '#b91c1c', + 800: '#991b1b', + 900: '#7f1d1d', + 950: '#450a0a', + }, + yellow: { + 25: '#FFFCF5', + 50: '#FFFAEB', + 100: '#FEF0C7', + 200: '#FEDF89', + 300: '#FEC84B', + 400: '#FDB022', + 500: '#F79009', + 600: '#DC6803', + 700: '#B54708', + 800: '#93370D', + 900: '#7A2E0E', + }, + purple: { + 25: '#FAFAFF', + 50: '#F4F3FF', + 100: '#EBE9FE', + 200: '#D9D6FE', + 300: '#BDB4FE', + 400: '#9B8AFB', + 500: '#7A5AF8', + 600: '#6938EF', + 700: '#5925DC', + 800: '#4A1FB8', + 900: '#3E1C96', + }, + teal: { + 25: '#F6FEFC', + 50: '#F0FDF9', + 100: '#CCFBEF', + 200: '#99F6E0', + 300: '#5FE9D0', + 400: '#2ED3B7', + 500: '#15B79E', + 600: '#0E9384', + 700: '#107569', + 800: '#125D56', + 900: '#134E48', + }, + pink: { + 25: '#fdf2f8', + 50: '#fce7f3', + 100: '#fbcfe8', + 200: '#f9a8d4', + 300: '#f472b6', + 400: '#ec4899', + 500: '#db2777', + 600: '#be185d', + 700: '#9d174d', + 800: '#831843', + 900: '#500724', + }, + cyan: { + 25: '#ecfeff', + 50: '#cffafe', + 100: '#a5f3fc', + 200: '#67e8f9', + 300: '#22d3ee', + 400: '#06b6d4', + 500: '#0891b2', + 600: '#0e7490', + 700: '#155e75', + 800: '#164e63', + 900: '#083344', + }, + }, + alpha: { + 100: 'ff', + 90: 'e5', + 80: 'cc', + 70: 'b3', + 60: '99', + 50: '80', + 40: '66', + 30: '4d', + 20: '33', + 10: '1a', + 0: '00', + }, + font: { + size: { + '2xs': 'calc(var(--tsrd-font-size) * 0.625)', + xs: 'calc(var(--tsrd-font-size) * 0.75)', + sm: 'calc(var(--tsrd-font-size) * 0.875)', + md: 'var(--tsrd-font-size)', + lg: 'calc(var(--tsrd-font-size) * 1.125)', + xl: 'calc(var(--tsrd-font-size) * 1.25)', + '2xl': 'calc(var(--tsrd-font-size) * 1.5)', + '3xl': 'calc(var(--tsrd-font-size) * 1.875)', + '4xl': 'calc(var(--tsrd-font-size) * 2.25)', + '5xl': 'calc(var(--tsrd-font-size) * 3)', + '6xl': 'calc(var(--tsrd-font-size) * 3.75)', + '7xl': 'calc(var(--tsrd-font-size) * 4.5)', + '8xl': 'calc(var(--tsrd-font-size) * 6)', + '9xl': 'calc(var(--tsrd-font-size) * 8)', + }, + lineHeight: { + '3xs': 'calc(var(--tsrd-font-size) * 0.75)', + '2xs': 'calc(var(--tsrd-font-size) * 0.875)', + xs: 'calc(var(--tsrd-font-size) * 1)', + sm: 'calc(var(--tsrd-font-size) * 1.25)', + md: 'calc(var(--tsrd-font-size) * 1.5)', + lg: 'calc(var(--tsrd-font-size) * 1.75)', + xl: 'calc(var(--tsrd-font-size) * 2)', + '2xl': 'calc(var(--tsrd-font-size) * 2.25)', + '3xl': 'calc(var(--tsrd-font-size) * 2.5)', + '4xl': 'calc(var(--tsrd-font-size) * 2.75)', + '5xl': 'calc(var(--tsrd-font-size) * 3)', + '6xl': 'calc(var(--tsrd-font-size) * 3.25)', + '7xl': 'calc(var(--tsrd-font-size) * 3.5)', + '8xl': 'calc(var(--tsrd-font-size) * 3.75)', + '9xl': 'calc(var(--tsrd-font-size) * 4)', + }, + weight: { + thin: '100', + extralight: '200', + light: '300', + normal: '400', + medium: '500', + semibold: '600', + bold: '700', + extrabold: '800', + black: '900', + }, + fontFamily: { + sans: 'ui-sans-serif, Inter, system-ui, sans-serif, sans-serif', + mono: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace`, + }, + }, + breakpoints: { + xs: '320px', + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + '2xl': '1536px', + }, + border: { + radius: { + none: '0px', + xs: 'calc(var(--tsrd-font-size) * 0.125)', + sm: 'calc(var(--tsrd-font-size) * 0.25)', + md: 'calc(var(--tsrd-font-size) * 0.375)', + lg: 'calc(var(--tsrd-font-size) * 0.5)', + xl: 'calc(var(--tsrd-font-size) * 0.75)', + '2xl': 'calc(var(--tsrd-font-size) * 1)', + '3xl': 'calc(var(--tsrd-font-size) * 1.5)', + full: '9999px', + }, + }, + size: { + 0: '0px', + 0.25: 'calc(var(--tsrd-font-size) * 0.0625)', + 0.5: 'calc(var(--tsrd-font-size) * 0.125)', + 1: 'calc(var(--tsrd-font-size) * 0.25)', + 1.5: 'calc(var(--tsrd-font-size) * 0.375)', + 2: 'calc(var(--tsrd-font-size) * 0.5)', + 2.5: 'calc(var(--tsrd-font-size) * 0.625)', + 3: 'calc(var(--tsrd-font-size) * 0.75)', + 3.5: 'calc(var(--tsrd-font-size) * 0.875)', + 4: 'calc(var(--tsrd-font-size) * 1)', + 4.5: 'calc(var(--tsrd-font-size) * 1.125)', + 5: 'calc(var(--tsrd-font-size) * 1.25)', + 5.5: 'calc(var(--tsrd-font-size) * 1.375)', + 6: 'calc(var(--tsrd-font-size) * 1.5)', + 6.5: 'calc(var(--tsrd-font-size) * 1.625)', + 7: 'calc(var(--tsrd-font-size) * 1.75)', + 8: 'calc(var(--tsrd-font-size) * 2)', + 9: 'calc(var(--tsrd-font-size) * 2.25)', + 10: 'calc(var(--tsrd-font-size) * 2.5)', + 11: 'calc(var(--tsrd-font-size) * 2.75)', + 12: 'calc(var(--tsrd-font-size) * 3)', + 14: 'calc(var(--tsrd-font-size) * 3.5)', + 16: 'calc(var(--tsrd-font-size) * 4)', + 20: 'calc(var(--tsrd-font-size) * 5)', + 24: 'calc(var(--tsrd-font-size) * 6)', + 28: 'calc(var(--tsrd-font-size) * 7)', + 32: 'calc(var(--tsrd-font-size) * 8)', + 36: 'calc(var(--tsrd-font-size) * 9)', + 40: 'calc(var(--tsrd-font-size) * 10)', + 44: 'calc(var(--tsrd-font-size) * 11)', + 48: 'calc(var(--tsrd-font-size) * 12)', + 52: 'calc(var(--tsrd-font-size) * 13)', + 56: 'calc(var(--tsrd-font-size) * 14)', + 60: 'calc(var(--tsrd-font-size) * 15)', + 64: 'calc(var(--tsrd-font-size) * 16)', + 72: 'calc(var(--tsrd-font-size) * 18)', + 80: 'calc(var(--tsrd-font-size) * 20)', + 96: 'calc(var(--tsrd-font-size) * 24)', + }, + shadow: { + xs: (_: string = 'rgb(0 0 0 / 0.1)') => + `0 1px 2px 0 rgb(0 0 0 / 0.05)` as const, + sm: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}` as const, + md: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}` as const, + lg: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}` as const, + xl: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}` as const, + '2xl': (color: string = 'rgb(0 0 0 / 0.25)') => + `0 25px 50px -12px ${color}` as const, + inner: (color: string = 'rgb(0 0 0 / 0.05)') => + `inset 0 2px 4px 0 ${color}` as const, + none: () => `none` as const, + }, + zIndices: { + hide: -1, + auto: 'auto', + base: 0, + docked: 10, + dropdown: 1000, + sticky: 1100, + banner: 1200, + overlay: 1300, + modal: 1400, + popover: 1500, + skipLink: 1600, + toast: 1700, + tooltip: 1800, + }, +} as const diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/useLocalStorage.ts b/devtools-reference/tanstack-router/router-devtools-core/src/useLocalStorage.ts new file mode 100644 index 000000000..122bc9288 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/useLocalStorage.ts @@ -0,0 +1,52 @@ +import { createEffect, createSignal } from 'solid-js' +import type { Accessor } from 'solid-js' + +const getItem = (key: string): unknown => { + try { + const itemValue = localStorage.getItem(key) + if (typeof itemValue === 'string') { + return JSON.parse(itemValue) + } + return undefined + } catch { + return undefined + } +} + +export default function useLocalStorage( + key: string, + defaultValue: T | undefined, +): [Accessor, (newVal: T | ((prevVal: T) => T)) => void] { + const [value, setValue] = createSignal() + + createEffect(() => { + const initialValue = getItem(key) as T | undefined + + if (typeof initialValue === 'undefined' || initialValue === null) { + setValue( + typeof defaultValue === 'function' ? defaultValue() : defaultValue, + ) + } else { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + setValue(initialValue) + } + }) + + const setter = (updater: any) => { + setValue((old) => { + let newVal = updater + + if (typeof updater == 'function') { + newVal = updater(old) + } + try { + localStorage.setItem(key, JSON.stringify(newVal)) + } catch {} + + return newVal + }) + } + + return [value, setter] +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/useMediaQuery.ts b/devtools-reference/tanstack-router/router-devtools-core/src/useMediaQuery.ts new file mode 100644 index 000000000..4d59a6bf2 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/useMediaQuery.ts @@ -0,0 +1,44 @@ +import { createEffect, createSignal } from 'solid-js' +import type { Accessor } from 'solid-js' + +export default function useMediaQuery( + query: string, +): Accessor { + // Keep track of the preference in state, start with the current match + const [isMatch, setIsMatch] = createSignal(() => { + if (typeof window !== 'undefined') { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + return window.matchMedia && window.matchMedia(query).matches + } + return + }) + + // Watch for changes + createEffect(() => { + if (typeof window !== 'undefined') { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!window.matchMedia) { + return + } + + // Create a matcher + const matcher = window.matchMedia(query) + + // Create our handler + const onChange = ({ matches }: { matches: boolean }) => + setIsMatch(() => () => matches) + + // Listen for changes + matcher.addListener(onChange) + + return () => { + // Stop listening for changes + matcher.removeListener(onChange) + } + } + + return + }) + + return isMatch() +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/useStyles.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/useStyles.tsx new file mode 100644 index 000000000..d1a12ad57 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/useStyles.tsx @@ -0,0 +1,614 @@ +import * as goober from 'goober' +import { createSignal, useContext } from 'solid-js' +import { tokens } from './tokens' +import { ShadowDomTargetContext } from './context' +import type { Accessor } from 'solid-js' + +const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { + const { colors, font, size, alpha, shadow, border } = tokens + const { fontFamily, lineHeight, size: fontSize } = font + const css = shadowDOMTarget + ? goober.css.bind({ target: shadowDOMTarget }) + : goober.css + + return { + devtoolsPanelContainer: css` + direction: ltr; + position: fixed; + bottom: 0; + right: 0; + z-index: 99999; + width: 100%; + max-height: 90%; + border-top: 1px solid ${colors.gray[700]}; + transform-origin: top; + `, + devtoolsPanelContainerVisibility: (isOpen: boolean) => { + return css` + visibility: ${isOpen ? 'visible' : 'hidden'}; + ` + }, + devtoolsPanelContainerResizing: (isResizing: Accessor) => { + if (isResizing()) { + return css` + transition: none; + ` + } + + return css` + transition: all 0.4s ease; + ` + }, + devtoolsPanelContainerAnimation: (isOpen: boolean, height: number) => { + if (isOpen) { + return css` + pointer-events: auto; + transform: translateY(0); + ` + } + return css` + pointer-events: none; + transform: translateY(${height}px); + ` + }, + logo: css` + cursor: pointer; + display: flex; + flex-direction: column; + background-color: transparent; + border: none; + font-family: ${fontFamily.sans}; + gap: ${tokens.size[0.5]}; + padding: 0px; + &:hover { + opacity: 0.7; + } + &:focus-visible { + outline-offset: 4px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + `, + tanstackLogo: css` + font-size: ${font.size.md}; + font-weight: ${font.weight.bold}; + line-height: ${font.lineHeight.xs}; + white-space: nowrap; + color: ${colors.gray[300]}; + `, + routerLogo: css` + font-weight: ${font.weight.semibold}; + font-size: ${font.size.xs}; + background: linear-gradient(to right, #84cc16, #10b981); + background-clip: text; + -webkit-background-clip: text; + line-height: 1; + -webkit-text-fill-color: transparent; + white-space: nowrap; + `, + devtoolsPanel: css` + display: flex; + font-size: ${fontSize.sm}; + font-family: ${fontFamily.sans}; + background-color: ${colors.darkGray[700]}; + color: ${colors.gray[300]}; + + @media (max-width: 700px) { + flex-direction: column; + } + @media (max-width: 600px) { + font-size: ${fontSize.xs}; + } + `, + dragHandle: css` + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 4px; + cursor: row-resize; + z-index: 100000; + &:hover { + background-color: ${colors.purple[400]}${alpha[90]}; + } + `, + firstContainer: css` + flex: 1 1 500px; + min-height: 40%; + max-height: 100%; + overflow: auto; + border-right: 1px solid ${colors.gray[700]}; + display: flex; + flex-direction: column; + `, + routerExplorerContainer: css` + overflow-y: auto; + flex: 1; + `, + routerExplorer: css` + padding: ${tokens.size[2]}; + `, + row: css` + display: flex; + align-items: center; + padding: ${tokens.size[2]} ${tokens.size[2.5]}; + gap: ${tokens.size[2.5]}; + border-bottom: ${colors.darkGray[500]} 1px solid; + align-items: center; + `, + detailsHeader: css` + font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; + position: sticky; + top: 0; + z-index: 2; + background-color: ${colors.darkGray[600]}; + padding: 0px ${tokens.size[2]}; + font-weight: ${font.weight.medium}; + font-size: ${font.size.xs}; + min-height: ${tokens.size[8]}; + line-height: ${font.lineHeight.xs}; + text-align: left; + display: flex; + align-items: center; + `, + maskedBadge: css` + background: ${colors.yellow[900]}${alpha[70]}; + color: ${colors.yellow[300]}; + display: inline-block; + padding: ${tokens.size[0]} ${tokens.size[2.5]}; + border-radius: ${border.radius.full}; + font-size: ${font.size.xs}; + font-weight: ${font.weight.normal}; + border: 1px solid ${colors.yellow[300]}; + `, + maskedLocation: css` + color: ${colors.yellow[300]}; + `, + detailsContent: css` + padding: ${tokens.size[1.5]} ${tokens.size[2]}; + display: flex; + align-items: center; + justify-content: space-between; + font-size: ${font.size.xs}; + `, + routeMatchesToggle: css` + display: flex; + align-items: center; + border: 1px solid ${colors.gray[500]}; + border-radius: ${border.radius.sm}; + overflow: hidden; + `, + routeMatchesToggleBtn: (active: boolean, showBorder: boolean) => { + const base = css` + appearance: none; + border: none; + font-size: 12px; + padding: 4px 8px; + background: transparent; + cursor: pointer; + font-family: ${fontFamily.sans}; + font-weight: ${font.weight.medium}; + ` + const classes = [base] + + if (active) { + const activeStyles = css` + background: ${colors.darkGray[400]}; + color: ${colors.gray[300]}; + ` + classes.push(activeStyles) + } else { + const inactiveStyles = css` + color: ${colors.gray[500]}; + background: ${colors.darkGray[800]}${alpha[20]}; + ` + classes.push(inactiveStyles) + } + + if (showBorder) { + classes.push(css` + border-right: 1px solid ${tokens.colors.gray[500]}; + `) + } + + return classes + }, + detailsHeaderInfo: css` + flex: 1; + justify-content: flex-end; + display: flex; + align-items: center; + font-weight: ${font.weight.normal}; + color: ${colors.gray[400]}; + `, + matchRow: (active: boolean) => { + const base = css` + display: flex; + border-bottom: 1px solid ${colors.darkGray[400]}; + cursor: pointer; + align-items: center; + padding: ${size[1]} ${size[2]}; + gap: ${size[2]}; + font-size: ${fontSize.xs}; + color: ${colors.gray[300]}; + ` + const classes = [base] + + if (active) { + const activeStyles = css` + background: ${colors.darkGray[500]}; + ` + classes.push(activeStyles) + } + + return classes + }, + matchIndicator: ( + color: 'green' | 'red' | 'yellow' | 'gray' | 'blue' | 'purple', + ) => { + const base = css` + flex: 0 0 auto; + width: ${size[3]}; + height: ${size[3]}; + background: ${colors[color][900]}; + border: 1px solid ${colors[color][500]}; + border-radius: ${border.radius.full}; + transition: all 0.25s ease-out; + box-sizing: border-box; + ` + const classes = [base] + + if (color === 'gray') { + const grayStyles = css` + background: ${colors.gray[700]}; + border-color: ${colors.gray[400]}; + ` + classes.push(grayStyles) + } + + return classes + }, + matchID: css` + flex: 1; + line-height: ${lineHeight['xs']}; + `, + ageTicker: (showWarning: boolean) => { + const base = css` + display: flex; + gap: ${size[1]}; + font-size: ${fontSize.xs}; + color: ${colors.gray[400]}; + font-variant-numeric: tabular-nums; + line-height: ${lineHeight['xs']}; + ` + + const classes = [base] + + if (showWarning) { + const warningStyles = css` + color: ${colors.yellow[400]}; + ` + classes.push(warningStyles) + } + + return classes + }, + secondContainer: css` + flex: 1 1 500px; + min-height: 40%; + max-height: 100%; + overflow: auto; + border-right: 1px solid ${colors.gray[700]}; + display: flex; + flex-direction: column; + `, + thirdContainer: css` + flex: 1 1 500px; + overflow: auto; + display: flex; + flex-direction: column; + height: 100%; + border-right: 1px solid ${colors.gray[700]}; + + @media (max-width: 700px) { + border-top: 2px solid ${colors.gray[700]}; + } + `, + fourthContainer: css` + flex: 1 1 500px; + min-height: 40%; + max-height: 100%; + overflow: auto; + display: flex; + flex-direction: column; + `, + routesContainer: css` + overflow-x: auto; + overflow-y: visible; + `, + routesRowContainer: (active: boolean, isMatch: boolean) => { + const base = css` + display: flex; + border-bottom: 1px solid ${colors.darkGray[400]}; + align-items: center; + padding: ${size[1]} ${size[2]}; + gap: ${size[2]}; + font-size: ${fontSize.xs}; + color: ${colors.gray[300]}; + cursor: ${isMatch ? 'pointer' : 'default'}; + line-height: ${lineHeight['xs']}; + ` + const classes = [base] + + if (active) { + const activeStyles = css` + background: ${colors.darkGray[500]}; + ` + classes.push(activeStyles) + } + + return classes + }, + routesRow: (isMatch: boolean) => { + const base = css` + flex: 1 0 auto; + display: flex; + justify-content: space-between; + align-items: center; + font-size: ${fontSize.xs}; + line-height: ${lineHeight['xs']}; + ` + + const classes = [base] + + if (!isMatch) { + const matchStyles = css` + color: ${colors.gray[400]}; + ` + classes.push(matchStyles) + } + + return classes + }, + routesRowInner: css` + display: 'flex'; + align-items: 'center'; + flex-grow: 1; + min-width: 0; + `, + routeParamInfo: css` + color: ${colors.gray[400]}; + font-size: ${fontSize.xs}; + line-height: ${lineHeight['xs']}; + `, + nestedRouteRow: (isRoot: boolean) => { + const base = css` + margin-left: ${isRoot ? 0 : size[3.5]}; + border-left: ${isRoot ? '' : `solid 1px ${colors.gray[700]}`}; + ` + return base + }, + code: css` + font-size: ${fontSize.xs}; + line-height: ${lineHeight['xs']}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + `, + matchesContainer: css` + flex: 1 1 auto; + overflow-y: auto; + `, + cachedMatchesContainer: css` + flex: 1 1 auto; + overflow-y: auto; + max-height: 50%; + `, + maskedBadgeContainer: css` + flex: 1; + justify-content: flex-end; + display: flex; + `, + matchDetails: css` + display: flex; + flex-direction: column; + padding: ${tokens.size[2]}; + font-size: ${tokens.font.size.xs}; + color: ${tokens.colors.gray[300]}; + line-height: ${tokens.font.lineHeight.sm}; + `, + matchStatus: ( + status: 'pending' | 'success' | 'error' | 'notFound' | 'redirected', + isFetching: false | 'beforeLoad' | 'loader', + ) => { + const colorMap = { + pending: 'yellow', + success: 'green', + error: 'red', + notFound: 'purple', + redirected: 'gray', + } as const + + const color = + isFetching && status === 'success' + ? isFetching === 'beforeLoad' + ? 'purple' + : 'blue' + : colorMap[status] + + return css` + display: flex; + justify-content: center; + align-items: center; + height: 40px; + border-radius: ${tokens.border.radius.sm}; + font-weight: ${tokens.font.weight.normal}; + background-color: ${tokens.colors[color][900]}${tokens.alpha[90]}; + color: ${tokens.colors[color][300]}; + border: 1px solid ${tokens.colors[color][600]}; + margin-bottom: ${tokens.size[2]}; + transition: all 0.25s ease-out; + ` + }, + matchDetailsInfo: css` + display: flex; + justify-content: flex-end; + flex: 1; + `, + matchDetailsInfoLabel: css` + display: flex; + `, + mainCloseBtn: css` + background: ${colors.darkGray[700]}; + padding: ${size[1]} ${size[2]} ${size[1]} ${size[1.5]}; + border-radius: ${border.radius.md}; + position: fixed; + z-index: 99999; + display: inline-flex; + width: fit-content; + cursor: pointer; + appearance: none; + border: 0; + gap: 8px; + align-items: center; + border: 1px solid ${colors.gray[500]}; + font-size: ${font.size.xs}; + cursor: pointer; + transition: all 0.25s ease-out; + + &:hover { + background: ${colors.darkGray[500]}; + } + `, + mainCloseBtnPosition: ( + position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right', + ) => { + const base = css` + ${position === 'top-left' ? `top: ${size[2]}; left: ${size[2]};` : ''} + ${position === 'top-right' ? `top: ${size[2]}; right: ${size[2]};` : ''} + ${position === 'bottom-left' + ? `bottom: ${size[2]}; left: ${size[2]};` + : ''} + ${position === 'bottom-right' + ? `bottom: ${size[2]}; right: ${size[2]};` + : ''} + ` + return base + }, + mainCloseBtnAnimation: (isOpen: boolean) => { + if (!isOpen) { + return css` + opacity: 1; + pointer-events: auto; + visibility: visible; + ` + } + return css` + opacity: 0; + pointer-events: none; + visibility: hidden; + ` + }, + routerLogoCloseButton: css` + font-weight: ${font.weight.semibold}; + font-size: ${font.size.xs}; + background: linear-gradient(to right, #98f30c, #00f4a3); + background-clip: text; + -webkit-background-clip: text; + line-height: 1; + -webkit-text-fill-color: transparent; + white-space: nowrap; + `, + mainCloseBtnDivider: css` + width: 1px; + background: ${tokens.colors.gray[600]}; + height: 100%; + border-radius: 999999px; + color: transparent; + `, + mainCloseBtnIconContainer: css` + position: relative; + width: ${size[5]}; + height: ${size[5]}; + background: pink; + border-radius: 999999px; + overflow: hidden; + `, + mainCloseBtnIconOuter: css` + width: ${size[5]}; + height: ${size[5]}; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + filter: blur(3px) saturate(1.8) contrast(2); + `, + mainCloseBtnIconInner: css` + width: ${size[4]}; + height: ${size[4]}; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + `, + panelCloseBtn: css` + position: absolute; + cursor: pointer; + z-index: 100001; + display: flex; + align-items: center; + justify-content: center; + outline: none; + background-color: ${colors.darkGray[700]}; + &:hover { + background-color: ${colors.darkGray[500]}; + } + + top: 0; + right: ${size[2]}; + transform: translate(0, -100%); + border-right: ${colors.darkGray[300]} 1px solid; + border-left: ${colors.darkGray[300]} 1px solid; + border-top: ${colors.darkGray[300]} 1px solid; + border-bottom: none; + border-radius: ${border.radius.sm} ${border.radius.sm} 0px 0px; + padding: ${size[1]} ${size[1.5]} ${size[0.5]} ${size[1.5]}; + + &::after { + content: ' '; + position: absolute; + top: 100%; + left: -${size[2.5]}; + height: ${size[1.5]}; + width: calc(100% + ${size[5]}); + } + `, + panelCloseBtnIcon: css` + color: ${colors.gray[400]}; + width: ${size[2]}; + height: ${size[2]}; + `, + navigateButton: css` + background: none; + border: none; + padding: 0 0 0 4px; + margin: 0; + color: ${colors.gray[400]}; + font-size: ${fontSize.md}; + cursor: pointer; + line-height: 1; + vertical-align: middle; + margin-right: 0.5ch; + flex-shrink: 0; + &:hover { + color: ${colors.blue[300]}; + } + `, + } +} + +export function useStyles() { + const shadowDomTarget = useContext(ShadowDomTargetContext) + const [_styles] = createSignal(stylesFactory(shadowDomTarget)) + return _styles +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/utils.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/utils.tsx new file mode 100644 index 000000000..8e497a09e --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/src/utils.tsx @@ -0,0 +1,185 @@ +import { Dynamic } from 'solid-js/web' +import { createEffect, createRenderEffect, createSignal } from 'solid-js' +import { useTheme } from './theme' +import useMediaQuery from './useMediaQuery' +import type { AnyRoute, AnyRouteMatch } from '@tanstack/router-core' + +import type { Theme } from './theme' +import type { JSX } from 'solid-js' + +export const isServer = typeof window === 'undefined' + +type StyledComponent = T extends 'button' + ? JSX.ButtonHTMLAttributes + : T extends 'input' + ? JSX.InputHTMLAttributes + : T extends 'select' + ? JSX.SelectHTMLAttributes + : T extends keyof HTMLElementTagNameMap + ? JSX.HTMLAttributes + : never + +export function getStatusColor(match: AnyRouteMatch) { + const colorMap = { + pending: 'yellow', + success: 'green', + error: 'red', + notFound: 'purple', + redirected: 'gray', + } as const + + return match.isFetching && match.status === 'success' + ? match.isFetching === 'beforeLoad' + ? 'purple' + : 'blue' + : colorMap[match.status] +} + +export function getRouteStatusColor( + matches: Array, + route: AnyRoute, +) { + const found = matches.find((d) => d.routeId === route.id) + if (!found) return 'gray' + return getStatusColor(found) +} + +type Styles = + | JSX.CSSProperties + | ((props: Record, theme: Theme) => JSX.CSSProperties) + +export function styled( + type: T, + newStyles: Styles, + queries: Record = {}, +) { + return ({ + ref, + style, + ...rest + }: StyledComponent & { + ref?: HTMLElementTagNameMap[T] | undefined + }) => { + const theme = useTheme() + + const mediaStyles = Object.entries(queries).reduce( + (current, [key, value]) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + return useMediaQuery(key) + ? { + ...current, + ...(typeof value === 'function' ? value(rest, theme) : value), + } + : current + }, + {}, + ) + + const baseStyles = + typeof newStyles === 'function' ? newStyles(rest, theme) : newStyles + + // Handle style being either a string or an object + const combinedStyles = + typeof style === 'string' + ? { ...baseStyles, ...mediaStyles, cssText: style } + : { ...baseStyles, ...style, ...mediaStyles } + + return ( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + + ) + } +} + +export function useIsMounted() { + const [isMounted, setIsMounted] = createSignal(false) + + const effect = isServer ? createEffect : createRenderEffect + + effect(() => { + setIsMounted(true) + }) + + return isMounted +} + +/** + * Displays a string regardless the type of the data + * @param {unknown} value Value to be stringified + */ +export const displayValue = (value: unknown) => { + const name = Object.getOwnPropertyNames(Object(value)) + const newValue = typeof value === 'bigint' ? `${value.toString()}n` : value + try { + return JSON.stringify(newValue, name) + } catch (e) { + return `unable to stringify` + } +} + +/** + * This hook is a safe useState version which schedules state updates in microtasks + * to prevent updating a component state while React is rendering different components + * or when the component is not mounted anymore. + */ +export function useSafeState(initialState: T): [T, (value: T) => void] { + const isMounted = useIsMounted() + const [state, setState] = createSignal(initialState) + + const safeSetState = (value: T) => { + scheduleMicrotask(() => { + if (isMounted()) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + setState(value) + } + }) + } + + return [state(), safeSetState] +} + +/** + * Schedules a microtask. + * This can be useful to schedule state updates after rendering. + */ +function scheduleMicrotask(callback: () => void) { + Promise.resolve() + .then(callback) + .catch((error) => + setTimeout(() => { + throw error + }), + ) +} + +export function multiSortBy( + arr: Array, + accessors: Array<(item: T) => any> = [(d) => d], +): Array { + return arr + .map((d, i) => [d, i] as const) + .sort(([a, ai], [b, bi]) => { + for (const accessor of accessors) { + const ao = accessor(a) + const bo = accessor(b) + + if (typeof ao === 'undefined') { + if (typeof bo === 'undefined') { + continue + } + return 1 + } + + if (ao === bo) { + continue + } + + return ao > bo ? 1 : -1 + } + + return ai - bi + }) + .map(([d]) => d) +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/tsconfig.json b/devtools-reference/tanstack-router/router-devtools-core/tsconfig.json new file mode 100644 index 000000000..1b802b64d --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "preserve", + "jsxImportSource": "solid-js" + }, + "include": ["src", "vite.config.ts"] +} diff --git a/devtools-reference/tanstack-router/router-devtools-core/vite.config.ts b/devtools-reference/tanstack-router/router-devtools-core/vite.config.ts new file mode 100644 index 000000000..a464717a1 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools-core/vite.config.ts @@ -0,0 +1,16 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import solid from 'vite-plugin-solid' +import type { UserConfig } from 'vitest/config' + +const config = defineConfig({ + plugins: [solid()] as UserConfig['plugins'], +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: './src/index.tsx', + srcDir: './src', + }), +) diff --git a/devtools-reference/tanstack-router/router-devtools/README.md b/devtools-reference/tanstack-router/router-devtools/README.md new file mode 100644 index 000000000..7be76f46c --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools/README.md @@ -0,0 +1,5 @@ + + +# TanStack React Router Devtools + +See https://tanstack.com/router/latest/docs/framework/react/devtools diff --git a/devtools-reference/tanstack-router/router-devtools/eslint.config.js b/devtools-reference/tanstack-router/router-devtools/eslint.config.js new file mode 100644 index 000000000..d6dc46cc0 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools/eslint.config.js @@ -0,0 +1,32 @@ +// @ts-check + +import pluginReact from '@eslint-react/eslint-plugin' +// @ts-expect-error +import pluginReactHooks from 'eslint-plugin-react-hooks' +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + { + files: ['**/*.{ts,tsx}'], + ...pluginReact.configs.recommended, + }, + { + plugins: { + 'react-hooks': pluginReactHooks, + }, + rules: { + '@eslint-react/no-unstable-context-value': 'off', + '@eslint-react/no-unstable-default-props': 'off', + '@eslint-react/dom/no-missing-button-type': 'off', + 'react-hooks/exhaustive-deps': 'error', + 'react-hooks/rules-of-hooks': 'error', + }, + }, + { + files: ['**/__tests__/**'], + rules: { + '@typescript-eslint/no-unnecessary-condition': 'off', + }, + }, +] diff --git a/devtools-reference/tanstack-router/router-devtools/package.json b/devtools-reference/tanstack-router/router-devtools/package.json new file mode 100644 index 000000000..3da372a9f --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools/package.json @@ -0,0 +1,85 @@ +{ + "name": "@tanstack/router-devtools", + "version": "1.127.3", + "description": "Modern and scalable routing for React applications", + "author": "Tanner Linsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/router.git", + "directory": "packages/router-devtools" + }, + "homepage": "https://tanstack.com/router", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "react", + "location", + "router", + "routing", + "async", + "async router", + "typescript" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf ./coverage", + "test:eslint": "eslint ./src", + "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", + "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js", + "test:types:ts58": "tsc", + "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", + "build": "vite build" + }, + "type": "module", + "types": "./dist/esm/index.d.ts", + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.js", + "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" + }, + "sideEffects": false, + "files": [ + "dist", + "src" + ], + "engines": { + "node": ">=12" + }, + "dependencies": { + "clsx": "^2.1.1", + "goober": "^2.1.16", + "@tanstack/react-router-devtools": "workspace:^" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.3.4", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "peerDependencies": { + "@tanstack/react-router": "workspace:^", + "csstype": "^3.0.10", + "react": ">=18.0.0 || >=19.0.0", + "react-dom": ">=18.0.0 || >=19.0.0" + }, + "peerDependenciesMeta": { + "csstype": { + "optional": true + } + } +} diff --git a/devtools-reference/tanstack-router/router-devtools/src/index.tsx b/devtools-reference/tanstack-router/router-devtools/src/index.tsx new file mode 100644 index 000000000..8db17e377 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools/src/index.tsx @@ -0,0 +1,6 @@ +console.warn( + '[@tanstack/router-devtools] This package has moved to @tanstack/react-router-devtools. Please switch to the new package at your earliest convenience, as this package will be dropped in the next major version release.', +) + +export { TanStackRouterDevtoolsInProd as TanStackRouterDevtools } from '@tanstack/react-router-devtools' +export { TanStackRouterDevtoolsPanelInProd as TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools' diff --git a/devtools-reference/tanstack-router/router-devtools/tsconfig.json b/devtools-reference/tanstack-router/router-devtools/tsconfig.json new file mode 100644 index 000000000..2f40bc971 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx" + }, + "include": ["src", "vite.config.ts"] +} diff --git a/devtools-reference/tanstack-router/router-devtools/vite.config.ts b/devtools-reference/tanstack-router/router-devtools/vite.config.ts new file mode 100644 index 000000000..2d87d3ac1 --- /dev/null +++ b/devtools-reference/tanstack-router/router-devtools/vite.config.ts @@ -0,0 +1,16 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import react from '@vitejs/plugin-react' +import type { UserConfig } from 'vitest/config' + +const config = defineConfig({ + plugins: [react()] as UserConfig['plugins'], +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: './src/index.tsx', + srcDir: './src', + }), +) diff --git a/examples/react/todo/package.json b/examples/react/todo/package.json index 3f5dbc372..85a64ed22 100644 --- a/examples/react/todo/package.json +++ b/examples/react/todo/package.json @@ -5,9 +5,10 @@ "dependencies": { "@tanstack/db-collections": "^0.0.23", "@tanstack/query-core": "^5.81.5", - "@tanstack/react-db": "^0.0.19", "@tanstack/react-router": "^1.125.6", "@tanstack/react-start": "^1.126.1", + "@tanstack/react-db": "^0.0.20", + "@tanstack/react-db-devtools": "workspace:*", "cors": "^2.8.5", "drizzle-orm": "^0.40.1", "drizzle-zod": "^0.7.0", diff --git a/examples/react/todo/src/App.tsx b/examples/react/todo/src/App.tsx index f4453c7a2..de6f04b16 100644 --- a/examples/react/todo/src/App.tsx +++ b/examples/react/todo/src/App.tsx @@ -4,7 +4,7 @@ import { electricCollectionOptions, queryCollectionOptions, } from "@tanstack/db-collections" -// import { DevTools } from "./DevTools" +import { ReactDbDevtools } from "@tanstack/react-db-devtools" import { QueryClient } from "@tanstack/query-core" import { selectConfigSchema, selectTodoSchema } from "./db/validation" import type { Collection } from "@tanstack/react-db" @@ -641,7 +641,7 @@ export default function App() {
- {/* */} + ) } diff --git a/packages/db-devtools/README.md b/packages/db-devtools/README.md new file mode 100644 index 000000000..91fd548b4 --- /dev/null +++ b/packages/db-devtools/README.md @@ -0,0 +1,173 @@ +# @tanstack/db-devtools + +Developer tools for TanStack DB that provide real-time insights into your collections, live queries, and transactions. + +## Features + +- **Collection Monitoring**: View all active collections with real-time status updates +- **Live Query Insights**: Special handling for live queries with performance metrics +- **Transaction Tracking**: Monitor all database transactions and their states +- **WeakRef Architecture**: Collections are tracked without preventing garbage collection +- **Framework Agnostic**: Core devtools built with Solid.js, with React and Vue wrappers +- **Development Only**: Automatically tree-shaken in production builds + +## Installation + +```bash +# Core devtools (built with Solid.js) +npm install @tanstack/db-devtools + +# React wrapper +npm install @tanstack/react-db-devtools + +# Vue wrapper +npm install @tanstack/vue-db-devtools +``` + +## Usage + +### Core Devtools (Solid.js) + +```typescript +import { DbDevtools } from '@tanstack/db-devtools' + +// Initialize devtools (must be called before creating collections) +import { initializeDbDevtools } from '@tanstack/db-devtools' +initializeDbDevtools() + +// Use the devtools component +function App() { + return ( +
+

My App

+ +
+ ) +} +``` + +### React + +```tsx +import { ReactDbDevtools } from '@tanstack/react-db-devtools' + +function App() { + return ( +
+

My App

+ +
+ ) +} +``` + +### Vue + +```vue + + + +``` + +## Configuration + +The devtools accept the following configuration options: + +```typescript +interface DbDevtoolsConfig { + initialIsOpen?: boolean + position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'relative' + panelProps?: Record + closeButtonProps?: Record + toggleButtonProps?: Record + storageKey?: string + panelState?: 'open' | 'closed' + onPanelStateChange?: (isOpen: boolean) => void +} +``` + +## Architecture + +### Auto-Registration + +Collections automatically register themselves with the devtools when created: + +```typescript +// When devtools are initialized, this creates a window global +window.__TANSTACK_DB_DEVTOOLS__ + +// Collections check for this global and register themselves +const collection = createCollection({ + // ... config +}) +// Collection is now visible in devtools +``` + +### WeakRef Design + +The devtools use WeakRef to track collections without preventing garbage collection: + +- **Metadata polling**: Basic info (size, status) is polled every second +- **Hard references**: Only created when viewing collection details +- **Automatic cleanup**: Dead references are garbage collected + +### Live Query Detection + +Live queries are automatically detected and shown separately: + +```typescript +// This will be marked as a live query in devtools +const liveQuery = createLiveQueryCollection({ + query: (q) => q.from(collection).select() +}) +``` + +## What You Can See + +### Collections View +- Collection ID and type (regular vs live query) +- Status (idle, loading, ready, error, cleaned-up) +- Current size and transaction count +- Creation and last update timestamps +- Garbage collection settings + +### Live Queries View +- All the above plus: +- Initial run time +- Total incremental runs +- Average incremental run time +- Last incremental run time + +### Transactions View +- Transaction ID and state +- Associated collection +- Mutation details (insert, update, delete) +- Optimistic vs confirmed operations +- Creation and update timestamps + +### Collection Details +- Full collection metadata +- Live data with real-time updates +- Individual item inspection +- JSON view of all items + +## Performance + +The devtools are designed to have minimal impact on your application: + +- **Development only**: Automatically removed in production +- **WeakRef tracking**: No memory leaks from collection references +- **Efficient polling**: Only basic metadata is polled, detailed data is fetched on-demand +- **Lazy loading**: UI components are loaded only when needed + +## Browser Support + +Requires modern browsers that support WeakRef (Chrome 84+, Firefox 79+, Safari 14.1+). +Since this is development-only, this should not be a concern for production applications. \ No newline at end of file diff --git a/packages/db-devtools/eslint.config.js b/packages/db-devtools/eslint.config.js new file mode 100644 index 000000000..abeeb6348 --- /dev/null +++ b/packages/db-devtools/eslint.config.js @@ -0,0 +1,23 @@ +export default [ + { + ignores: ['build/**', 'dist/**', 'node_modules/**', 'coverage/**'] + }, + { + files: ['src/**/*.{ts,tsx}'], + languageOptions: { + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + ecmaFeatures: { + jsx: true + } + } + }, + rules: { + 'no-console': 'warn', + 'no-unused-vars': 'warn', + '@typescript-eslint/no-unused-vars': 'warn' + } + } +] \ No newline at end of file diff --git a/packages/db-devtools/package.json b/packages/db-devtools/package.json new file mode 100644 index 000000000..23330d39a --- /dev/null +++ b/packages/db-devtools/package.json @@ -0,0 +1,92 @@ +{ + "name": "@tanstack/db-devtools", + "version": "0.0.1", + "description": "Developer tools for TanStack DB", + "author": "tanstack", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/db.git", + "directory": "packages/db-devtools" + }, + "homepage": "https://tanstack.com/db", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "browser": {}, + "exports": { + ".": { + "@tanstack/custom-condition": "./src/index.ts", + "solid": { + "development": "./dist/index.js", + "import": "./dist/index.js" + }, + "development": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.ts", + "default": "./dist/index.cjs" + } + }, + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.ts", + "default": "./dist/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist", + "src", + "!src/__tests__" + ], + "engines": { + "node": ">=18" + }, + "scripts": { + "clean": "premove ./build ./coverage ./dist-ts", + "compile": "tsc --build", + "test:eslint": "eslint ./src", + "test:types": "npm-run-all --serial test:types:*", + "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js --build", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js --build", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js --build", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js --build", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js --build", + "test:types:tscurrent": "tsc --build", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch", + "test:build": "publint --strict && attw --pack", + "build": "vite build", + "build:dev": "tsup --watch" + }, + "devDependencies": { + "@kobalte/core": "^0.13.4", + "@solid-primitives/keyed": "^1.2.2", + "@solid-primitives/resize-observer": "^2.0.26", + "@solid-primitives/storage": "^1.3.11", + "@tanstack/match-sorter-utils": "^8.19.4", + "clsx": "^2.1.1", + "goober": "^2.1.16", + "npm-run-all2": "^5.0.0", + "solid-js": "^1.9.5", + "solid-transition-group": "^0.2.3", + "superjson": "^2.2.1", + "tsup-preset-solid": "^2.2.0", + "vite-plugin-dts": "^4.5.4", + "vite-plugin-solid": "^2.11.6" + } +} \ No newline at end of file diff --git a/packages/db-devtools/src/DbDevtools.tsx b/packages/db-devtools/src/DbDevtools.tsx new file mode 100644 index 000000000..02a491074 --- /dev/null +++ b/packages/db-devtools/src/DbDevtools.tsx @@ -0,0 +1,111 @@ +/** @jsxImportSource solid-js */ +import { createEffect, createSignal, onCleanup } from "solid-js" +import { DbDevtoolsPanel } from "./DbDevtoolsPanel" +import { initializeDevtoolsRegistry } from "./registry" +import type { CollectionMetadata, DbDevtoolsConfig } from "./types" + +import type { DbDevtoolsRegistry } from './types' + +interface DbDevtoolsProps extends DbDevtoolsConfig { + // Additional component props + registry?: DbDevtoolsRegistry + shadowDOMTarget?: ShadowRoot +} + +function DbDevtools(props: DbDevtoolsProps = {}) { + const [isOpen, setIsOpen] = createSignal(props.initialIsOpen ?? false) + const [collections, setCollections] = createSignal>( + [] + ) + + const registry = props.registry || initializeDevtoolsRegistry() + + let intervalId: number | undefined + + // Update collections metadata periodically + createEffect(() => { + const updateCollections = () => { + const metadata = registry.getAllCollectionMetadata() + setCollections(metadata) + } + + // Initial load + updateCollections() + + // Set up polling + intervalId = window.setInterval(updateCollections, 1000) + + onCleanup(() => { + if (intervalId) { + clearInterval(intervalId) + } + }) + }) + + const toggleOpen = () => { + const newState = !isOpen() + setIsOpen(newState) + props.onPanelStateChange?.(newState) + } + + // Handle controlled state + createEffect(() => { + if (props.panelState) { + setIsOpen(props.panelState === `open`) + } + }) + + const position = props.position ?? `bottom-right` + + return ( +
+ {/* Toggle Button */} +
+ +
+ + {/* Panel */} + {isOpen() && ( + setIsOpen(false)} + collections={collections()} + registry={registry} + {...props.panelProps} + /> + )} +
+ ) +} + +export default DbDevtools diff --git a/packages/db-devtools/src/DbDevtoolsPanel.tsx b/packages/db-devtools/src/DbDevtoolsPanel.tsx new file mode 100644 index 000000000..0ca785f29 --- /dev/null +++ b/packages/db-devtools/src/DbDevtoolsPanel.tsx @@ -0,0 +1,503 @@ +/** @jsxImportSource solid-js */ +import { For, Show, createMemo, createSignal } from "solid-js" +import { CollectionDetails } from "./components/CollectionDetails" +import { TransactionList } from "./components/TransactionList" +import type { + CollectionMetadata, + DbDevtoolsRegistry, + TransactionDetails, +} from "./types" + +interface DbDevtoolsPanelProps { + onClose: () => void + collections: Array + registry: DbDevtoolsRegistry + [key: string]: any +} + +export function DbDevtoolsPanel(props: DbDevtoolsPanelProps) { + const [selectedView, setSelectedView] = createSignal< + `collections` | `transactions` + >(`collections`) + const [selectedCollection, setSelectedCollection] = createSignal< + string | null + >(null) + const [selectedTransaction, setSelectedTransaction] = createSignal< + string | null + >(null) + + const liveQueries = createMemo(() => + props.collections.filter((c) => c.type === `live-query`) + ) + + const regularCollections = createMemo(() => + props.collections.filter((c) => c.type === `collection`) + ) + + const allTransactions = createMemo(() => props.registry.getTransactions()) + + const handleCollectionSelect = (id: string) => { + setSelectedCollection(id) + setSelectedTransaction(null) + } + + const handleTransactionSelect = (id: string) => { + setSelectedTransaction(id) + setSelectedCollection(null) + } + + const panelStyle = { + position: `fixed` as const, + top: `0`, + left: `0`, + width: `100vw`, + height: `100vh`, + "z-index": 9999999, + "background-color": `rgba(0, 0, 0, 0.5)`, + display: `flex`, + "align-items": `center`, + "justify-content": `center`, + "font-family": `system-ui, -apple-system, sans-serif`, + } + + const contentStyle = { + "background-color": `#1a1a1a`, + color: `#e1e1e1`, + width: `90vw`, + height: `90vh`, + "border-radius": `12px`, + "box-shadow": `0 20px 40px rgba(0, 0, 0, 0.3)`, + display: `flex`, + "flex-direction": `column` as const, + overflow: `hidden`, + } + + const headerStyle = { + display: `flex`, + "align-items": `center`, + "justify-content": `space-between`, + padding: `16px 20px`, + "border-bottom": `1px solid #333`, + "background-color": `#222`, + } + + const bodyStyle = { + display: `flex`, + flex: `1`, + overflow: `hidden`, + } + + const sidebarStyle = { + width: `300px`, + "border-right": `1px solid #333`, + "background-color": `#1e1e1e`, + display: `flex`, + "flex-direction": `column` as const, + } + + const mainStyle = { + flex: `1`, + display: `flex`, + "flex-direction": `column` as const, + overflow: `hidden`, + } + + return ( +
e.target === e.currentTarget && props.onClose()} + > +
e.stopPropagation()}> + {/* Header */} +
+
+ 🗄️ +

+ TanStack DB Devtools +

+
+ +
+ +
+ {/* Sidebar */} +
+ {/* Tab Navigation */} +
+ + +
+ + {/* Content based on selected view */} +
+ + {/* Live Queries Section */} + 0}> +
+

+ Live Queries ({liveQueries().length}) +

+
+ + {(collection) => ( + handleCollectionSelect(collection.id)} + /> + )} + +
+ + {/* Regular Collections Section */} + 0}> +
+

+ Collections ({regularCollections().length}) +

+
+ + {(collection) => ( + handleCollectionSelect(collection.id)} + /> + )} + +
+ + +
+ No collections found. Create a collection to see it here. +
+
+
+ + + + +
+
+ + {/* Main Content */} +
+ + {selectedView() === `collections` + ? `Select a collection to view details` + : `Select a transaction to view details`} +
+ } + > + + + } + > + + +
+
+
+
+ ) +} + +// Collection Item Component +function CollectionItem(props: { + collection: CollectionMetadata + isSelected: boolean + onClick: () => void +}) { + const statusColor = () => { + switch (props.collection.status) { + case `ready`: + return `#22c55e` + case `loading`: + return `#eab308` + case `error`: + return `#ef4444` + case `cleaned-up`: + return `#6b7280` + default: + return `#6b7280` + } + } + + const statusIcon = () => { + switch (props.collection.status) { + case `ready`: + return `✓` + case `loading`: + return `⟳` + case `error`: + return `⚠` + case `cleaned-up`: + return `🗑` + default: + return `○` + } + } + + return ( +
+
+
+ {props.collection.type === `live-query` ? `🔄` : `📄`} + {` `} + {props.collection.id} +
+
+ {statusIcon()} +
+
+
+ {props.collection.size} items + + {props.collection.transactionCount} tx + +
+ +
+ {props.collection.timings!.totalIncrementalRuns} runs + + , avg {props.collection.timings!.averageIncrementalRunTime}ms + +
+
+
+ ) +} + +// Transaction Details Component +function TransactionDetails(props: { + transactionId: string + registry: DbDevtoolsRegistry +}) { + const transaction = () => props.registry.getTransaction(props.transactionId) + + return ( +
+ Transaction not found
}> + {(tx) => ( +
+

+ Transaction {tx().id} +

+
+
+ Collection: {tx().collectionId} +
+
+ State: {tx().state} +
+
+ Created: {tx().createdAt.toLocaleString()} +
+
+ Updated: {tx().updatedAt.toLocaleString()} +
+
+ Persisted: {tx().isPersisted ? `Yes` : `No`} +
+
+

Mutations ({tx().mutations.length})

+ + {(mutation) => ( +
+
+ Type: {mutation.type} +
+
+ Key: {String(mutation.key)} +
+
+ Optimistic: + {` `} + {mutation.optimistic ? `Yes` : `No`} +
+ +
+ Changes +
+                        {JSON.stringify(mutation.changes, null, 2)}
+                      
+
+
+
+ )} +
+
+ )} + +
+ ) +} diff --git a/packages/db-devtools/src/Devtools.tsx b/packages/db-devtools/src/Devtools.tsx new file mode 100644 index 000000000..80a07c88d --- /dev/null +++ b/packages/db-devtools/src/Devtools.tsx @@ -0,0 +1,985 @@ +/** @jsxImportSource solid-js */ +import { + For, + Show, + createEffect, + createMemo, + createSignal, + onCleanup, + onMount, +} from 'solid-js' +import * as goober from 'goober' +import { clsx as cx } from 'clsx' +import { TransitionGroup } from 'solid-transition-group' +import { createResizeObserver } from '@solid-primitives/resize-observer' +import { Portal } from 'solid-js/web' +import { tokens } from './theme' +import { + convertRemToPixels, + getCollectionStatusColor, + getTransactionStatusColor, +} from './utils' +import { + CheckCircle, + LoadingCircle, + PauseCircle, + TanstackLogo, + Trash, + XCircle, +} from './icons' +import { useDbDevtoolsContext, useTheme, usePiPWindow } from './contexts' +import { + BUTTON_POSITION, + DEFAULT_HEIGHT, + DEFAULT_WIDTH, + POSITION, + INITIAL_IS_OPEN, + secondBreakpoint, + thirdBreakpoint, +} from './constants' +import type { CollectionMetadata, DbDevtoolsRegistry, TransactionDetails } from './types' +import type { DevtoolsPosition } from './constants' +import type { StorageObject, StorageSetter } from '@solid-primitives/storage' +import type { Component, JSX } from 'solid-js' + +interface DevtoolsPanelProps { + localStore: StorageObject + setLocalStore: StorageSetter + collections: CollectionMetadata[] + registry: DbDevtoolsRegistry +} + +interface ContentViewProps { + localStore: StorageObject + setLocalStore: StorageSetter + collections: CollectionMetadata[] + registry: DbDevtoolsRegistry + showPanelViewOnly?: boolean + onClose?: () => unknown +} + +const [selectedCollectionId, setSelectedCollectionId] = createSignal(null) +const [selectedTransactionId, setSelectedTransactionId] = createSignal(null) +const [panelWidth, setPanelWidth] = createSignal(0) +const [_offline, _setOffline] = createSignal(false) + +export type DevtoolsComponentType = Component<{ + collections: CollectionMetadata[] + registry: DbDevtoolsRegistry + onClose?: () => void +}> & { + shadowDOMTarget?: ShadowRoot +} + +export const Devtools: Component = (props) => { + const theme = useTheme() + const css = useDbDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const pip = usePiPWindow() + + const buttonPosition = createMemo(() => { + return useDbDevtoolsContext().buttonPosition || BUTTON_POSITION + }) + + const isOpen = createMemo(() => { + return props.localStore.open === 'true' + ? true + : props.localStore.open === 'false' + ? false + : useDbDevtoolsContext().initialIsOpen || INITIAL_IS_OPEN + }) + + const position = createMemo(() => { + return ( + props.localStore.position || + useDbDevtoolsContext().position || + POSITION + ) + }) + + let transitionsContainerRef!: HTMLDivElement + createEffect(() => { + const root = transitionsContainerRef.parentElement as HTMLElement + const height = props.localStore.height || DEFAULT_HEIGHT + const width = props.localStore.width || DEFAULT_WIDTH + const panelPosition = position() + root.style.setProperty( + '--tsdb-panel-height', + `${panelPosition === 'top' ? '-' : ''}${height}px`, + ) + root.style.setProperty( + '--tsdb-panel-width', + `${panelPosition === 'left' ? '-' : ''}${width}px`, + ) + }) + + // Calculates the inherited font size of the parent and sets it as a CSS variable + onMount(() => { + const onFocus = () => { + const root = transitionsContainerRef.parentElement as HTMLElement + const fontSize = getComputedStyle(root).fontSize + root.style.setProperty('--tsdb-font-size', fontSize) + } + onFocus() + window.addEventListener('focus', onFocus) + onCleanup(() => { + window.removeEventListener('focus', onFocus) + }) + }) + + const pip_open = createMemo( + () => (props.localStore.pip_open ?? 'false') as 'true' | 'false', + ) + + return ( + <> + + + + + + + +
+ + + + + + + +
+ + +
+
+
+
+ + ) +} + +const PiPPanel: Component<{ + children: JSX.Element +}> = (props) => { + const pip = usePiPWindow() + const theme = useTheme() + const css = useDbDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const getPanelDynamicStyles = () => { + const { colors } = tokens + const t = (light: string, dark: string) => + theme() === 'dark' ? dark : light + if (panelWidth() < secondBreakpoint) { + return css` + flex-direction: column; + background-color: ${t(colors.gray[300], colors.gray[600])}; + ` + } + return css` + flex-direction: row; + background-color: ${t(colors.gray[200], colors.darkGray[900])}; + ` + } + + createEffect(() => { + const win = pip.pipWindow() + const resizeCB = () => { + if (!win) return + setPanelWidth(win.innerWidth) + } + if (win) { + win.addEventListener('resize', resizeCB) + resizeCB() + } + + onCleanup(() => { + if (win) { + win.removeEventListener('resize', resizeCB) + } + }) + }) + + return ( +
+ {props.children} +
+ ) +} + +const DraggablePanel: Component = (props) => { + const theme = useTheme() + const css = useDbDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const [isResizing, setIsResizing] = createSignal(false) + + const position = createMemo( + () => + (props.localStore.position || + useDbDevtoolsContext().position || + POSITION) as DevtoolsPosition, + ) + + const handleDragStart = (event: MouseEvent) => { + const panelElement = event.currentTarget as HTMLDivElement + if (!panelElement.parentElement) return + setIsResizing(true) + const { height, width } = panelElement.parentElement.getBoundingClientRect() + const startX = event.clientX + const startY = event.clientY + let newSize = 0 + const minHeight = convertRemToPixels(3.5) + const minWidth = convertRemToPixels(12) + const runDrag = (moveEvent: MouseEvent) => { + moveEvent.preventDefault() + + if (position() === 'left' || position() === 'right') { + const valToAdd = + position() === 'right' + ? startX - moveEvent.clientX + : moveEvent.clientX - startX + newSize = Math.round(width + valToAdd) + if (newSize < minWidth) { + newSize = minWidth + } + props.setLocalStore('width', String(Math.round(newSize))) + } else { + const valToAdd = + position() === 'bottom' + ? startY - moveEvent.clientY + : moveEvent.clientY - startY + newSize = Math.round(height + valToAdd) + if (newSize < minHeight) { + newSize = minHeight + setSelectedCollectionId(null) + } + props.setLocalStore('height', String(Math.round(newSize))) + } + } + + const unsubscribe = () => { + if (isResizing()) { + setIsResizing(false) + } + document.removeEventListener('mousemove', runDrag, false) + document.removeEventListener('mouseup', unsubscribe, false) + } + + document.addEventListener('mousemove', runDrag, false) + document.addEventListener('mouseup', unsubscribe, false) + } + + let panelRef!: HTMLDivElement + + onMount(() => { + createResizeObserver(panelRef, ({ width }, el) => { + if (el === panelRef) { + setPanelWidth(width) + } + }) + }) + + const getPanelDynamicStyles = () => { + const { colors } = tokens + const t = (light: string, dark: string) => + theme() === 'dark' ? dark : light + if (panelWidth() < secondBreakpoint) { + return css` + flex-direction: column; + background-color: ${t(colors.gray[300], colors.gray[600])}; + ` + } + return css` + flex-direction: row; + background-color: ${t(colors.gray[200], colors.darkGray[900])}; + ` + } + + return ( +
+ +
+
+ ) +} + +const ContentView: Component = (props) => { + const theme = useTheme() + const css = useDbDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const [selectedView, setSelectedView] = createSignal<'collections' | 'transactions'>('collections') + + const liveQueries = createMemo(() => + props.collections.filter(c => c.type === 'live-query') + ) + + const regularCollections = createMemo(() => + props.collections.filter(c => c.type === 'collection') + ) + + const allTransactions = createMemo(() => + props.registry.getTransactions() + ) + + const handleCollectionSelect = (id: string) => { + setSelectedCollectionId(id) + setSelectedTransactionId(null) + } + + const handleTransactionSelect = (id: string) => { + setSelectedTransactionId(id) + setSelectedCollectionId(null) + } + + return ( +
+ {/* Header */} +
+
+ +

TanStack DB Devtools

+
+
+ + + +
+
+ +
+ {/* Sidebar */} +
+ {/* Tab Navigation */} +
+ + +
+ + {/* Content based on selected view */} +
+ + 0}> +
+

Live Queries ({liveQueries().length})

+
+ + {(collection) => ( + handleCollectionSelect(collection.id)} + /> + )} + +
+ + 0}> +
+

Collections ({regularCollections().length})

+
+ + {(collection) => ( + handleCollectionSelect(collection.id)} + /> + )} + +
+ + +
+ No collections found. Create a collection to see it here. +
+
+
+ + + + {(transaction) => ( + handleTransactionSelect(transaction.id)} + /> + )} + + +
+
+ + {/* Main Content */} +
+ + {selectedView() === 'collections' + ? 'Select a collection to view details' + : 'Select a transaction to view details' + } +
+ } + > + + + } + > + + +
+
+
+ ) +} + +// Collection Item Component +const CollectionItem = (props: { + collection: CollectionMetadata + isSelected: boolean + onClick: () => void +}) => { + const theme = useTheme() + const css = useDbDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const statusColor = () => getCollectionStatusColor(props.collection.status) + + const statusIcon = () => { + switch (props.collection.status) { + case 'ready': return + case 'loading': return + case 'error': return + case 'cleaned-up': return + default: return + } + } + + return ( +
+
+
+ {props.collection.type === 'live-query' ? '🔄' : '📄'} {props.collection.id} +
+
+ {statusIcon()} +
+
+
+ {props.collection.size} items + + {props.collection.transactionCount} tx + +
+ +
+ {props.collection.timings!.totalIncrementalRuns} runs + + , avg {props.collection.timings!.averageIncrementalRunTime}ms + +
+
+
+ ) +} + +// Transaction Item Component +const TransactionItem = (props: { + transaction: TransactionDetails + isSelected: boolean + onClick: () => void +}) => { + const theme = useTheme() + const css = useDbDevtoolsContext().shadowDOMTarget + ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) + : goober.css + const styles = createMemo(() => { + return theme() === 'dark' ? darkStyles(css) : lightStyles(css) + }) + + const statusColor = () => getTransactionStatusColor(props.transaction.state) + + const statusIcon = () => { + switch (props.transaction.state) { + case 'pending': return + case 'success': return + case 'error': return + default: return + } + } + + return ( +
+
+
+ Transaction {props.transaction.id} +
+
+ {statusIcon()} +
+
+
+ {props.transaction.collectionId} + {props.transaction.mutations.length} mutations +
+
+ ) +} + +// Placeholder components - these will be replaced with actual implementations +const CollectionDetails = (props: { collectionId: string, registry: DbDevtoolsRegistry }) => { + return
Collection Details: {props.collectionId}
+} + +const TransactionDetails = (props: { transactionId: string, registry: DbDevtoolsRegistry }) => { + return
Transaction Details: {props.transactionId}
+} + +// Style factory function +const stylesFactory = ( + theme: 'light' | 'dark', + css: (typeof goober)['css'], +) => { + const { colors, font, size, border, shadow } = tokens + const t = (light: string, dark: string) => (theme === 'light' ? light : dark) + + return { + devtoolsBtn: css` + position: fixed; + z-index: 99999; + border: none; + background: ${t(colors.white, colors.darkGray[800])}; + color: ${t(colors.gray[700], colors.gray[300])}; + border-radius: ${border.radius.md}; + box-shadow: ${shadow.lg(t(colors.gray[500] + '20', colors.black + '50'))}; + cursor: pointer; + padding: ${size[2]}; + display: flex; + align-items: center; + justify-content: center; + width: ${size[12]}; + height: ${size[12]}; + font-size: ${font.size.lg}; + + &:hover { + background: ${t(colors.gray[50], colors.darkGray[700])}; + } + `, + 'devtoolsBtn-position-bottom-right': css` + bottom: ${size[6]}; + right: ${size[6]}; + `, + 'devtoolsBtn-position-bottom-left': css` + bottom: ${size[6]}; + left: ${size[6]}; + `, + 'devtoolsBtn-position-top-right': css` + top: ${size[6]}; + right: ${size[6]}; + `, + 'devtoolsBtn-position-top-left': css` + top: ${size[6]}; + left: ${size[6]}; + `, + 'devtoolsBtn-position-relative': css` + position: relative; + `, + panel: css` + position: fixed; + display: flex; + font-family: ui-sans-serif, system-ui, sans-serif; + font-size: ${font.size.md}; + z-index: 99999; + color: ${t(colors.gray[700], colors.gray[300])}; + background: ${t(colors.gray[100], colors.darkGray[800])}; + border: 1px solid ${t(colors.gray[300], colors.gray[600])}; + border-radius: ${border.radius.lg}; + box-shadow: ${shadow.xl(t(colors.gray[500] + '20', colors.black + '50'))}; + backdrop-filter: blur(10px); + min-height: 300px; + min-width: 400px; + max-height: 90vh; + max-width: 90vw; + overflow: hidden; + `, + contentView: css` + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + `, + header: css` + display: flex; + align-items: center; + justify-content: space-between; + padding: ${size[4]} ${size[6]}; + border-bottom: 1px solid ${t(colors.gray[300], colors.gray[600])}; + background: ${t(colors.gray[50], colors.darkGray[700])}; + `, + headerTitle: css` + display: flex; + align-items: center; + gap: ${size[3]}; + font-size: ${font.size.lg}; + font-weight: ${font.weight.semibold}; + `, + headerControls: css` + display: flex; + align-items: center; + gap: ${size[2]}; + `, + closeBtn: css` + background: none; + border: none; + color: ${t(colors.gray[500], colors.gray[400])}; + cursor: pointer; + padding: ${size[1]}; + border-radius: ${border.radius.sm}; + + &:hover { + background: ${t(colors.gray[200], colors.gray[600])}; + } + `, + body: css` + display: flex; + flex: 1; + overflow: hidden; + `, + sidebar: css` + width: 300px; + border-right: 1px solid ${t(colors.gray[300], colors.gray[600])}; + background: ${t(colors.gray[50], colors.darkGray[800])}; + display: flex; + flex-direction: column; + `, + tabNav: css` + display: flex; + border-bottom: 1px solid ${t(colors.gray[300], colors.gray[600])}; + background: ${t(colors.gray[100], colors.darkGray[700])}; + `, + tabBtn: css` + flex: 1; + padding: ${size[3]}; + background: transparent; + border: none; + color: ${t(colors.gray[600], colors.gray[400])}; + cursor: pointer; + font-size: ${font.size.sm}; + font-weight: ${font.weight.medium}; + + &:hover { + background: ${t(colors.gray[200], colors.gray[600])}; + } + `, + tabBtnActive: css` + background: ${colors.blue[500]}; + color: ${colors.white}; + + &:hover { + background: ${colors.blue[600]}; + } + `, + sidebarContent: css` + flex: 1; + overflow-y: auto; + `, + sectionHeader: css` + padding: ${size[4]} ${size[4]} ${size[2]} ${size[4]}; + + h3 { + margin: 0; + font-size: ${font.size.sm}; + font-weight: ${font.weight.semibold}; + color: ${t(colors.gray[600], colors.gray[400])}; + text-transform: uppercase; + letter-spacing: 0.5px; + } + `, + collectionItem: css` + padding: ${size[3]} ${size[4]}; + border-bottom: 1px solid ${t(colors.gray[200], colors.gray[700])}; + cursor: pointer; + + &:hover { + background: ${t(colors.gray[100], colors.gray[700])}; + } + `, + collectionItemSelected: css` + background: ${colors.blue[50]}; + border-left: 3px solid ${colors.blue[500]}; + + &:hover { + background: ${colors.blue[100]}; + } + `, + collectionItemHeader: css` + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: ${size[1]}; + `, + collectionItemTitle: css` + font-weight: ${font.weight.medium}; + font-size: ${font.size.sm}; + color: ${t(colors.gray[900], colors.gray[100])}; + `, + collectionItemStatus: css` + display: flex; + align-items: center; + font-size: ${font.size.xs}; + `, + collectionItemMeta: css` + font-size: ${font.size.xs}; + color: ${t(colors.gray[600], colors.gray[400])}; + display: flex; + justify-content: space-between; + `, + collectionItemTimings: css` + font-size: ${font.size['2xs']}; + color: ${t(colors.gray[500], colors.gray[500])}; + margin-top: ${size[0.5]}; + `, + transactionItem: css` + padding: ${size[3]} ${size[4]}; + border-bottom: 1px solid ${t(colors.gray[200], colors.gray[700])}; + cursor: pointer; + + &:hover { + background: ${t(colors.gray[100], colors.gray[700])}; + } + `, + transactionItemSelected: css` + background: ${colors.blue[50]}; + border-left: 3px solid ${colors.blue[500]}; + + &:hover { + background: ${colors.blue[100]}; + } + `, + transactionItemHeader: css` + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: ${size[1]}; + `, + transactionItemTitle: css` + font-weight: ${font.weight.medium}; + font-size: ${font.size.sm}; + color: ${t(colors.gray[900], colors.gray[100])}; + `, + transactionItemStatus: css` + display: flex; + align-items: center; + font-size: ${font.size.xs}; + `, + transactionItemMeta: css` + font-size: ${font.size.xs}; + color: ${t(colors.gray[600], colors.gray[400])}; + display: flex; + justify-content: space-between; + `, + mainContent: css` + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + `, + placeholder: css` + display: flex; + align-items: center; + justify-content: center; + flex: 1; + color: ${t(colors.gray[500], colors.gray[400])}; + font-style: italic; + `, + emptyState: css` + padding: ${size[10]} ${size[6]}; + text-align: center; + color: ${t(colors.gray[500], colors.gray[400])}; + font-style: italic; + `, + dragHandle: css` + background: transparent; + cursor: ${(pos: DevtoolsPosition) => pos === 'left' || pos === 'right' ? 'ew-resize' : 'ns-resize'}; + opacity: 0; + + &:hover { + opacity: 1; + background: ${colors.blue[500]}; + } + `, + } +} + +const lightStyles = (css: (typeof goober)['css']) => stylesFactory('light', css) +const darkStyles = (css: (typeof goober)['css']) => stylesFactory('dark', css) \ No newline at end of file diff --git a/packages/db-devtools/src/TanstackDbDevtools.tsx b/packages/db-devtools/src/TanstackDbDevtools.tsx new file mode 100644 index 000000000..16484c2f8 --- /dev/null +++ b/packages/db-devtools/src/TanstackDbDevtools.tsx @@ -0,0 +1,158 @@ +/** @jsxImportSource solid-js */ +import { render } from "solid-js/web" +import { createSignal, lazy } from "solid-js" +import { initializeDevtoolsRegistry } from "./registry" +import type { DbDevtoolsConfig } from "./types" +import type { DbDevtoolsRegistry } from "./types" +import type { Signal } from "solid-js" + +export interface TanstackDbDevtoolsConfig extends DbDevtoolsConfig { + styleNonce?: string + shadowDOMTarget?: ShadowRoot +} + +class TanstackDbDevtools { + #registry: DbDevtoolsRegistry + #isMounted = false + #shadowDOMTarget?: ShadowRoot + #initialIsOpen: Signal + #position: Signal + #panelProps: Signal | undefined> + #toggleButtonProps: Signal | undefined> + #closeButtonProps: Signal | undefined> + #storageKey: Signal + #panelState: Signal + #onPanelStateChange: Signal<((isOpen: boolean) => void) | undefined> + #Component: any + #dispose?: () => void + + constructor(config: TanstackDbDevtoolsConfig) { + const { + initialIsOpen, + position, + panelProps, + toggleButtonProps, + closeButtonProps, + storageKey, + panelState, + onPanelStateChange, + styleNonce: _styleNonce, + shadowDOMTarget, + } = config + + this.#registry = initializeDevtoolsRegistry() + this.#shadowDOMTarget = shadowDOMTarget + this.#initialIsOpen = createSignal(initialIsOpen) + this.#position = createSignal(position) + this.#panelProps = createSignal(panelProps) + this.#toggleButtonProps = createSignal(toggleButtonProps) + this.#closeButtonProps = createSignal(closeButtonProps) + this.#storageKey = createSignal(storageKey) + this.#panelState = createSignal(panelState) + this.#onPanelStateChange = createSignal(onPanelStateChange) + } + + setInitialIsOpen(isOpen: boolean) { + this.#initialIsOpen[1](isOpen) + } + + setPosition(position: DbDevtoolsConfig["position"]) { + this.#position[1](position) + } + + setPanelProps(props: Record) { + this.#panelProps[1](props) + } + + setToggleButtonProps(props: Record) { + this.#toggleButtonProps[1](props) + } + + setCloseButtonProps(props: Record) { + this.#closeButtonProps[1](props) + } + + setStorageKey(key: string) { + this.#storageKey[1](key) + } + + setPanelState(state: DbDevtoolsConfig["panelState"]) { + this.#panelState[1](state) + } + + setOnPanelStateChange(callback: (isOpen: boolean) => void) { + this.#onPanelStateChange[1](() => callback) + } + + mount(el: T) { + if (this.#isMounted) { + throw new Error("DB Devtools is already mounted") + } + + const dispose = render(() => { + const [initialIsOpen] = this.#initialIsOpen + const [position] = this.#position + const [panelProps] = this.#panelProps + const [toggleButtonProps] = this.#toggleButtonProps + const [closeButtonProps] = this.#closeButtonProps + const [storageKey] = this.#storageKey + const [panelState] = this.#panelState + const [onPanelStateChange] = this.#onPanelStateChange + + let DbDevtools: any + + if (this.#Component) { + DbDevtools = this.#Component + } else { + DbDevtools = lazy(() => import("./DbDevtools")) + this.#Component = DbDevtools + } + + return ( + + ) + }, el) + + this.#isMounted = true + this.#dispose = dispose + } + + unmount() { + if (!this.#isMounted) { + throw new Error("DB Devtools is not mounted") + } + this.#dispose?.() + this.#isMounted = false + } +} + +export { TanstackDbDevtools } \ No newline at end of file diff --git a/packages/db-devtools/src/components/CollectionDetails.tsx b/packages/db-devtools/src/components/CollectionDetails.tsx new file mode 100644 index 000000000..997d87d5d --- /dev/null +++ b/packages/db-devtools/src/components/CollectionDetails.tsx @@ -0,0 +1,317 @@ +/** @jsxImportSource solid-js */ +import { For, Show, createEffect, createSignal, onCleanup } from "solid-js" +import type { DbDevtoolsRegistry } from "../types" + +interface CollectionDetailsProps { + collectionId: string + registry: DbDevtoolsRegistry +} + +export function CollectionDetails(props: CollectionDetailsProps) { + const [collectionData, setCollectionData] = createSignal>([]) + const [isLoading, setIsLoading] = createSignal(false) + const [error, setError] = createSignal(null) + + let unsubscribe: (() => void) | undefined + + createEffect(() => { + const collectionId = props.collectionId + if (!collectionId) return + + setIsLoading(true) + setError(null) + + // Get the collection (creates hard reference) + const collection = props.registry.getCollection(collectionId) + if (!collection) { + setError(`Collection not found`) + setIsLoading(false) + return + } + + // Subscribe to collection changes + unsubscribe = collection.subscribeChanges( + (_changes) => { + // Update the local state with fresh data + setCollectionData(Array.from(collection.values())) + }, + { includeInitialState: true } + ) + + setIsLoading(false) + + // Cleanup: release hard reference and unsubscribe + onCleanup(() => { + if (unsubscribe) { + unsubscribe() + unsubscribe = undefined + } + props.registry.releaseCollection(collectionId) + }) + }) + + const metadata = () => + props.registry.getCollectionMetadata(props.collectionId) + + return ( +
+ +
+ Loading collection details... +
+
+ } + > +
+
+

+ {metadata()?.type === `live-query` ? `🔄` : `📄`} + {` `} + {props.collectionId} +

+
+ Status: {metadata()?.status} + + {collectionData().length} items +
+
+ + {/* Metadata Section */} + +
+

+ Metadata +

+
+
+ Type: {metadata()!.type} +
+
+ Created: + {` `} + {metadata()!.createdAt.toLocaleString()} +
+
+ Last Updated: + {` `} + {metadata()!.lastUpdated.toLocaleString()} +
+
+ GC Time: + {` `} + {metadata()!.gcTime || `Default`}ms +
+ +
+ Transactions: + {` `} + {metadata()!.transactionCount} +
+
+
+ + {/* Live Query Timings */} + +
+

+ Performance Metrics +

+
+ +
+ Initial Run: + {` `} + {metadata()!.timings!.initialRunTime}ms +
+
+
+ Total Runs: + {` `} + {metadata()!.timings!.totalIncrementalRuns} +
+ +
+ Avg Incremental: + {` `} + {metadata()!.timings!.averageIncrementalRunTime}ms +
+
+ +
+ Last Run: + {` `} + {metadata()!.timings!.lastIncrementalRunTime}ms +
+
+
+
+
+
+
+ + {/* Data Section */} +
+

+ Data ({collectionData().length} items) +

+ + + + {(item, index) => ( +
+
+ + Item {index() + 1} + +
+                                {JSON.stringify(item, null, 2)}
+                              
+
+
+ )} +
+
+ } + > +
+ No data in collection +
+ +
+ + + } + > +
+ {error()} +
+ + + ) +} diff --git a/packages/db-devtools/src/components/TransactionList.tsx b/packages/db-devtools/src/components/TransactionList.tsx new file mode 100644 index 000000000..9f99d317b --- /dev/null +++ b/packages/db-devtools/src/components/TransactionList.tsx @@ -0,0 +1,142 @@ +/** @jsxImportSource solid-js */ +import { For, Show } from "solid-js" +import type { TransactionDetails } from "../types" + +interface TransactionListProps { + transactions: Array + selectedTransaction: string | null + onTransactionSelect: (id: string) => void +} + +export function TransactionList(props: TransactionListProps) { + const getStateColor = (state: string) => { + switch (state) { + case `completed`: + return `#22c55e` + case `failed`: + return `#ef4444` + case `persisting`: + return `#eab308` + case `pending`: + return `#3b82f6` + default: + return `#6b7280` + } + } + + const getStateIcon = (state: string) => { + switch (state) { + case `completed`: + return `✓` + case `failed`: + return `✗` + case `persisting`: + return `⟳` + case `pending`: + return `○` + default: + return `?` + } + } + + return ( +
+ + {(transaction) => ( +
props.onTransactionSelect(transaction.id)} + style={{ + padding: `12px 16px`, + "border-bottom": `1px solid #333`, + cursor: `pointer`, + "background-color": + props.selectedTransaction === transaction.id + ? `#0088ff20` + : `transparent`, + "border-left": + props.selectedTransaction === transaction.id + ? `3px solid #0088ff` + : `3px solid transparent`, + }} + > +
+
+ {transaction.id.slice(0, 8)}... +
+
+ + {getStateIcon(transaction.state)} + + + {transaction.state} + +
+
+
+ {transaction.collectionId} + {transaction.mutations.length} mutations +
+
+ {new Date(transaction.createdAt).toLocaleString()} +
+
+ )} + + } + > +
+ No transactions found +
+
+
+ ) +} diff --git a/packages/db-devtools/src/constants.ts b/packages/db-devtools/src/constants.ts new file mode 100644 index 000000000..31955418b --- /dev/null +++ b/packages/db-devtools/src/constants.ts @@ -0,0 +1,17 @@ +export const DEFAULT_HEIGHT = 500 +export const DEFAULT_WIDTH = 500 +export const POSITION = 'bottom-right' +export const BUTTON_POSITION = 'bottom-right' +export const INITIAL_IS_OPEN = false +export const DEFAULT_SORT_ORDER = 1 +export const DEFAULT_SORT_FN_NAME = 'Status > Last Updated' +export const DEFAULT_MUTATION_SORT_FN_NAME = 'Status > Last Updated' + +export const firstBreakpoint = 1024 +export const secondBreakpoint = 796 +export const thirdBreakpoint = 700 + +export type DevtoolsPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top' | 'bottom' | 'left' | 'right' +export type DevtoolsButtonPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'relative' + +export const isServer = typeof window === 'undefined' \ No newline at end of file diff --git a/packages/db-devtools/src/contexts/index.tsx b/packages/db-devtools/src/contexts/index.tsx new file mode 100644 index 000000000..761f33ec2 --- /dev/null +++ b/packages/db-devtools/src/contexts/index.tsx @@ -0,0 +1,151 @@ +import { createContext, useContext, createSignal, onMount, onCleanup } from 'solid-js' +import { createStore } from '@solid-primitives/storage' +import type { JSX, Accessor } from 'solid-js' +import type { DevtoolsPosition, DevtoolsButtonPosition } from '../constants' + +export type DevtoolsErrorType = 'loading' | 'error' + +export interface DbDevtoolsContext { + initialIsOpen?: boolean + position?: DevtoolsPosition + buttonPosition?: DevtoolsButtonPosition + shadowDOMTarget?: ShadowRoot + errorTypes?: DevtoolsErrorType[] + onlineManager?: { + isOnline: () => boolean + subscribe: (fn: (online: boolean) => void) => () => void + } +} + +export interface DbDevtoolsProps extends DbDevtoolsContext { + children?: JSX.Element +} + +const DbDevtoolsContext = createContext({}) + +export const useDbDevtoolsContext = () => useContext(DbDevtoolsContext) + +export const DbDevtoolsProvider = (props: DbDevtoolsProps) => { + const value = { + initialIsOpen: props.initialIsOpen, + position: props.position, + buttonPosition: props.buttonPosition, + shadowDOMTarget: props.shadowDOMTarget, + errorTypes: props.errorTypes, + onlineManager: props.onlineManager, + } + + return ( + + {props.children} + + ) +} + +// Theme Context +export type Theme = 'light' | 'dark' + +const ThemeContext = createContext<{ + theme: Accessor + setTheme: (theme: Theme) => void +}>({ + theme: () => 'dark', + setTheme: () => {}, +}) + +export const useTheme = () => useContext(ThemeContext).theme +export const useSetTheme = () => useContext(ThemeContext).setTheme + +export const ThemeProvider = (props: { children: JSX.Element }) => { + const [theme, setTheme] = createSignal('dark') + + onMount(() => { + // Check system preference + const prefersDark = window.matchMedia('(prefers-color-scheme: dark)') + setTheme(prefersDark.matches ? 'dark' : 'light') + + // Listen for changes + const handleChange = (e: MediaQueryListEvent) => { + setTheme(e.matches ? 'dark' : 'light') + } + + prefersDark.addEventListener('change', handleChange) + onCleanup(() => prefersDark.removeEventListener('change', handleChange)) + }) + + const value = { + theme, + setTheme, + } + + return ( + + {props.children} + + ) +} + +// PiP Context +const PiPContext = createContext<{ + pipWindow: Accessor + openPiP: () => void + closePiP: () => void +}>({ + pipWindow: () => null, + openPiP: () => {}, + closePiP: () => {}, +}) + +export const usePiPWindow = () => useContext(PiPContext) + +export const PiPProvider = (props: { children: JSX.Element }) => { + const [pipWindow, setPiPWindow] = createSignal(null) + + const openPiP = () => { + if (typeof window !== 'undefined' && 'documentPictureInPicture' in window) { + // @ts-ignore documentPictureInPicture API is not yet in TypeScript DOM types + window.documentPictureInPicture.requestWindow({ + width: 800, + height: 600, + }).then((win: Window) => { + setPiPWindow(win) + win.addEventListener('pagehide', () => { + setPiPWindow(null) + }) + }) + } + } + + const closePiP = () => { + const win = pipWindow() + if (win) { + win.close() + setPiPWindow(null) + } + } + + const value = { + pipWindow, + openPiP, + closePiP, + } + + return ( + + {props.children} + + ) +} + +// Storage hook for devtools state +export const useDevtoolsStorage = () => { + const [store, setStore] = createStore('tsdb-devtools', { + open: 'false', + position: 'bottom-right', + height: '500', + width: '500', + pip_open: 'false', + }) + + return [store, setStore] as const +} \ No newline at end of file diff --git a/packages/db-devtools/src/devtools.ts b/packages/db-devtools/src/devtools.ts new file mode 100644 index 000000000..0eedda116 --- /dev/null +++ b/packages/db-devtools/src/devtools.ts @@ -0,0 +1,62 @@ +import { initializeDevtoolsRegistry } from "./registry" +import type { CollectionImpl } from "@tanstack/db" +import type { DbDevtoolsRegistry } from "./types" + +/** + * Initialize the DB devtools registry. + * This should be called once in your application, typically in your main entry point. + * Collections will automatically register themselves if this registry is present. + */ +export function initializeDbDevtools(): void { + initializeDevtoolsRegistry() +} + +/** + * Manually register a collection with the devtools. + * This is automatically called by collections when they are created if devtools are enabled. + */ +export function registerCollection( + collection: CollectionImpl +): void { + const registry = window.__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (registry) { + registry.registerCollection(collection) + } +} + +/** + * Manually unregister a collection from the devtools. + * This is automatically called when collections are garbage collected. + */ +export function unregisterCollection(id: string): void { + const registry = window.__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (registry) { + registry.unregisterCollection(id) + } +} + +/** + * Check if devtools are currently enabled (registry is present). + */ +export function isDevtoolsEnabled(): boolean { + return !!window.__TANSTACK_DB_DEVTOOLS__ +} + +/** + * Get the current devtools registry instance. + */ +export function getDevtoolsRegistry(): DbDevtoolsRegistry | undefined { + return window.__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined +} + +/** + * Clean up the devtools registry and all references. + * This is useful for testing or when you want to completely reset the devtools state. + */ +export function cleanupDevtools(): void { + const registry = window.__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (registry) { + registry.cleanup() + delete window.__TANSTACK_DB_DEVTOOLS__ + } +} diff --git a/packages/db-devtools/src/icons/index.tsx b/packages/db-devtools/src/icons/index.tsx new file mode 100644 index 000000000..12f7e209a --- /dev/null +++ b/packages/db-devtools/src/icons/index.tsx @@ -0,0 +1,372 @@ +/** @jsxImportSource solid-js */ +import type { Component } from 'solid-js' + +export const TanstackLogo: Component = (props) => ( + + + +) + +export const ArrowDown: Component = (props) => ( + + + +) + +export const ArrowUp = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const ArrowLeft = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const ArrowRight = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const CheckCircle = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const LoadingCircle = (props: JSX.SvgSVGAttributes) => ( + + + + +) + +export const XCircle = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const PauseCircle = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const Search = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const Settings = (props: JSX.SvgSVGAttributes) => ( + + + + +) + +export const Trash = (props: JSX.SvgSVGAttributes) => ( + + + + +) + +export const Sun = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const Moon = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const Monitor = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const Wifi = (props: JSX.SvgSVGAttributes) => ( + + + + + + +) + +export const Offline = (props: JSX.SvgSVGAttributes) => ( + + + + +) + +export const ChevronDown = (props: JSX.SvgSVGAttributes) => ( + + + +) + +export const PiPIcon = (props: JSX.SvgSVGAttributes) => ( + + + + +) \ No newline at end of file diff --git a/packages/db-devtools/src/index.ts b/packages/db-devtools/src/index.ts new file mode 100644 index 000000000..ff3160d01 --- /dev/null +++ b/packages/db-devtools/src/index.ts @@ -0,0 +1,20 @@ +// New implementation exports (temporarily commented out until dependencies are installed) +// export * from './Devtools' +// export * from './contexts' +export * from './theme' +export * from './constants' +// export * from './utils' +// export * from './icons' +export * from './types' + +// Legacy exports for backwards compatibility +// export * from "./devtools" +export * from "./registry" + +// Main Devtools Class (follows TanStack pattern) +export { TanstackDbDevtools } from "./TanstackDbDevtools" +export type { TanstackDbDevtoolsConfig } from "./TanstackDbDevtools" + +// SolidJS Components (for direct SolidJS usage) +export { default as DbDevtools } from "./DbDevtools" +export { DbDevtoolsPanel } from "./DbDevtoolsPanel" diff --git a/packages/db-devtools/src/registry.ts b/packages/db-devtools/src/registry.ts new file mode 100644 index 000000000..e8cb6bc14 --- /dev/null +++ b/packages/db-devtools/src/registry.ts @@ -0,0 +1,290 @@ +import type { CollectionImpl } from "@tanstack/db" +import type { + CollectionMetadata, + CollectionRegistryEntry, + DbDevtoolsRegistry, + TransactionDetails, +} from "./types" + +class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { + public collections = new Map() + private pollingInterval: number | null = null + private readonly POLLING_INTERVAL_MS = 1000 // Poll every second for metadata updates + + constructor() { + // Start polling for metadata updates + this.startPolling() + } + + registerCollection = (collection: CollectionImpl): void => { + const metadata: CollectionMetadata = { + id: collection.id, + type: this.detectCollectionType(collection), + status: collection.status, + size: collection.size, + hasTransactions: collection.transactions.size > 0, + transactionCount: collection.transactions.size, + createdAt: new Date(), + lastUpdated: new Date(), + gcTime: collection.config.gcTime, + timings: this.isLiveQuery(collection) + ? { + totalIncrementalRuns: 0, + } + : undefined, + } + + const entry: CollectionRegistryEntry = { + weakRef: new WeakRef(collection), + metadata, + isActive: false, + } + + this.collections.set(collection.id, entry) + + // Track performance for live queries + if (this.isLiveQuery(collection)) { + this.instrumentLiveQuery(collection, entry) + } + } + + unregisterCollection = (id: string): void => { + const entry = this.collections.get(id) + if (entry) { + // Release any hard reference + entry.hardRef = undefined + entry.isActive = false + this.collections.delete(id) + } + } + + getCollectionMetadata = (id: string): CollectionMetadata | undefined => { + const entry = this.collections.get(id) + if (!entry) return undefined + + // Try to get fresh data from the collection if it's still alive + const collection = entry.weakRef.deref() + if (collection) { + // Update metadata with fresh data + entry.metadata.status = collection.status + entry.metadata.size = collection.size + entry.metadata.hasTransactions = collection.transactions.size > 0 + entry.metadata.transactionCount = collection.transactions.size + entry.metadata.lastUpdated = new Date() + } + + return { ...entry.metadata } + } + + getAllCollectionMetadata = (): Array => { + const results: Array = [] + + for (const [_id, entry] of this.collections) { + const collection = entry.weakRef.deref() + if (collection) { + // Collection is still alive, update metadata + entry.metadata.status = collection.status + entry.metadata.size = collection.size + entry.metadata.hasTransactions = collection.transactions.size > 0 + entry.metadata.transactionCount = collection.transactions.size + entry.metadata.lastUpdated = new Date() + results.push({ ...entry.metadata }) + } else { + // Collection was garbage collected, mark it + entry.metadata.status = `cleaned-up` + entry.metadata.lastUpdated = new Date() + results.push({ ...entry.metadata }) + } + } + + return results + } + + getCollection = (id: string): CollectionImpl | undefined => { + const entry = this.collections.get(id) + if (!entry) return undefined + + const collection = entry.weakRef.deref() + if (collection && !entry.isActive) { + // Create hard reference + entry.hardRef = collection + entry.isActive = true + } + + return collection + } + + releaseCollection = (id: string): void => { + const entry = this.collections.get(id) + if (entry && entry.isActive) { + // Release hard reference + entry.hardRef = undefined + entry.isActive = false + } + } + + getTransactions = (collectionId?: string): Array => { + const transactions: Array = [] + + for (const [id, entry] of this.collections) { + if (collectionId && id !== collectionId) continue + + const collection = entry.weakRef.deref() + if (!collection) continue + + for (const [txId, transaction] of collection.transactions) { + transactions.push({ + id: txId, + collectionId: id, + state: transaction.state, + mutations: transaction.mutations.map((m: any) => ({ + id: m.mutationId, + type: m.type, + key: m.key, + optimistic: m.optimistic, + createdAt: m.createdAt, + original: m.original, + modified: m.modified, + changes: m.changes, + })), + createdAt: transaction.createdAt, + updatedAt: transaction.createdAt, // Transaction doesn't have updatedAt, using createdAt + isPersisted: transaction.state === `completed`, + }) + } + } + + return transactions.sort( + (a, b) => b.createdAt.getTime() - a.createdAt.getTime() + ) + } + + getTransaction = (id: string): TransactionDetails | undefined => { + for (const [collectionId, entry] of this.collections) { + const collection = entry.weakRef.deref() + if (!collection) continue + + const transaction = collection.transactions.get(id) + if (transaction) { + return { + id, + collectionId, + state: transaction.state, + mutations: transaction.mutations.map((m: any) => ({ + id: m.mutationId, + type: m.type, + key: m.key, + optimistic: m.optimistic, + createdAt: m.createdAt, + original: m.original, + modified: m.modified, + changes: m.changes, + })), + createdAt: transaction.createdAt, + updatedAt: transaction.createdAt, // Transaction doesn't have updatedAt, using createdAt + isPersisted: transaction.state === `completed`, + } + } + } + return undefined + } + + cleanup = (): void => { + // Stop polling + if (this.pollingInterval) { + clearInterval(this.pollingInterval) + this.pollingInterval = null + } + + // Release all hard references + for (const [_id, entry] of this.collections) { + if (entry.isActive) { + entry.hardRef = undefined + entry.isActive = false + } + } + } + + garbageCollect = (): void => { + // Remove entries for collections that have been garbage collected + for (const [id, entry] of this.collections) { + const collection = entry.weakRef.deref() + if (!collection) { + this.collections.delete(id) + } + } + } + + private startPolling = (): void => { + if (this.pollingInterval) return + + this.pollingInterval = window.setInterval(() => { + // Garbage collect dead references + this.garbageCollect() + + // Update metadata for active collections + for (const [_id, entry] of this.collections) { + if (!entry.isActive) continue // Only update metadata for inactive collections to avoid holding refs + + const collection = entry.weakRef.deref() + if (collection) { + entry.metadata.status = collection.status + entry.metadata.size = collection.size + entry.metadata.hasTransactions = collection.transactions.size > 0 + entry.metadata.transactionCount = collection.transactions.size + entry.metadata.lastUpdated = new Date() + } + } + }, this.POLLING_INTERVAL_MS) + } + + private detectCollectionType = ( + collection: CollectionImpl + ): `collection` | `live-query` => { + // Check the devtools type marker first + if (collection.config.__devtoolsType) { + return collection.config.__devtoolsType + } + + // Check if the collection ID suggests it's a live query + if (collection.id.startsWith(`live-query-`)) { + return `live-query` + } + + // Default to regular collection + return `collection` + } + + private isLiveQuery = ( + collection: CollectionImpl + ): boolean => { + return this.detectCollectionType(collection) === `live-query` + } + + private instrumentLiveQuery = ( + collection: CollectionImpl, + entry: CollectionRegistryEntry + ): void => { + // This is where we would add performance tracking for live queries + // We'll need to hook into the query execution pipeline to track timings + // For now, this is a placeholder + if (!entry.metadata.timings) { + entry.metadata.timings = { + totalIncrementalRuns: 0, + } + } + } +} + +// Create and export the global registry +export function createDbDevtoolsRegistry(): DbDevtoolsRegistry { + return new DbDevtoolsRegistryImpl() +} + +// Initialize the global registry if not already present +export function initializeDevtoolsRegistry(): DbDevtoolsRegistry { + if (!window.__TANSTACK_DB_DEVTOOLS__) { + window.__TANSTACK_DB_DEVTOOLS__ = createDbDevtoolsRegistry() + } + return window.__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry +} diff --git a/packages/db-devtools/src/theme.ts b/packages/db-devtools/src/theme.ts new file mode 100644 index 000000000..febf8fe68 --- /dev/null +++ b/packages/db-devtools/src/theme.ts @@ -0,0 +1,299 @@ +export const tokens = { + colors: { + inherit: 'inherit', + current: 'currentColor', + transparent: 'transparent', + black: '#000000', + white: '#ffffff', + neutral: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + darkGray: { + 50: '#525c7a', + 100: '#49536e', + 200: '#414962', + 300: '#394056', + 400: '#313749', + 500: '#292e3d', + 600: '#212530', + 700: '#191c24', + 800: '#111318', + 900: '#0b0d10', + }, + gray: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + blue: { + 25: '#F5FAFF', + 50: '#EFF8FF', + 100: '#D1E9FF', + 200: '#B2DDFF', + 300: '#84CAFF', + 400: '#53B1FD', + 500: '#2E90FA', + 600: '#1570EF', + 700: '#175CD3', + 800: '#1849A9', + 900: '#194185', + }, + green: { + 25: '#F6FEF9', + 50: '#ECFDF3', + 100: '#D1FADF', + 200: '#A6F4C5', + 300: '#6CE9A6', + 400: '#32D583', + 500: '#12B76A', + 600: '#039855', + 700: '#027A48', + 800: '#05603A', + 900: '#054F31', + }, + red: { + 50: '#fef2f2', + 100: '#fee2e2', + 200: '#fecaca', + 300: '#fca5a5', + 400: '#f87171', + 500: '#ef4444', + 600: '#dc2626', + 700: '#b91c1c', + 800: '#991b1b', + 900: '#7f1d1d', + 950: '#450a0a', + }, + yellow: { + 25: '#FFFCF5', + 50: '#FFFAEB', + 100: '#FEF0C7', + 200: '#FEDF89', + 300: '#FEC84B', + 400: '#FDB022', + 500: '#F79009', + 600: '#DC6803', + 700: '#B54708', + 800: '#93370D', + 900: '#7A2E0E', + }, + purple: { + 25: '#FAFAFF', + 50: '#F4F3FF', + 100: '#EBE9FE', + 200: '#D9D6FE', + 300: '#BDB4FE', + 400: '#9B8AFB', + 500: '#7A5AF8', + 600: '#6938EF', + 700: '#5925DC', + 800: '#4A1FB8', + 900: '#3E1C96', + }, + teal: { + 25: '#F6FEFC', + 50: '#F0FDF9', + 100: '#CCFBEF', + 200: '#99F6E0', + 300: '#5FE9D0', + 400: '#2ED3B7', + 500: '#15B79E', + 600: '#0E9384', + 700: '#107569', + 800: '#125D56', + 900: '#134E48', + }, + pink: { + 25: '#fdf2f8', + 50: '#fce7f3', + 100: '#fbcfe8', + 200: '#f9a8d4', + 300: '#f472b6', + 400: '#ec4899', + 500: '#db2777', + 600: '#be185d', + 700: '#9d174d', + 800: '#831843', + 900: '#500724', + }, + cyan: { + 25: '#ecfeff', + 50: '#cffafe', + 100: '#a5f3fc', + 200: '#67e8f9', + 300: '#22d3ee', + 400: '#06b6d4', + 500: '#0891b2', + 600: '#0e7490', + 700: '#155e75', + 800: '#164e63', + 900: '#083344', + }, + }, + alpha: { + 100: 'ff', + 90: 'e5', + 80: 'cc', + 70: 'b3', + 60: '99', + 50: '80', + 40: '66', + 30: '4d', + 20: '33', + 10: '1a', + 0: '00', + }, + font: { + size: { + '2xs': 'calc(var(--tsdb-font-size) * 0.625)', + xs: 'calc(var(--tsdb-font-size) * 0.75)', + sm: 'calc(var(--tsdb-font-size) * 0.875)', + md: 'var(--tsdb-font-size)', + lg: 'calc(var(--tsdb-font-size) * 1.125)', + xl: 'calc(var(--tsdb-font-size) * 1.25)', + '2xl': 'calc(var(--tsdb-font-size) * 1.5)', + '3xl': 'calc(var(--tsdb-font-size) * 1.875)', + '4xl': 'calc(var(--tsdb-font-size) * 2.25)', + '5xl': 'calc(var(--tsdb-font-size) * 3)', + '6xl': 'calc(var(--tsdb-font-size) * 3.75)', + '7xl': 'calc(var(--tsdb-font-size) * 4.5)', + '8xl': 'calc(var(--tsdb-font-size) * 6)', + '9xl': 'calc(var(--tsdb-font-size) * 8)', + }, + lineHeight: { + xs: 'calc(var(--tsdb-font-size) * 1)', + sm: 'calc(var(--tsdb-font-size) * 1.25)', + md: 'calc(var(--tsdb-font-size) * 1.5)', + lg: 'calc(var(--tsdb-font-size) * 1.75)', + xl: 'calc(var(--tsdb-font-size) * 2)', + '2xl': 'calc(var(--tsdb-font-size) * 2.25)', + '3xl': 'calc(var(--tsdb-font-size) * 2.5)', + '4xl': 'calc(var(--tsdb-font-size) * 2.75)', + '5xl': 'calc(var(--tsdb-font-size) * 3)', + '6xl': 'calc(var(--tsdb-font-size) * 3.25)', + '7xl': 'calc(var(--tsdb-font-size) * 3.5)', + '8xl': 'calc(var(--tsdb-font-size) * 3.75)', + '9xl': 'calc(var(--tsdb-font-size) * 4)', + }, + weight: { + thin: '100', + extralight: '200', + light: '300', + normal: '400', + medium: '500', + semibold: '600', + bold: '700', + extrabold: '800', + black: '900', + }, + }, + breakpoints: { + xs: '320px', + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + '2xl': '1536px', + }, + border: { + radius: { + none: '0px', + xs: 'calc(var(--tsdb-font-size) * 0.125)', + sm: 'calc(var(--tsdb-font-size) * 0.25)', + md: 'calc(var(--tsdb-font-size) * 0.375)', + lg: 'calc(var(--tsdb-font-size) * 0.5)', + xl: 'calc(var(--tsdb-font-size) * 0.75)', + '2xl': 'calc(var(--tsdb-font-size) * 1)', + '3xl': 'calc(var(--tsdb-font-size) * 1.5)', + full: '9999px', + }, + }, + size: { + 0: '0px', + 0.25: 'calc(var(--tsdb-font-size) * 0.0625)', + 0.5: 'calc(var(--tsdb-font-size) * 0.125)', + 1: 'calc(var(--tsdb-font-size) * 0.25)', + 1.5: 'calc(var(--tsdb-font-size) * 0.375)', + 2: 'calc(var(--tsdb-font-size) * 0.5)', + 2.5: 'calc(var(--tsdb-font-size) * 0.625)', + 3: 'calc(var(--tsdb-font-size) * 0.75)', + 3.5: 'calc(var(--tsdb-font-size) * 0.875)', + 4: 'calc(var(--tsdb-font-size) * 1)', + 4.5: 'calc(var(--tsdb-font-size) * 1.125)', + 5: 'calc(var(--tsdb-font-size) * 1.25)', + 5.5: 'calc(var(--tsdb-font-size) * 1.375)', + 6: 'calc(var(--tsdb-font-size) * 1.5)', + 6.5: 'calc(var(--tsdb-font-size) * 1.625)', + 7: 'calc(var(--tsdb-font-size) * 1.75)', + 8: 'calc(var(--tsdb-font-size) * 2)', + 9: 'calc(var(--tsdb-font-size) * 2.25)', + 10: 'calc(var(--tsdb-font-size) * 2.5)', + 11: 'calc(var(--tsdb-font-size) * 2.75)', + 12: 'calc(var(--tsdb-font-size) * 3)', + 14: 'calc(var(--tsdb-font-size) * 3.5)', + 16: 'calc(var(--tsdb-font-size) * 4)', + 20: 'calc(var(--tsdb-font-size) * 5)', + 24: 'calc(var(--tsdb-font-size) * 6)', + 28: 'calc(var(--tsdb-font-size) * 7)', + 32: 'calc(var(--tsdb-font-size) * 8)', + 36: 'calc(var(--tsdb-font-size) * 9)', + 40: 'calc(var(--tsdb-font-size) * 10)', + 44: 'calc(var(--tsdb-font-size) * 11)', + 48: 'calc(var(--tsdb-font-size) * 12)', + 52: 'calc(var(--tsdb-font-size) * 13)', + 56: 'calc(var(--tsdb-font-size) * 14)', + 60: 'calc(var(--tsdb-font-size) * 15)', + 64: 'calc(var(--tsdb-font-size) * 16)', + 72: 'calc(var(--tsdb-font-size) * 18)', + 80: 'calc(var(--tsdb-font-size) * 20)', + 96: 'calc(var(--tsdb-font-size) * 24)', + }, + shadow: { + xs: (_: string = 'rgb(0 0 0 / 0.1)') => + `0 1px 2px 0 rgb(0 0 0 / 0.05)` as const, + sm: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}` as const, + md: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}` as const, + lg: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}` as const, + xl: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}` as const, + '2xl': (color: string = 'rgb(0 0 0 / 0.25)') => + `0 25px 50px -12px ${color}` as const, + inner: (color: string = 'rgb(0 0 0 / 0.05)') => + `inset 0 2px 4px 0 ${color}` as const, + none: () => `none` as const, + }, + zIndices: { + hide: -1, + auto: 'auto', + base: 0, + docked: 10, + dropdown: 1000, + sticky: 1100, + banner: 1200, + overlay: 1300, + modal: 1400, + popover: 1500, + skipLink: 1600, + toast: 1700, + tooltip: 1800, + }, +} as const \ No newline at end of file diff --git a/packages/db-devtools/src/types.ts b/packages/db-devtools/src/types.ts new file mode 100644 index 000000000..66fd6c3b3 --- /dev/null +++ b/packages/db-devtools/src/types.ts @@ -0,0 +1,123 @@ +import type { CollectionImpl, CollectionStatus } from "@tanstack/db" + +export interface DbDevtoolsConfig { + /** + * Set this true if you want the dev tools to default to being open + */ + initialIsOpen?: boolean + /** + * The position of the TanStack logo to open and close the devtools panel. + * 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'relative' + * Defaults to 'bottom-right' + */ + position?: + | `top-left` + | `top-right` + | `bottom-left` + | `bottom-right` + | `relative` + /** + * Use this to add props to the panel. For example, you can add className, style (merge and override default style), etc. + */ + panelProps?: Record + /** + * Use this to add props to the close button. For example, you can add className, style (merge and override default style), etc. + */ + closeButtonProps?: Record + /** + * Use this to add props to the toggle button. For example, you can add className, style (merge and override default style), etc. + */ + toggleButtonProps?: Record + /** + * The prefix for the localStorage keys used to store the open state and position of the devtools panel. + * Defaults to 'tanstackDbDevtools' + */ + storageKey?: string + /** + * A boolean variable indicating whether the pannel is open or closed. + * If defined, the open state will be controlled by this variable, otherwise it will be controlled by the component's internal state. + */ + panelState?: `open` | `closed` + /** + * A callback function which will be called when the open state changes. + * If panelState is defined, this callback will be called when the user toggles the panel. + */ + onPanelStateChange?: (isOpen: boolean) => void +} + +export interface CollectionMetadata { + id: string + type: `collection` | `live-query` + status: CollectionStatus + size: number + hasTransactions: boolean + transactionCount: number + createdAt: Date + lastUpdated: Date + gcTime?: number + + // Performance tracking for live queries + timings?: { + initialRunTime?: number + lastIncrementalRunTime?: number + totalIncrementalRuns: number + averageIncrementalRunTime?: number + } + + // Additional metadata + schema?: any + syncConfig?: any +} + +export interface CollectionRegistryEntry { + weakRef: WeakRef> + metadata: CollectionMetadata + isActive: boolean // Whether we're currently viewing this collection (hard ref held) + hardRef?: CollectionImpl // Only set when actively viewing +} + +export interface TransactionDetails { + id: string + collectionId: string + state: string + mutations: Array<{ + id: string + type: `insert` | `update` | `delete` + key: any + optimistic: boolean + createdAt: Date + original?: any + modified?: any + changes?: any + }> + createdAt: Date + updatedAt: Date + isPersisted: boolean +} + +export interface DbDevtoolsRegistry { + collections: Map + + // Registration methods + registerCollection: (collection: CollectionImpl) => void + unregisterCollection: (id: string) => void + + // Metadata access + getCollectionMetadata: (id: string) => CollectionMetadata | undefined + getAllCollectionMetadata: () => Array + + // Collection access (creates hard refs) + getCollection: (id: string) => CollectionImpl | undefined + releaseCollection: (id: string) => void + + // Transaction access + getTransactions: (collectionId?: string) => Array + getTransaction: (id: string) => TransactionDetails | undefined + + // Cleanup utilities + cleanup: () => void + garbageCollect: () => void +} + +// Window global interface is already declared in @tanstack/db +// The DbDevtoolsRegistry interface extends the base interface used there diff --git a/packages/db-devtools/src/utils.tsx b/packages/db-devtools/src/utils.tsx new file mode 100644 index 000000000..ba8f9025c --- /dev/null +++ b/packages/db-devtools/src/utils.tsx @@ -0,0 +1,156 @@ +import { tokens } from './theme' + +export const convertRemToPixels = (rem: number) => { + return rem * parseFloat(getComputedStyle(document.documentElement).fontSize) +} + +export const displayValue = (value: any, truncate: boolean = false) => { + if (value === null) return 'null' + if (value === undefined) return 'undefined' + if (typeof value === 'string') { + return truncate && value.length > 100 ? value.substring(0, 100) + '...' : value + } + if (typeof value === 'number') return value.toString() + if (typeof value === 'boolean') return value ? 'true' : 'false' + if (Array.isArray(value)) { + return truncate && value.length > 10 ? `Array(${value.length})` : JSON.stringify(value) + } + if (typeof value === 'object') { + const keys = Object.keys(value) + return truncate && keys.length > 5 ? `Object(${keys.length})` : JSON.stringify(value) + } + return String(value) +} + +export const getStatusColor = (status: string): 'green' | 'yellow' | 'red' | 'gray' | 'blue' | 'purple' => { + switch (status) { + case 'ready': + return 'green' + case 'loading': + return 'yellow' + case 'error': + return 'red' + case 'idle': + return 'gray' + case 'pending': + return 'blue' + default: + return 'gray' + } +} + +export const getStatusLabel = (status: string): string => { + switch (status) { + case 'ready': + return 'Ready' + case 'loading': + return 'Loading' + case 'error': + return 'Error' + case 'idle': + return 'Idle' + case 'pending': + return 'Pending' + default: + return 'Unknown' + } +} + +export const getSidedProp = ( + position: 'top' | 'bottom' | 'left' | 'right', + side: 'top' | 'right' | 'bottom' | 'left', + value: string | number +): string => { + return position === side ? String(value) : '0' +} + +export const sortFns = { + 'Status > Last Updated': (a: any, b: any) => { + if (a.status === b.status) { + return (b.updatedAt || 0) - (a.updatedAt || 0) + } + const statusOrder = ['error', 'loading', 'ready', 'idle'] + return statusOrder.indexOf(a.status) - statusOrder.indexOf(b.status) + }, + 'Last Updated': (a: any, b: any) => (b.updatedAt || 0) - (a.updatedAt || 0), + 'Created': (a: any, b: any) => (b.createdAt || 0) - (a.createdAt || 0), +} + +export const mutationSortFns = { + 'Status > Last Updated': (a: any, b: any) => { + if (a.state === b.state) { + return (b.updatedAt || 0) - (a.updatedAt || 0) + } + const stateOrder = ['error', 'loading', 'success', 'idle'] + return stateOrder.indexOf(a.state) - stateOrder.indexOf(b.state) + }, + 'Last Updated': (a: any, b: any) => (b.updatedAt || 0) - (a.updatedAt || 0), + 'Created': (a: any, b: any) => (b.submittedAt || 0) - (a.submittedAt || 0), +} + +export const formatTime = (date: Date) => { + return date.toLocaleTimeString() +} + +export const formatDate = (date: Date) => { + return date.toLocaleDateString() +} + +export const formatDateTime = (date: Date) => { + return date.toLocaleString() +} + +export const formatDuration = (ms: number) => { + if (ms < 1000) { + return `${ms}ms` + } + if (ms < 60000) { + return `${(ms / 1000).toFixed(1)}s` + } + return `${(ms / 60000).toFixed(1)}m` +} + +export const copyToClipboard = (text: string) => { + if (navigator.clipboard) { + navigator.clipboard.writeText(text) + } else { + const textArea = document.createElement('textarea') + textArea.value = text + document.body.appendChild(textArea) + textArea.select() + document.execCommand('copy') + document.body.removeChild(textArea) + } +} + +export const getCollectionStatusColor = (status: string) => { + const { colors } = tokens + switch (status) { + case 'ready': + return colors.green[500] + case 'loading': + return colors.yellow[500] + case 'error': + return colors.red[500] + case 'cleaned-up': + return colors.gray[500] + default: + return colors.gray[500] + } +} + +export const getTransactionStatusColor = (state: string) => { + const { colors } = tokens + switch (state) { + case 'pending': + return colors.blue[500] + case 'success': + return colors.green[500] + case 'error': + return colors.red[500] + case 'idle': + return colors.gray[500] + default: + return colors.gray[500] + } +} \ No newline at end of file diff --git a/packages/db-devtools/tsconfig.json b/packages/db-devtools/tsconfig.json new file mode 100644 index 000000000..97a82aa3a --- /dev/null +++ b/packages/db-devtools/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "build", + "declaration": true, + "declarationMap": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "module": "ESNext", + "moduleResolution": "Bundler", + "target": "ES2021", + "lib": ["ES2021", "DOM"] + }, + "include": ["src/**/*", "*.config.ts"], + "exclude": ["build", "dist", "node_modules"] +} \ No newline at end of file diff --git a/packages/db-devtools/tsconfig.prod.json b/packages/db-devtools/tsconfig.prod.json new file mode 100644 index 000000000..ba6b831b4 --- /dev/null +++ b/packages/db-devtools/tsconfig.prod.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "target": "ES2021", + "lib": ["ES2021", "DOM"] + }, + "exclude": ["src/__tests__", "**/*.test.ts", "**/*.test.tsx"] +} \ No newline at end of file diff --git a/packages/db-devtools/tsup.config.ts b/packages/db-devtools/tsup.config.ts new file mode 100644 index 000000000..f92a71523 --- /dev/null +++ b/packages/db-devtools/tsup.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: ['src/index.ts'], + format: ['esm', 'cjs'], + dts: true, + sourcemap: true, + clean: true, + outDir: 'build', + external: ['solid-js', 'solid-js/web', '@tanstack/db'], + esbuildOptions(options) { + // Use SolidJS-compatible JSX settings + options.jsx = 'automatic' + options.jsxImportSource = 'solid-js' + // Add SolidJS runtime helpers + options.banner = { + js: 'import{template as _$template,delegateEvents as _$delegateEvents,addEventListener as _$addEventListener,classList as _$classList,style as _$style,setAttribute as _$setAttribute,setProperty as _$setProperty,className as _$className,textContent as _$textContent,innerHTML as _$innerHTML}from"solid-js/web";' + } + }, +}) \ No newline at end of file diff --git a/packages/db-devtools/vite.config.ts b/packages/db-devtools/vite.config.ts new file mode 100644 index 000000000..d32884354 --- /dev/null +++ b/packages/db-devtools/vite.config.ts @@ -0,0 +1,25 @@ +import { defineConfig } from 'vite' +import solid from 'vite-plugin-solid' +import dts from 'vite-plugin-dts' + +export default defineConfig({ + plugins: [ + solid(), + dts({ + insertTypesEntry: true, + include: ['src/**/*'], + exclude: ['src/**/*.test.*', 'src/__tests__/**/*'] + }) + ], + build: { + target: 'esnext', + lib: { + entry: 'src/index.ts', + formats: ['es', 'cjs'], + fileName: (format) => `index.${format === 'es' ? 'js' : 'cjs'}`, + }, + rollupOptions: { + external: ['solid-js', 'solid-js/web', '@tanstack/db'], + }, + }, +}) \ No newline at end of file diff --git a/packages/db/src/collection.ts b/packages/db/src/collection.ts index 9551a976c..65b9ddc9e 100644 --- a/packages/db/src/collection.ts +++ b/packages/db/src/collection.ts @@ -22,6 +22,23 @@ import type { StandardSchemaV1 } from "@standard-schema/spec" // Store collections in memory export const collectionsStore = new Map>() +// Check for devtools registry and register collection if available +function registerWithDevtools(collection: CollectionImpl): void { + if (typeof window !== `undefined` && window.__TANSTACK_DB_DEVTOOLS__) { + window.__TANSTACK_DB_DEVTOOLS__.registerCollection(collection) + } +} + +// Declare the devtools registry on window +declare global { + interface Window { + __TANSTACK_DB_DEVTOOLS__?: { + registerCollection: (collection: CollectionImpl) => void + unregisterCollection: (id: string) => void + } + } +} + interface PendingSyncedTransaction> { committed: boolean operations: Array> @@ -344,6 +361,9 @@ export class CollectionImpl< this.syncedData = new Map() } + // Register with devtools if available + registerWithDevtools(this) + // Only start sync immediately if explicitly enabled if (config.startSync === true) { this.startSync() @@ -527,6 +547,11 @@ export class CollectionImpl< }) } + // Unregister from devtools if available + if (typeof window !== `undefined` && window.__TANSTACK_DB_DEVTOOLS__) { + window.__TANSTACK_DB_DEVTOOLS__.unregisterCollection(this.id) + } + // Clear data this.syncedData.clear() this.syncedMetadata.clear() diff --git a/packages/db/src/query/live-query-collection.ts b/packages/db/src/query/live-query-collection.ts index fe284c164..77d9edea8 100644 --- a/packages/db/src/query/live-query-collection.ts +++ b/packages/db/src/query/live-query-collection.ts @@ -339,6 +339,8 @@ export function liveQueryCollectionOptions< onUpdate: config.onUpdate, onDelete: config.onDelete, startSync: config.startSync, + // Mark as live query for devtools + __devtoolsType: `live-query` as const, } } diff --git a/packages/db/src/types.ts b/packages/db/src/types.ts index 0302c2b7a..cb9e20b02 100644 --- a/packages/db/src/types.ts +++ b/packages/db/src/types.ts @@ -330,6 +330,11 @@ export interface CollectionConfig< * compare: (x, y) => x.createdAt.getTime() - y.createdAt.getTime() */ compare?: (x: T, y: T) => number + /** + * Internal field used by devtools to identify collection type + * @internal + */ + __devtoolsType?: `live-query` | `collection` /** * Optional asynchronous handler function called before an insert operation * @param params Object containing transaction and collection information diff --git a/packages/react-db-devtools/package.json b/packages/react-db-devtools/package.json new file mode 100644 index 000000000..43c4117e0 --- /dev/null +++ b/packages/react-db-devtools/package.json @@ -0,0 +1,96 @@ +{ + "name": "@tanstack/react-db-devtools", + "version": "0.0.1", + "description": "React wrapper for TanStack DB Devtools", + "author": "tanstack", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/db.git", + "directory": "packages/react-db-devtools" + }, + "homepage": "https://tanstack.com/db", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "type": "module", + "types": "build/legacy/index.d.ts", + "main": "build/legacy/index.cjs", + "module": "build/legacy/index.js", + "exports": { + ".": { + "@tanstack/custom-condition": "./src/index.ts", + "import": { + "types": "./build/modern/index.d.ts", + "default": "./build/modern/index.js" + }, + "require": { + "types": "./build/modern/index.d.cts", + "default": "./build/modern/index.cjs" + } + }, + "./production": { + "import": { + "types": "./build/modern/production.d.ts", + "default": "./build/modern/production.js" + }, + "require": { + "types": "./build/modern/production.d.cts", + "default": "./build/modern/production.cjs" + } + }, + "./build/modern/production.js": { + "import": { + "types": "./build/modern/production.d.ts", + "default": "./build/modern/production.js" + }, + "require": { + "types": "./build/modern/production.d.cts", + "default": "./build/modern/production.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "build", + "src", + "!src/__tests__" + ], + "engines": { + "node": ">=18" + }, + "scripts": { + "clean": "premove ./build ./coverage ./dist-ts", + "compile": "tsc --build", + "test:eslint": "eslint ./src", + "test:types": "npm-run-all --serial test:types:*", + "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js --build tsconfig.legacy.json", + "test:types:tscurrent": "tsc --build", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch", + "test:build": "publint --strict && attw --pack", + "build": "tsup --tsconfig tsconfig.prod.json", + "build:dev": "tsup --watch" + }, + "dependencies": { + "@tanstack/db-devtools": "workspace:*" + }, + "devDependencies": { + "@tanstack/react-db": "workspace:*", + "@testing-library/react": "^16.1.0", + "@types/react": "^19.0.1", + "@vitejs/plugin-react": "^4.3.4", + "npm-run-all2": "^5.0.0", + "react": "^19.0.0" + }, + "peerDependencies": { + "@tanstack/react-db": "workspace:^", + "react": "^18 || ^19" + } +} \ No newline at end of file diff --git a/packages/react-db-devtools/src/ReactDbDevtools.tsx b/packages/react-db-devtools/src/ReactDbDevtools.tsx new file mode 100644 index 000000000..25043ccea --- /dev/null +++ b/packages/react-db-devtools/src/ReactDbDevtools.tsx @@ -0,0 +1,98 @@ +"use client" +import { useEffect, useRef, useState } from "react" +import { TanstackDbDevtools } from "@tanstack/db-devtools" +import type { TanstackDbDevtoolsConfig } from "@tanstack/db-devtools" + +export interface ReactDbDevtoolsProps extends TanstackDbDevtoolsConfig { + // Additional React-specific props if needed +} + +export function ReactDbDevtools(props: ReactDbDevtoolsProps = {}) { + const ref = useRef(null) + const [devtools] = useState(() => new TanstackDbDevtools(props)) + + // Update devtools when props change + useEffect(() => { + if (props.initialIsOpen !== undefined) { + devtools.setInitialIsOpen(props.initialIsOpen) + } + }, [devtools, props.initialIsOpen]) + + useEffect(() => { + if (props.position) { + devtools.setPosition(props.position) + } + }, [devtools, props.position]) + + useEffect(() => { + if (props.panelProps) { + devtools.setPanelProps(props.panelProps) + } + }, [devtools, props.panelProps]) + + useEffect(() => { + if (props.toggleButtonProps) { + devtools.setToggleButtonProps(props.toggleButtonProps) + } + }, [devtools, props.toggleButtonProps]) + + useEffect(() => { + if (props.closeButtonProps) { + devtools.setCloseButtonProps(props.closeButtonProps) + } + }, [devtools, props.closeButtonProps]) + + useEffect(() => { + if (props.storageKey) { + devtools.setStorageKey(props.storageKey) + } + }, [devtools, props.storageKey]) + + useEffect(() => { + if (props.panelState) { + devtools.setPanelState(props.panelState) + } + }, [devtools, props.panelState]) + + useEffect(() => { + if (props.onPanelStateChange) { + devtools.setOnPanelStateChange(props.onPanelStateChange) + } + }, [devtools, props.onPanelStateChange]) + + useEffect(() => { + if (ref.current) { + devtools.mount(ref.current) + } + + return () => { + devtools.unmount() + } + }, [devtools]) + + return
+} + +export function ReactDbDevtoolsPanel(props: ReactDbDevtoolsProps = {}) { + const ref = useRef(null) + const [devtools] = useState(() => new TanstackDbDevtools(props)) + + // Similar prop updates... + useEffect(() => { + if (props.initialIsOpen !== undefined) { + devtools.setInitialIsOpen(props.initialIsOpen) + } + }, [devtools, props.initialIsOpen]) + + useEffect(() => { + if (ref.current) { + devtools.mount(ref.current) + } + + return () => { + devtools.unmount() + } + }, [devtools]) + + return
+} diff --git a/packages/react-db-devtools/src/index.ts b/packages/react-db-devtools/src/index.ts new file mode 100644 index 000000000..dd2c614bf --- /dev/null +++ b/packages/react-db-devtools/src/index.ts @@ -0,0 +1,4 @@ +export * from "./ReactDbDevtools" + +// Export development utilities +export { ReactDbDevtools, ReactDbDevtoolsPanel } from "./ReactDbDevtools" diff --git a/packages/react-db-devtools/tsconfig.json b/packages/react-db-devtools/tsconfig.json new file mode 100644 index 000000000..cf93cefca --- /dev/null +++ b/packages/react-db-devtools/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "bundler", + "target": "ES2020" + }, + "include": ["src/**/*", "*.config.ts"], + "exclude": ["dist", "node_modules"] +} \ No newline at end of file diff --git a/packages/react-db-devtools/tsconfig.prod.json b/packages/react-db-devtools/tsconfig.prod.json new file mode 100644 index 000000000..d9b965512 --- /dev/null +++ b/packages/react-db-devtools/tsconfig.prod.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "module": "ESNext", + "moduleResolution": "bundler", + "target": "ES2020" + }, + "exclude": ["src/__tests__", "**/*.test.ts", "**/*.test.tsx"] +} \ No newline at end of file diff --git a/packages/react-db-devtools/tsup.config.ts b/packages/react-db-devtools/tsup.config.ts new file mode 100644 index 000000000..16ffb879c --- /dev/null +++ b/packages/react-db-devtools/tsup.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from 'tsup' + +export default defineConfig([ + { + entry: ['src/*.ts', 'src/*.tsx'], + format: ['esm', 'cjs'], + dts: true, + sourcemap: true, + clean: true, + external: ['react', 'react-dom', '@tanstack/react-db', '@tanstack/db-devtools'], + outDir: 'build/modern', + }, + { + entry: ['src/*.ts', 'src/*.tsx'], + format: ['esm', 'cjs'], + dts: true, + sourcemap: true, + clean: false, + external: ['react', 'react-dom', '@tanstack/react-db', '@tanstack/db-devtools'], + outDir: 'build/legacy', + }, +]) \ No newline at end of file diff --git a/packages/vue-db-devtools/package.json b/packages/vue-db-devtools/package.json new file mode 100644 index 000000000..599dca187 --- /dev/null +++ b/packages/vue-db-devtools/package.json @@ -0,0 +1,60 @@ +{ + "name": "@tanstack/vue-db-devtools", + "version": "0.0.1", + "description": "Vue wrapper for TanStack DB Devtools", + "author": "tanstack", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/db.git", + "directory": "packages/vue-db-devtools" + }, + "homepage": "https://tanstack.com/db", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "type": "module", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + } + }, + "sideEffects": false, + "files": [ + "dist" + ], + "engines": { + "node": ">=18" + }, + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "test": "vitest", + "test:ci": "vitest run", + "lint": "eslint src", + "clean": "rm -rf dist" + }, + "dependencies": { + "@tanstack/db-devtools": "workspace:*" + }, + "peerDependencies": { + "@tanstack/vue-db": "workspace:*", + "vue": ">=3" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "tsup": "^8.0.0", + "typescript": "^5.0.0", + "vue": "^3.0.0", + "vite": "^5.0.0", + "vitest": "^1.0.0" + } +} \ No newline at end of file diff --git a/packages/vue-db-devtools/src/VueDbDevtools.vue b/packages/vue-db-devtools/src/VueDbDevtools.vue new file mode 100644 index 000000000..b8a996435 --- /dev/null +++ b/packages/vue-db-devtools/src/VueDbDevtools.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/packages/vue-db-devtools/src/index.ts b/packages/vue-db-devtools/src/index.ts new file mode 100644 index 000000000..41ab8dab2 --- /dev/null +++ b/packages/vue-db-devtools/src/index.ts @@ -0,0 +1,5 @@ +// Export types only for now - Vue SFC files need different build setup +export type { VueDbDevtoolsProps } from "./VueDbDevtools.vue" + +// Re-export devtools functions +export { initializeDbDevtools } from "@tanstack/db-devtools" diff --git a/packages/vue-db-devtools/tsconfig.json b/packages/vue-db-devtools/tsconfig.json new file mode 100644 index 000000000..7a3b2a3ca --- /dev/null +++ b/packages/vue-db-devtools/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": true, + "jsx": "preserve" + }, + "include": ["src/**/*"], + "exclude": ["dist", "node_modules"] +} \ No newline at end of file diff --git a/packages/vue-db-devtools/tsup.config.ts b/packages/vue-db-devtools/tsup.config.ts new file mode 100644 index 000000000..ac48f869a --- /dev/null +++ b/packages/vue-db-devtools/tsup.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "tsup" + +export default defineConfig({ + entry: ["src/index.ts"], + format: ["esm", "cjs"], + dts: false, + sourcemap: true, + clean: true, + external: ["vue", "solid-js", "@tanstack/db-devtools"], +}) \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21e1bc93e..fb99dabb2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,49 +1,50 @@ -lockfileVersion: "9.0" +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: + .: devDependencies: - "@changesets/cli": + '@changesets/cli': specifier: ^2.28.1 version: 2.29.5 - "@eslint/js": + '@eslint/js': specifier: ^9.22.0 version: 9.30.1 - "@stylistic/eslint-plugin": + '@stylistic/eslint-plugin': specifier: ^4.2.0 version: 4.4.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@svitejs/changesets-changelog-github-compact": + '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0 - "@tanstack/config": + '@tanstack/config': specifier: ^0.17.1 version: 0.17.1(@types/node@22.16.1)(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@testing-library/jest-dom": + '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 - "@types/node": + '@types/node': specifier: ^22.13.10 version: 22.16.1 - "@types/react": + '@types/react': specifier: ^19.0.12 version: 19.1.8 - "@types/react-dom": + '@types/react-dom': specifier: ^19.0.4 version: 19.1.6(@types/react@19.1.8) - "@types/use-sync-external-store": + '@types/use-sync-external-store': specifier: ^0.0.6 version: 0.0.6 - "@typescript-eslint/eslint-plugin": + '@typescript-eslint/eslint-plugin': specifier: ^8.26.1 version: 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/parser": + '@typescript-eslint/parser': specifier: ^8.26.1 version: 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@vitejs/plugin-react": + '@vitejs/plugin-react': specifier: ^4.3.4 version: 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) eslint: @@ -97,21 +98,24 @@ importers: examples/react/todo: dependencies: - "@tanstack/db-collections": + '@tanstack/db-collections': specifier: ^0.0.23 version: link:../../../packages/db-collections - "@tanstack/query-core": + '@tanstack/query-core': specifier: ^5.81.5 version: 5.81.5 - "@tanstack/react-db": - specifier: ^0.0.19 - version: link:../../../packages/react-db - "@tanstack/react-router": + '@tanstack/react-db': + specifier: ^0.0.20 + version: 0.0.20(react@19.1.0)(typescript@5.8.3) + '@tanstack/react-db-devtools': + specifier: workspace:* + version: link:../../../packages/react-db-devtools + '@tanstack/react-router': specifier: ^1.125.6 version: 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/react-start": + '@tanstack/react-start': specifier: ^1.126.1 - version: 1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + version: 1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) cors: specifier: ^2.8.5 version: 2.8.5 @@ -140,37 +144,37 @@ importers: specifier: ^5.1.4 version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) devDependencies: - "@eslint/js": + '@eslint/js': specifier: ^9.22.0 version: 9.30.1 - "@tailwindcss/vite": + '@tailwindcss/vite': specifier: ^4.0.0-alpha.8 version: 4.1.11(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@types/cors": + '@types/cors': specifier: ^2.8.17 version: 2.8.19 - "@types/express": + '@types/express': specifier: ^4.17.21 version: 4.17.23 - "@types/node": + '@types/node': specifier: ^22.13.10 version: 22.16.1 - "@types/pg": + '@types/pg': specifier: ^8.11.11 version: 8.15.4 - "@types/react": + '@types/react': specifier: ^19.0.12 version: 19.1.8 - "@types/react-dom": + '@types/react-dom': specifier: ^19.0.0 version: 19.1.6(@types/react@19.1.8) - "@typescript-eslint/eslint-plugin": + '@typescript-eslint/eslint-plugin': specifier: ^8.26.1 version: 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/parser": + '@typescript-eslint/parser': specifier: ^8.26.1 version: 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@vitejs/plugin-react": + '@vitejs/plugin-react': specifier: ^4.6.0 version: 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) concurrently: @@ -206,76 +210,121 @@ importers: packages/db: dependencies: - "@electric-sql/d2mini": + '@electric-sql/d2mini': specifier: ^0.1.6 version: 0.1.6 - "@standard-schema/spec": + '@standard-schema/spec': specifier: ^1.0.0 version: 1.0.0 typescript: - specifier: ">=4.7" + specifier: '>=4.7' version: 5.8.3 devDependencies: - "@vitest/coverage-istanbul": + '@vitest/coverage-istanbul': specifier: ^3.0.9 version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) packages/db-collections: dependencies: - "@standard-schema/spec": + '@standard-schema/spec': specifier: ^1.0.0 version: 1.0.0 - "@tanstack/db": + '@tanstack/db': specifier: workspace:* version: link:../db - "@tanstack/query-core": + '@tanstack/query-core': specifier: ^5.75.7 version: 5.81.5 - "@tanstack/store": + '@tanstack/store': specifier: ^0.7.0 version: 0.7.2 debug: specifier: ^4.4.1 version: 4.4.1 typescript: - specifier: ">=4.7" + specifier: '>=4.7' version: 5.8.3 devDependencies: - "@electric-sql/client": + '@electric-sql/client': specifier: 1.0.0 version: 1.0.0 - "@types/debug": + '@types/debug': specifier: ^4.1.12 version: 4.1.12 - "@vitest/coverage-istanbul": + '@vitest/coverage-istanbul': specifier: ^3.0.9 version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + packages/db-devtools: + devDependencies: + '@kobalte/core': + specifier: ^0.13.4 + version: 0.13.10(solid-js@1.9.7) + '@solid-primitives/keyed': + specifier: ^1.2.2 + version: 1.5.2(solid-js@1.9.7) + '@solid-primitives/resize-observer': + specifier: ^2.0.26 + version: 2.1.3(solid-js@1.9.7) + '@solid-primitives/storage': + specifier: ^1.3.11 + version: 1.3.11(solid-js@1.9.7) + '@tanstack/match-sorter-utils': + specifier: ^8.19.4 + version: 8.19.4 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + goober: + specifier: ^2.1.16 + version: 2.1.16(csstype@3.1.3) + npm-run-all2: + specifier: ^5.0.0 + version: 5.0.2 + solid-js: + specifier: ^1.9.5 + version: 1.9.7 + solid-transition-group: + specifier: ^0.2.3 + version: 0.2.3(solid-js@1.9.7) + superjson: + specifier: ^2.2.1 + version: 2.2.2 + tsup-preset-solid: + specifier: ^2.2.0 + version: 2.2.0(esbuild@0.25.6)(solid-js@1.9.7)(tsup@8.5.0(@microsoft/api-extractor@7.52.8(@types/node@24.0.11))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)) + vite-plugin-dts: + specifier: ^4.5.4 + version: 4.5.4(@types/node@24.0.11)(rollup@4.44.2)(typescript@5.8.3)(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + vite-plugin-solid: + specifier: ^2.11.6 + version: 2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + packages/react-db: dependencies: - "@tanstack/db": + '@tanstack/db': specifier: workspace:* version: link:../db use-sync-external-store: specifier: ^1.2.0 version: 1.5.0(react@19.1.0) devDependencies: - "@electric-sql/client": + '@electric-sql/client': specifier: 1.0.0 version: 1.0.0 - "@testing-library/react": + '@testing-library/react': specifier: ^16.2.0 version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@types/react": + '@types/react': specifier: ^19.0.12 version: 19.1.8 - "@types/react-dom": + '@types/react-dom': specifier: ^19.0.3 version: 19.1.6(@types/react@19.1.8) - "@types/use-sync-external-store": + '@types/use-sync-external-store': specifier: ^0.0.6 version: 0.0.6 - "@vitest/coverage-istanbul": + '@vitest/coverage-istanbul': specifier: ^3.0.9 version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) react: @@ -285,3295 +334,2404 @@ importers: specifier: ^19.0.0 version: 19.1.0(react@19.1.0) + packages/react-db-devtools: + dependencies: + '@tanstack/db-devtools': + specifier: workspace:* + version: link:../db-devtools + devDependencies: + '@tanstack/react-db': + specifier: workspace:* + version: link:../react-db + '@testing-library/react': + specifier: ^16.1.0 + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@types/react': + specifier: ^19.0.1 + version: 19.1.8 + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.6.0(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + npm-run-all2: + specifier: ^5.0.0 + version: 5.0.2 + react: + specifier: ^19.0.0 + version: 19.1.0 + packages/vue-db: dependencies: - "@tanstack/db": + '@tanstack/db': specifier: workspace:* version: link:../db devDependencies: - "@electric-sql/client": + '@electric-sql/client': specifier: 1.0.0 version: 1.0.0 - "@vitejs/plugin-vue": + '@vitejs/plugin-vue': specifier: ^5.2.4 version: 5.2.4(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) - "@vitest/coverage-istanbul": + '@vitest/coverage-istanbul': specifier: ^3.0.9 version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) vue: specifier: ^3.5.13 version: 3.5.17(typescript@5.8.3) + packages/vue-db-devtools: + dependencies: + '@tanstack/db-devtools': + specifier: workspace:* + version: link:../db-devtools + '@tanstack/vue-db': + specifier: workspace:* + version: link:../vue-db + devDependencies: + '@types/node': + specifier: ^20.0.0 + version: 20.19.5 + tsup: + specifier: ^8.0.0 + version: 8.5.0(@microsoft/api-extractor@7.52.8(@types/node@20.19.5))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + typescript: + specifier: ^5.0.0 + version: 5.8.3 + vite: + specifier: ^5.0.0 + version: 5.4.19(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1) + vitest: + specifier: ^1.0.0 + version: 1.6.1(@types/node@20.19.5)(happy-dom@18.0.1)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1) + vue: + specifier: ^3.0.0 + version: 3.5.17(typescript@5.8.3) + packages: - "@adobe/css-tools@4.4.2": - resolution: - { - integrity: sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==, - } - - "@ampproject/remapping@2.3.0": - resolution: - { - integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, - } - engines: { node: ">=6.0.0" } - - "@asamuzakjp/css-color@2.8.3": - resolution: - { - integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==, - } - - "@babel/code-frame@7.26.2": - resolution: - { - integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/code-frame@7.27.1": - resolution: - { - integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==, - } - engines: { node: ">=6.9.0" } - - "@babel/compat-data@7.28.0": - resolution: - { - integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==, - } - engines: { node: ">=6.9.0" } - - "@babel/core@7.28.0": - resolution: - { - integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/generator@7.28.0": - resolution: - { - integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-annotate-as-pure@7.27.3": - resolution: - { - integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-compilation-targets@7.27.2": - resolution: - { - integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-create-class-features-plugin@7.27.1": - resolution: - { - integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==, - } - engines: { node: ">=6.9.0" } + + '@adobe/css-tools@4.4.2': + resolution: {integrity: sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@asamuzakjp/css-color@2.8.3': + resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-globals@7.28.0": - resolution: - { - integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-member-expression-to-functions@7.27.1": - resolution: - { - integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-imports@7.27.1": - resolution: - { - integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-transforms@7.27.3": - resolution: - { - integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.18.6': + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-optimise-call-expression@7.27.1": - resolution: - { - integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-plugin-utils@7.27.1": - resolution: - { - integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-replace-supers@7.27.1": - resolution: - { - integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-skip-transparent-expression-wrappers@7.27.1": - resolution: - { - integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-string-parser@7.25.9": - resolution: - { - integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-string-parser@7.27.1": - resolution: - { - integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-identifier@7.25.9": - resolution: - { - integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-identifier@7.27.1": - resolution: - { - integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-option@7.27.1": - resolution: - { - integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, - } - engines: { node: ">=6.9.0" } - - "@babel/helpers@7.27.6": - resolution: - { - integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==, - } - engines: { node: ">=6.9.0" } - - "@babel/parser@7.26.10": - resolution: - { - integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==, - } - engines: { node: ">=6.0.0" } + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.10': + resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} + engines: {node: '>=6.0.0'} hasBin: true - "@babel/parser@7.28.0": - resolution: - { - integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==, - } - engines: { node: ">=6.0.0" } + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} hasBin: true - "@babel/plugin-syntax-jsx@7.27.1": - resolution: - { - integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==, - } - engines: { node: ">=6.9.0" } + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-syntax-typescript@7.27.1": - resolution: - { - integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-modules-commonjs@7.27.1": - resolution: - { - integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-react-jsx-self@7.27.1": - resolution: - { - integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-react-jsx-source@7.27.1": - resolution: - { - integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-typescript@7.28.0": - resolution: - { - integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/preset-typescript@7.27.1": - resolution: - { - integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/runtime@7.26.10": - resolution: - { - integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==, - } - engines: { node: ">=6.9.0" } - - "@babel/runtime@7.27.6": - resolution: - { - integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==, - } - engines: { node: ">=6.9.0" } - - "@babel/template@7.27.2": - resolution: - { - integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==, - } - engines: { node: ">=6.9.0" } - - "@babel/traverse@7.28.0": - resolution: - { - integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.26.10": - resolution: - { - integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.28.0": - resolution: - { - integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==, - } - engines: { node: ">=6.9.0" } - - "@changesets/apply-release-plan@7.0.12": - resolution: - { - integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==, - } - - "@changesets/assemble-release-plan@6.0.9": - resolution: - { - integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==, - } - - "@changesets/changelog-git@0.2.1": - resolution: - { - integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==, - } - - "@changesets/cli@2.29.5": - resolution: - { - integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==, - } + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.26.10': + resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.10': + resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.0': + resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.0.12': + resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} + + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.29.5': + resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} hasBin: true - "@changesets/config@3.1.1": - resolution: - { - integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==, - } - - "@changesets/errors@0.2.0": - resolution: - { - integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==, - } - - "@changesets/get-dependents-graph@2.1.3": - resolution: - { - integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==, - } - - "@changesets/get-github-info@0.6.0": - resolution: - { - integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==, - } - - "@changesets/get-release-plan@4.0.13": - resolution: - { - integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==, - } - - "@changesets/get-version-range-type@0.4.0": - resolution: - { - integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==, - } - - "@changesets/git@3.0.4": - resolution: - { - integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==, - } - - "@changesets/logger@0.1.1": - resolution: - { - integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==, - } - - "@changesets/parse@0.4.1": - resolution: - { - integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==, - } - - "@changesets/pre@2.0.2": - resolution: - { - integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==, - } - - "@changesets/read@0.6.5": - resolution: - { - integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==, - } - - "@changesets/should-skip-package@0.1.2": - resolution: - { - integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==, - } - - "@changesets/types@4.1.0": - resolution: - { - integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==, - } - - "@changesets/types@6.1.0": - resolution: - { - integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==, - } - - "@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.6.0": - resolution: - { - integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==, - } - engines: { node: ">=0.1.90" } - - "@commitlint/parse@19.8.1": - resolution: - { - integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==, - } - engines: { node: ">=v18" } - - "@commitlint/types@19.8.1": - resolution: - { - integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==, - } - engines: { node: ">=v18" } - - "@csstools/color-helpers@5.0.1": - resolution: - { - integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==, - } - engines: { node: ">=18" } - - "@csstools/css-calc@2.1.1": - resolution: - { - integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==, - } - engines: { node: ">=18" } + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-github-info@0.6.0': + resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} + + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@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.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@commitlint/parse@19.8.1': + resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==} + engines: {node: '>=v18'} + + '@commitlint/types@19.8.1': + resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} + engines: {node: '>=v18'} + + '@corvu/utils@0.4.2': + resolution: {integrity: sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA==} peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.4 - "@csstools/css-tokenizer": ^3.0.3 - - "@csstools/css-color-parser@3.0.7": - resolution: - { - integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==, - } - engines: { node: ">=18" } + solid-js: ^1.8 + + '@csstools/color-helpers@5.0.1': + resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.1': + resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==} + engines: {node: '>=18'} peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.4 - "@csstools/css-tokenizer": ^3.0.3 - - "@csstools/css-parser-algorithms@3.0.4": - resolution: - { - integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==, - } - engines: { node: ">=18" } + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-color-parser@3.0.7': + resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==} + engines: {node: '>=18'} peerDependencies: - "@csstools/css-tokenizer": ^3.0.3 - - "@csstools/css-tokenizer@3.0.3": - resolution: - { - integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==, - } - engines: { node: ">=18" } - - "@dabh/diagnostics@2.0.3": - resolution: - { - integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==, - } - - "@dependents/detective-less@5.0.1": - resolution: - { - integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==, - } - engines: { node: ">=18" } - - "@drizzle-team/brocli@0.10.2": - resolution: - { - integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==, - } - - "@electric-sql/client@1.0.0": - resolution: - { - integrity: sha512-kGiVbBIlMqc/CeJpWZuLjxNkm0836NWxeMtIWH2w5IUK8pUL13hyxg3ZkR7+FlTGhpKuZRiCP5nPOH9D6wbhPw==, - } - - "@electric-sql/d2mini@0.1.6": - resolution: - { - integrity: sha512-FLzsK4kAtD3upU0MDj3JQx3jPwgFfwmPJ69kheMPeMexoPO8aTIr/nhWL7GSnCLFB+BDSPOFUeffDhSomLRNXA==, - } - - "@emnapi/core@1.4.4": - resolution: - { - integrity: sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==, - } - - "@emnapi/runtime@1.4.4": - resolution: - { - integrity: sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==, - } - - "@emnapi/wasi-threads@1.0.3": - resolution: - { - integrity: sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==, - } - - "@esbuild-kit/core-utils@3.3.2": - resolution: - { - integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==, - } - deprecated: "Merged into tsx: https://tsx.is" - - "@esbuild-kit/esm-loader@2.6.5": - resolution: - { - integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==, - } - deprecated: "Merged into tsx: https://tsx.is" - - "@esbuild/aix-ppc64@0.19.12": - resolution: - { - integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, - } - engines: { node: ">=12" } + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-parser-algorithms@3.0.4': + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-tokenizer@3.0.3': + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + engines: {node: '>=18'} + + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + + '@dependents/detective-less@5.0.1': + resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} + engines: {node: '>=18'} + + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + + '@electric-sql/client@1.0.0': + resolution: {integrity: sha512-kGiVbBIlMqc/CeJpWZuLjxNkm0836NWxeMtIWH2w5IUK8pUL13hyxg3ZkR7+FlTGhpKuZRiCP5nPOH9D6wbhPw==} + + '@electric-sql/d2mini@0.1.6': + resolution: {integrity: sha512-FLzsK4kAtD3upU0MDj3JQx3jPwgFfwmPJ69kheMPeMexoPO8aTIr/nhWL7GSnCLFB+BDSPOFUeffDhSomLRNXA==} + + '@emnapi/core@1.4.4': + resolution: {integrity: sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==} + + '@emnapi/runtime@1.4.4': + resolution: {integrity: sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==} + + '@emnapi/wasi-threads@1.0.3': + resolution: {integrity: sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} cpu: [ppc64] os: [aix] - "@esbuild/aix-ppc64@0.25.0": - resolution: - { - integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==, - } - engines: { node: ">=18" } + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} cpu: [ppc64] os: [aix] - "@esbuild/aix-ppc64@0.25.1": - resolution: - { - integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==, - } - engines: { node: ">=18" } + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - "@esbuild/aix-ppc64@0.25.5": - resolution: - { - integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==, - } - engines: { node: ">=18" } + '@esbuild/aix-ppc64@0.25.1': + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - "@esbuild/aix-ppc64@0.25.6": - resolution: - { - integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==, - } - engines: { node: ">=18" } + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - "@esbuild/android-arm64@0.18.20": - resolution: - { - integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==, - } - engines: { node: ">=12" } + '@esbuild/aix-ppc64@0.25.6': + resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} cpu: [arm64] os: [android] - "@esbuild/android-arm64@0.19.12": - resolution: - { - integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, - } - engines: { node: ">=12" } + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} cpu: [arm64] os: [android] - "@esbuild/android-arm64@0.25.0": - resolution: - { - integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==, - } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} cpu: [arm64] os: [android] - "@esbuild/android-arm64@0.25.1": - resolution: - { - integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==, - } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - "@esbuild/android-arm64@0.25.5": - resolution: - { - integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==, - } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.25.1': + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - "@esbuild/android-arm64@0.25.6": - resolution: - { - integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==, - } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - "@esbuild/android-arm@0.18.20": - resolution: - { - integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==, - } - engines: { node: ">=12" } + '@esbuild/android-arm64@0.25.6': + resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} cpu: [arm] os: [android] - "@esbuild/android-arm@0.19.12": - resolution: - { - integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, - } - engines: { node: ">=12" } + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} cpu: [arm] os: [android] - "@esbuild/android-arm@0.25.0": - resolution: - { - integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==, - } - engines: { node: ">=18" } + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} cpu: [arm] os: [android] - "@esbuild/android-arm@0.25.1": - resolution: - { - integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==, - } - engines: { node: ">=18" } + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + engines: {node: '>=18'} cpu: [arm] os: [android] - "@esbuild/android-arm@0.25.5": - resolution: - { - integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==, - } - engines: { node: ">=18" } + '@esbuild/android-arm@0.25.1': + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + engines: {node: '>=18'} cpu: [arm] os: [android] - "@esbuild/android-arm@0.25.6": - resolution: - { - integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==, - } - engines: { node: ">=18" } + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} cpu: [arm] os: [android] - "@esbuild/android-x64@0.18.20": - resolution: - { - integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==, - } - engines: { node: ">=12" } + '@esbuild/android-arm@0.25.6': + resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} cpu: [x64] os: [android] - "@esbuild/android-x64@0.19.12": - resolution: - { - integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, - } - engines: { node: ">=12" } + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} cpu: [x64] os: [android] - "@esbuild/android-x64@0.25.0": - resolution: - { - integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==, - } - engines: { node: ">=18" } + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/android-x64@0.25.1": - resolution: - { - integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==, - } - engines: { node: ">=18" } + '@esbuild/android-x64@0.25.1': + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/android-x64@0.25.5": - resolution: - { - integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==, - } - engines: { node: ">=18" } + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/android-x64@0.25.6": - resolution: - { - integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==, - } - engines: { node: ">=18" } + '@esbuild/android-x64@0.25.6': + resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/darwin-arm64@0.18.20": - resolution: - { - integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==, - } - engines: { node: ">=12" } + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-arm64@0.19.12": - resolution: - { - integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, - } - engines: { node: ">=12" } + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-arm64@0.25.0": - resolution: - { - integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==, - } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-arm64@0.25.1": - resolution: - { - integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==, - } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.25.1': + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-arm64@0.25.5": - resolution: - { - integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==, - } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-arm64@0.25.6": - resolution: - { - integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==, - } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.25.6': + resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-x64@0.18.20": - resolution: - { - integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==, - } - engines: { node: ">=12" } + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} cpu: [x64] os: [darwin] - "@esbuild/darwin-x64@0.19.12": - resolution: - { - integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, - } - engines: { node: ">=12" } + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} cpu: [x64] os: [darwin] - "@esbuild/darwin-x64@0.25.0": - resolution: - { - integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==, - } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/darwin-x64@0.25.1": - resolution: - { - integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==, - } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.25.1': + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/darwin-x64@0.25.5": - resolution: - { - integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==, - } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/darwin-x64@0.25.6": - resolution: - { - integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==, - } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.25.6': + resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/freebsd-arm64@0.18.20": - resolution: - { - integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==, - } - engines: { node: ">=12" } + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-arm64@0.19.12": - resolution: - { - integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, - } - engines: { node: ">=12" } + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-arm64@0.25.0": - resolution: - { - integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-arm64@0.25.1": - resolution: - { - integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-arm64@0.25.5": - resolution: - { - integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.25.1': + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-arm64@0.25.6": - resolution: - { - integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-x64@0.18.20": - resolution: - { - integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==, - } - engines: { node: ">=12" } + '@esbuild/freebsd-arm64@0.25.6': + resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} cpu: [x64] os: [freebsd] - "@esbuild/freebsd-x64@0.19.12": - resolution: - { - integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, - } - engines: { node: ">=12" } + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} cpu: [x64] os: [freebsd] - "@esbuild/freebsd-x64@0.25.0": - resolution: - { - integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} cpu: [x64] os: [freebsd] - "@esbuild/freebsd-x64@0.25.1": - resolution: - { - integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - "@esbuild/freebsd-x64@0.25.5": - resolution: - { - integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.25.1': + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - "@esbuild/freebsd-x64@0.25.6": - resolution: - { - integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - "@esbuild/linux-arm64@0.18.20": - resolution: - { - integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==, - } - engines: { node: ">=12" } + '@esbuild/freebsd-x64@0.25.6': + resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm64@0.19.12": - resolution: - { - integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, - } - engines: { node: ">=12" } + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm64@0.25.0": - resolution: - { - integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm64@0.25.1": - resolution: - { - integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.25.1': + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm64@0.25.5": - resolution: - { - integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm64@0.25.6": - resolution: - { - integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.25.6': + resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm@0.18.20": - resolution: - { - integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==, - } - engines: { node: ">=12" } + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} cpu: [arm] os: [linux] - "@esbuild/linux-arm@0.19.12": - resolution: - { - integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, - } - engines: { node: ">=12" } + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} cpu: [arm] os: [linux] - "@esbuild/linux-arm@0.25.0": - resolution: - { - integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} cpu: [arm] os: [linux] - "@esbuild/linux-arm@0.25.1": - resolution: - { - integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - "@esbuild/linux-arm@0.25.5": - resolution: - { - integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.25.1': + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - "@esbuild/linux-arm@0.25.6": - resolution: - { - integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - "@esbuild/linux-ia32@0.18.20": - resolution: - { - integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==, - } - engines: { node: ">=12" } + '@esbuild/linux-arm@0.25.6': + resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} cpu: [ia32] os: [linux] - "@esbuild/linux-ia32@0.19.12": - resolution: - { - integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, - } - engines: { node: ">=12" } + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} cpu: [ia32] os: [linux] - "@esbuild/linux-ia32@0.25.0": - resolution: - { - integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==, - } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-ia32@0.25.1": - resolution: - { - integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.25.1': + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-ia32@0.25.5": - resolution: - { - integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==, - } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-ia32@0.25.6": - resolution: - { - integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==, - } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.25.6': + resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-loong64@0.18.20": - resolution: - { - integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==, - } - engines: { node: ">=12" } + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} cpu: [loong64] os: [linux] - "@esbuild/linux-loong64@0.19.12": - resolution: - { - integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, - } - engines: { node: ">=12" } + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} cpu: [loong64] os: [linux] - "@esbuild/linux-loong64@0.25.0": - resolution: - { - integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==, - } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-loong64@0.25.1": - resolution: - { - integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==, - } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.25.1': + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-loong64@0.25.5": - resolution: - { - integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==, - } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-loong64@0.25.6": - resolution: - { - integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==, - } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.25.6': + resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-mips64el@0.18.20": - resolution: - { - integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==, - } - engines: { node: ">=12" } + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} cpu: [mips64el] os: [linux] - "@esbuild/linux-mips64el@0.19.12": - resolution: - { - integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, - } - engines: { node: ">=12" } + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} cpu: [mips64el] os: [linux] - "@esbuild/linux-mips64el@0.25.0": - resolution: - { - integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-mips64el@0.25.1": - resolution: - { - integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==, - } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.25.1': + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-mips64el@0.25.5": - resolution: - { - integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==, - } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-mips64el@0.25.6": - resolution: - { - integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==, - } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.25.6': + resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-ppc64@0.18.20": - resolution: - { - integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==, - } - engines: { node: ">=12" } + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} cpu: [ppc64] os: [linux] - "@esbuild/linux-ppc64@0.19.12": - resolution: - { - integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, - } - engines: { node: ">=12" } + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} cpu: [ppc64] os: [linux] - "@esbuild/linux-ppc64@0.25.0": - resolution: - { - integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==, - } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} cpu: [ppc64] os: [linux] - "@esbuild/linux-ppc64@0.25.1": - resolution: - { - integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==, - } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - "@esbuild/linux-ppc64@0.25.5": - resolution: - { - integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.25.1': + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - "@esbuild/linux-ppc64@0.25.6": - resolution: - { - integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==, - } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - "@esbuild/linux-riscv64@0.18.20": - resolution: - { - integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==, - } - engines: { node: ">=12" } + '@esbuild/linux-ppc64@0.25.6': + resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} cpu: [riscv64] os: [linux] - "@esbuild/linux-riscv64@0.19.12": - resolution: - { - integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, - } - engines: { node: ">=12" } + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} cpu: [riscv64] os: [linux] - "@esbuild/linux-riscv64@0.25.0": - resolution: - { - integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==, - } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} cpu: [riscv64] os: [linux] - "@esbuild/linux-riscv64@0.25.1": - resolution: - { - integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - "@esbuild/linux-riscv64@0.25.5": - resolution: - { - integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==, - } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.25.1': + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - "@esbuild/linux-riscv64@0.25.6": - resolution: - { - integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==, - } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - "@esbuild/linux-s390x@0.18.20": - resolution: - { - integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==, - } - engines: { node: ">=12" } + '@esbuild/linux-riscv64@0.25.6': + resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} cpu: [s390x] os: [linux] - "@esbuild/linux-s390x@0.19.12": - resolution: - { - integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, - } - engines: { node: ">=12" } + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} cpu: [s390x] os: [linux] - "@esbuild/linux-s390x@0.25.0": - resolution: - { - integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==, - } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-s390x@0.25.1": - resolution: - { - integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.25.1': + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-s390x@0.25.5": - resolution: - { - integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-s390x@0.25.6": - resolution: - { - integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==, - } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.25.6': + resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-x64@0.18.20": - resolution: - { - integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==, - } - engines: { node: ">=12" } + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} cpu: [x64] os: [linux] - "@esbuild/linux-x64@0.19.12": - resolution: - { - integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, - } - engines: { node: ">=12" } + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} cpu: [x64] os: [linux] - "@esbuild/linux-x64@0.25.0": - resolution: - { - integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} cpu: [x64] os: [linux] - "@esbuild/linux-x64@0.25.1": - resolution: - { - integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - "@esbuild/linux-x64@0.25.5": - resolution: - { - integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.25.1': + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - "@esbuild/linux-x64@0.25.6": - resolution: - { - integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - "@esbuild/netbsd-arm64@0.25.0": - resolution: - { - integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.25.6': + resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-arm64@0.25.1": - resolution: - { - integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-arm64@0.25.1': + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-arm64@0.25.5": - resolution: - { - integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-arm64@0.25.6": - resolution: - { - integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-arm64@0.25.6': + resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-x64@0.18.20": - resolution: - { - integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==, - } - engines: { node: ">=12" } + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} cpu: [x64] os: [netbsd] - "@esbuild/netbsd-x64@0.19.12": - resolution: - { - integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, - } - engines: { node: ">=12" } + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} cpu: [x64] os: [netbsd] - "@esbuild/netbsd-x64@0.25.0": - resolution: - { - integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/netbsd-x64@0.25.1": - resolution: - { - integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.25.1': + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/netbsd-x64@0.25.5": - resolution: - { - integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/netbsd-x64@0.25.6": - resolution: - { - integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.25.6': + resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/openbsd-arm64@0.25.0": - resolution: - { - integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-arm64@0.25.1": - resolution: - { - integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.25.1': + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-arm64@0.25.5": - resolution: - { - integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-arm64@0.25.6": - resolution: - { - integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.25.6': + resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-x64@0.18.20": - resolution: - { - integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==, - } - engines: { node: ">=12" } + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} cpu: [x64] os: [openbsd] - "@esbuild/openbsd-x64@0.19.12": - resolution: - { - integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, - } - engines: { node: ">=12" } + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} cpu: [x64] os: [openbsd] - "@esbuild/openbsd-x64@0.25.0": - resolution: - { - integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/openbsd-x64@0.25.1": - resolution: - { - integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.25.1': + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/openbsd-x64@0.25.5": - resolution: - { - integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/openbsd-x64@0.25.6": - resolution: - { - integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.25.6': + resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/openharmony-arm64@0.25.6": - resolution: - { - integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==, - } - engines: { node: ">=18" } + '@esbuild/openharmony-arm64@0.25.6': + resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - "@esbuild/sunos-x64@0.18.20": - resolution: - { - integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==, - } - engines: { node: ">=12" } + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} cpu: [x64] os: [sunos] - "@esbuild/sunos-x64@0.19.12": - resolution: - { - integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, - } - engines: { node: ">=12" } + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} cpu: [x64] os: [sunos] - "@esbuild/sunos-x64@0.25.0": - resolution: - { - integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==, - } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/sunos-x64@0.25.1": - resolution: - { - integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==, - } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.25.1': + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/sunos-x64@0.25.5": - resolution: - { - integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==, - } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/sunos-x64@0.25.6": - resolution: - { - integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==, - } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.25.6': + resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/win32-arm64@0.18.20": - resolution: - { - integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==, - } - engines: { node: ">=12" } + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} cpu: [arm64] os: [win32] - "@esbuild/win32-arm64@0.19.12": - resolution: - { - integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, - } - engines: { node: ">=12" } + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} cpu: [arm64] os: [win32] - "@esbuild/win32-arm64@0.25.0": - resolution: - { - integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==, - } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} cpu: [arm64] os: [win32] - "@esbuild/win32-arm64@0.25.1": - resolution: - { - integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - "@esbuild/win32-arm64@0.25.5": - resolution: - { - integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==, - } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.25.1': + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - "@esbuild/win32-arm64@0.25.6": - resolution: - { - integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==, - } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - "@esbuild/win32-ia32@0.18.20": - resolution: - { - integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==, - } - engines: { node: ">=12" } + '@esbuild/win32-arm64@0.25.6': + resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} cpu: [ia32] os: [win32] - "@esbuild/win32-ia32@0.19.12": - resolution: - { - integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, - } - engines: { node: ">=12" } + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} cpu: [ia32] os: [win32] - "@esbuild/win32-ia32@0.25.0": - resolution: - { - integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==, - } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} cpu: [ia32] os: [win32] - "@esbuild/win32-ia32@0.25.1": - resolution: - { - integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==, - } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - "@esbuild/win32-ia32@0.25.5": - resolution: - { - integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.25.1': + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - "@esbuild/win32-ia32@0.25.6": - resolution: - { - integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - "@esbuild/win32-x64@0.18.20": - resolution: - { - integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==, - } - engines: { node: ">=12" } + '@esbuild/win32-ia32@0.25.6': + resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} cpu: [x64] os: [win32] - "@esbuild/win32-x64@0.19.12": - resolution: - { - integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, - } - engines: { node: ">=12" } + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} cpu: [x64] os: [win32] - "@esbuild/win32-x64@0.25.0": - resolution: - { - integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@esbuild/win32-x64@0.25.1": - resolution: - { - integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==, - } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.25.1': + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@esbuild/win32-x64@0.25.5": - resolution: - { - integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==, - } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@esbuild/win32-x64@0.25.6": - resolution: - { - integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==, - } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.25.6': + resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@eslint-community/eslint-utils@4.5.1": - resolution: - { - integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + '@eslint-community/eslint-utils@4.5.1': + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - "@eslint-community/eslint-utils@4.7.0": - resolution: - { - integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - "@eslint-community/regexpp@4.12.1": - resolution: - { - integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - "@eslint/config-array@0.21.0": - resolution: - { - integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/config-helpers@0.3.0": - resolution: - { - integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/core@0.14.0": - resolution: - { - integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/core@0.15.1": - resolution: - { - integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/eslintrc@3.3.1": - resolution: - { - integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/js@9.30.1": - resolution: - { - integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/object-schema@2.1.6": - resolution: - { - integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@eslint/plugin-kit@0.3.3": - resolution: - { - integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@fastify/busboy@3.1.1": - resolution: - { - integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==, - } - - "@gerrit0/mini-shiki@1.27.2": - resolution: - { - integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==, - } - - "@humanfs/core@0.19.1": - resolution: - { - integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, - } - engines: { node: ">=18.18.0" } - - "@humanfs/node@0.16.6": - resolution: - { - integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==, - } - engines: { node: ">=18.18.0" } - - "@humanwhocodes/module-importer@1.0.1": - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - "@humanwhocodes/retry@0.3.1": - resolution: - { - integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==, - } - engines: { node: ">=18.18" } - - "@humanwhocodes/retry@0.4.2": - resolution: - { - integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==, - } - engines: { node: ">=18.18" } - - "@ioredis/commands@1.2.0": - resolution: - { - integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==, - } - - "@isaacs/balanced-match@4.0.1": - resolution: - { - integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==, - } - engines: { node: 20 || >=22 } - - "@isaacs/brace-expansion@5.0.0": - resolution: - { - integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==, - } - engines: { node: 20 || >=22 } - - "@isaacs/cliui@8.0.2": - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: ">=12" } - - "@isaacs/fs-minipass@4.0.1": - resolution: - { - integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==, - } - engines: { node: ">=18.0.0" } - - "@istanbuljs/schema@0.1.3": - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - } - engines: { node: ">=8" } - - "@jridgewell/gen-mapping@0.3.12": - resolution: - { - integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==, - } - - "@jridgewell/gen-mapping@0.3.8": - resolution: - { - integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/resolve-uri@3.1.2": - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/set-array@1.2.1": - resolution: - { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/source-map@0.3.10": - resolution: - { - integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==, - } - - "@jridgewell/sourcemap-codec@1.5.0": - resolution: - { - integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, - } - - "@jridgewell/sourcemap-codec@1.5.4": - resolution: - { - integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==, - } - - "@jridgewell/trace-mapping@0.3.25": - resolution: - { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, - } - - "@jridgewell/trace-mapping@0.3.29": - resolution: - { - integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==, - } - - "@kwsites/file-exists@1.1.1": - resolution: - { - integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==, - } - - "@kwsites/promise-deferred@1.1.1": - resolution: - { - integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==, - } - - "@manypkg/find-root@1.1.0": - resolution: - { - integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==, - } - - "@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" } + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.30.1': + resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.3': + resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@fastify/busboy@3.1.1': + resolution: {integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==} + + '@floating-ui/core@1.7.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} + + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@gerrit0/mini-shiki@1.27.2': + resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@internationalized/date@3.8.2': + resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} + + '@internationalized/number@3.6.3': + resolution: {integrity: sha512-p+Zh1sb6EfrfVaS86jlHGQ9HA66fJhV9x5LiE5vCbZtXEHAuhcmUZUdZ4WrFpUBfNalr2OkAJI5AcKEQF+Lebw==} + + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@kobalte/core@0.13.10': + resolution: {integrity: sha512-lzP64ThxZqZB6O6MnMq6w7DxK38o2ClbW3Ob6afUI6p86cUMz5Hb4rdysvYI6m1TKYlOAlFODKkoRznqybQohw==} + peerDependencies: + solid-js: ^1.8.15 + + '@kobalte/utils@0.9.1': + resolution: {integrity: sha512-eeU60A3kprIiBDAfv9gUJX1tXGLuZiKMajUfSQURAF2pk4ZoMYiqIzmrMBvzcxP39xnYttgTyQEVLwiTZnrV4w==} + peerDependencies: + solid-js: ^1.8.8 + + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@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==, - } - - "@microsoft/api-extractor-model@7.30.6": - resolution: - { - integrity: sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg==, - } - - "@microsoft/api-extractor@7.47.7": - resolution: - { - integrity: sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==, - } + '@microsoft/api-extractor-model@7.29.6': + resolution: {integrity: sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==} + + '@microsoft/api-extractor-model@7.30.6': + resolution: {integrity: sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg==} + + '@microsoft/api-extractor@7.47.7': + resolution: {integrity: sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==} hasBin: true - "@microsoft/api-extractor@7.52.8": - resolution: - { - integrity: sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg==, - } + '@microsoft/api-extractor@7.52.8': + resolution: {integrity: sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg==} hasBin: true - "@microsoft/tsdoc-config@0.17.1": - resolution: - { - integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==, - } - - "@microsoft/tsdoc@0.15.1": - resolution: - { - integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==, - } - - "@napi-rs/wasm-runtime@0.2.11": - resolution: - { - integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==, - } - - "@netlify/binary-info@1.0.0": - resolution: - { - integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==, - } - - "@netlify/blobs@9.1.2": - resolution: - { - integrity: sha512-7dMjExSH4zj4ShvLem49mE3mf0K171Tx2pV4WDWhJbRUWW3SJIR2qntz0LvUGS97N5HO1SmnzrgWUhEXCsApiw==, - } - engines: { node: ^14.16.0 || >=16.0.0 } - - "@netlify/dev-utils@2.2.0": - resolution: - { - integrity: sha512-5XUvZuffe3KetyhbWwd4n2ktd7wraocCYw10tlM+/u/95iAz29GjNiuNxbCD1T6Bn1MyGc4QLVNKOWhzJkVFAw==, - } - engines: { node: ^14.16.0 || >=16.0.0 } - - "@netlify/functions@3.1.10": - resolution: - { - integrity: sha512-sI93kcJ2cUoMgDRPnrEm0lZhuiDVDqM6ngS/UbHTApIH3+eg3yZM5p/0SDFQQq9Bad0/srFmgBmTdXushzY5kg==, - } - engines: { node: ">=14.0.0" } - - "@netlify/open-api@2.37.0": - resolution: - { - integrity: sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w==, - } - engines: { node: ">=14.8.0" } - - "@netlify/runtime-utils@1.3.1": - resolution: - { - integrity: sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg==, - } - engines: { node: ">=16.0.0" } - - "@netlify/serverless-functions-api@1.41.2": - resolution: - { - integrity: sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw==, - } - engines: { node: ">=18.0.0" } - - "@netlify/serverless-functions-api@2.1.3": - resolution: - { - integrity: sha512-bNlN/hpND8xFQzpjyKxm6vJayD+bPBlOvs4lWihE7WULrphuH1UuFsoVE5386bNNGH8Rs1IH01AFsl7ALQgOlQ==, - } - engines: { node: ">=18.0.0" } - - "@netlify/zip-it-and-ship-it@12.2.1": - resolution: - { - integrity: sha512-zAr+8Tg80y/sUbhdUkZsq4Uy1IMzkSB6H/sKRMrDQ2NJx4uPgf5X5jMdg9g2FljNcxzpfJwc1Gg4OXQrjD0Z4A==, - } - engines: { node: ">=18.14.0" } + '@microsoft/tsdoc-config@0.17.1': + resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + + '@netlify/binary-info@1.0.0': + resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} + + '@netlify/blobs@9.1.2': + resolution: {integrity: sha512-7dMjExSH4zj4ShvLem49mE3mf0K171Tx2pV4WDWhJbRUWW3SJIR2qntz0LvUGS97N5HO1SmnzrgWUhEXCsApiw==} + engines: {node: ^14.16.0 || >=16.0.0} + + '@netlify/dev-utils@2.2.0': + resolution: {integrity: sha512-5XUvZuffe3KetyhbWwd4n2ktd7wraocCYw10tlM+/u/95iAz29GjNiuNxbCD1T6Bn1MyGc4QLVNKOWhzJkVFAw==} + engines: {node: ^14.16.0 || >=16.0.0} + + '@netlify/functions@3.1.10': + resolution: {integrity: sha512-sI93kcJ2cUoMgDRPnrEm0lZhuiDVDqM6ngS/UbHTApIH3+eg3yZM5p/0SDFQQq9Bad0/srFmgBmTdXushzY5kg==} + engines: {node: '>=14.0.0'} + + '@netlify/open-api@2.37.0': + resolution: {integrity: sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w==} + engines: {node: '>=14.8.0'} + + '@netlify/runtime-utils@1.3.1': + resolution: {integrity: sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg==} + engines: {node: '>=16.0.0'} + + '@netlify/serverless-functions-api@1.41.2': + resolution: {integrity: sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw==} + engines: {node: '>=18.0.0'} + + '@netlify/serverless-functions-api@2.1.3': + resolution: {integrity: sha512-bNlN/hpND8xFQzpjyKxm6vJayD+bPBlOvs4lWihE7WULrphuH1UuFsoVE5386bNNGH8Rs1IH01AFsl7ALQgOlQ==} + engines: {node: '>=18.0.0'} + + '@netlify/zip-it-and-ship-it@12.2.1': + resolution: {integrity: sha512-zAr+8Tg80y/sUbhdUkZsq4Uy1IMzkSB6H/sKRMrDQ2NJx4uPgf5X5jMdg9g2FljNcxzpfJwc1Gg4OXQrjD0Z4A==} + engines: {node: '>=18.14.0'} hasBin: true - "@nodelib/fs.scandir@2.1.5": - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.stat@2.0.5": - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.walk@1.2.8": - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - - "@oozcitak/dom@1.15.10": - resolution: - { - integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==, - } - engines: { node: ">=8.0" } - - "@oozcitak/infra@1.0.8": - resolution: - { - integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==, - } - engines: { node: ">=6.0" } - - "@oozcitak/url@1.0.4": - resolution: - { - integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==, - } - engines: { node: ">=8.0" } - - "@oozcitak/util@8.3.8": - resolution: - { - integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==, - } - engines: { node: ">=8.0" } - - "@parcel/watcher-android-arm64@2.5.1": - resolution: - { - integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==, - } - engines: { node: ">= 10.0.0" } + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oozcitak/dom@1.15.10': + resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} + engines: {node: '>=8.0'} + + '@oozcitak/infra@1.0.8': + resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} + engines: {node: '>=6.0'} + + '@oozcitak/url@1.0.4': + resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} + engines: {node: '>=8.0'} + + '@oozcitak/util@8.3.8': + resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} + engines: {node: '>=8.0'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - "@parcel/watcher-darwin-arm64@2.5.1": - resolution: - { - integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - "@parcel/watcher-darwin-x64@2.5.1": - resolution: - { - integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - "@parcel/watcher-freebsd-x64@2.5.1": - resolution: - { - integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - "@parcel/watcher-linux-arm-glibc@2.5.1": - resolution: - { - integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - "@parcel/watcher-linux-arm-musl@2.5.1": - resolution: - { - integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - "@parcel/watcher-linux-arm64-glibc@2.5.1": - resolution: - { - integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - "@parcel/watcher-linux-arm64-musl@2.5.1": - resolution: - { - integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - "@parcel/watcher-linux-x64-glibc@2.5.1": - resolution: - { - integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - "@parcel/watcher-linux-x64-musl@2.5.1": - resolution: - { - integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - "@parcel/watcher-wasm@2.5.1": - resolution: - { - integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==, - } - engines: { node: ">= 10.0.0" } + '@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" } + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - "@parcel/watcher-win32-ia32@2.5.1": - resolution: - { - integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - "@parcel/watcher-win32-x64@2.5.1": - resolution: - { - integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==, - } - engines: { node: ">= 10.0.0" } + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - "@parcel/watcher@2.5.1": - resolution: - { - integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==, - } - engines: { node: ">= 10.0.0" } - - "@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" } - - "@pkgr/core@0.2.7": - resolution: - { - integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==, - } - 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==, - } - - "@publint/pack@0.1.2": - resolution: - { - integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==, - } - engines: { node: ">=18" } - - "@rolldown/pluginutils@1.0.0-beta.19": - resolution: - { - integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==, - } - - "@rollup/plugin-alias@5.1.1": - resolution: - { - integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==, - } - engines: { node: ">=14.0.0" } + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@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'} + + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + 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==} + + '@publint/pack@0.1.2': + resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} + engines: {node: '>=18'} + + '@rolldown/pluginutils@1.0.0-beta.19': + resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} + + '@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" } + '@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" } + '@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" } + '@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" } + '@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" } + '@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" } + '@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.2.0": - resolution: - { - integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==, - } - engines: { node: ">=14.0.0" } + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - "@rollup/rollup-android-arm-eabi@4.34.8": - resolution: - { - integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==, - } + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} cpu: [arm] os: [android] - "@rollup/rollup-android-arm-eabi@4.44.2": - resolution: - { - integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==, - } + '@rollup/rollup-android-arm-eabi@4.44.2': + resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==} cpu: [arm] os: [android] - "@rollup/rollup-android-arm64@4.34.8": - resolution: - { - integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==, - } + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} cpu: [arm64] os: [android] - "@rollup/rollup-android-arm64@4.44.2": - resolution: - { - integrity: sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==, - } + '@rollup/rollup-android-arm64@4.44.2': + resolution: {integrity: sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==} cpu: [arm64] os: [android] - "@rollup/rollup-darwin-arm64@4.34.8": - resolution: - { - integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==, - } + '@rollup/rollup-darwin-arm64@4.34.8': + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} cpu: [arm64] os: [darwin] - "@rollup/rollup-darwin-arm64@4.44.2": - resolution: - { - integrity: sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==, - } + '@rollup/rollup-darwin-arm64@4.44.2': + resolution: {integrity: sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==} cpu: [arm64] os: [darwin] - "@rollup/rollup-darwin-x64@4.34.8": - resolution: - { - integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==, - } + '@rollup/rollup-darwin-x64@4.34.8': + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} cpu: [x64] os: [darwin] - "@rollup/rollup-darwin-x64@4.44.2": - resolution: - { - integrity: sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==, - } + '@rollup/rollup-darwin-x64@4.44.2': + resolution: {integrity: sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==} cpu: [x64] os: [darwin] - "@rollup/rollup-freebsd-arm64@4.34.8": - resolution: - { - integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==, - } + '@rollup/rollup-freebsd-arm64@4.34.8': + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} cpu: [arm64] os: [freebsd] - "@rollup/rollup-freebsd-arm64@4.44.2": - resolution: - { - integrity: sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==, - } + '@rollup/rollup-freebsd-arm64@4.44.2': + resolution: {integrity: sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==} cpu: [arm64] os: [freebsd] - "@rollup/rollup-freebsd-x64@4.34.8": - resolution: - { - integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==, - } + '@rollup/rollup-freebsd-x64@4.34.8': + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} cpu: [x64] os: [freebsd] - "@rollup/rollup-freebsd-x64@4.44.2": - resolution: - { - integrity: sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==, - } + '@rollup/rollup-freebsd-x64@4.44.2': + resolution: {integrity: sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==} cpu: [x64] os: [freebsd] - "@rollup/rollup-linux-arm-gnueabihf@4.34.8": - resolution: - { - integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==, - } + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm-gnueabihf@4.44.2": - resolution: - { - integrity: sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==, - } + '@rollup/rollup-linux-arm-gnueabihf@4.44.2': + resolution: {integrity: sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm-musleabihf@4.34.8": - resolution: - { - integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==, - } + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm-musleabihf@4.44.2": - resolution: - { - integrity: sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==, - } + '@rollup/rollup-linux-arm-musleabihf@4.44.2': + resolution: {integrity: sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm64-gnu@4.34.8": - resolution: - { - integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==, - } + '@rollup/rollup-linux-arm64-gnu@4.34.8': + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-arm64-gnu@4.44.2": - resolution: - { - integrity: sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==, - } + '@rollup/rollup-linux-arm64-gnu@4.44.2': + resolution: {integrity: sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-arm64-musl@4.34.8": - resolution: - { - integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==, - } + '@rollup/rollup-linux-arm64-musl@4.34.8': + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-arm64-musl@4.44.2": - resolution: - { - integrity: sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==, - } + '@rollup/rollup-linux-arm64-musl@4.44.2': + resolution: {integrity: sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-loongarch64-gnu@4.34.8": - resolution: - { - integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==, - } + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} cpu: [loong64] os: [linux] - "@rollup/rollup-linux-loongarch64-gnu@4.44.2": - resolution: - { - integrity: sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==, - } + '@rollup/rollup-linux-loongarch64-gnu@4.44.2': + resolution: {integrity: sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==} cpu: [loong64] os: [linux] - "@rollup/rollup-linux-powerpc64le-gnu@4.34.8": - resolution: - { - integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==, - } + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} cpu: [ppc64] os: [linux] - "@rollup/rollup-linux-powerpc64le-gnu@4.44.2": - resolution: - { - integrity: sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==, - } + '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': + resolution: {integrity: sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==} cpu: [ppc64] os: [linux] - "@rollup/rollup-linux-riscv64-gnu@4.34.8": - resolution: - { - integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==, - } + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-riscv64-gnu@4.44.2": - resolution: - { - integrity: sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==, - } + '@rollup/rollup-linux-riscv64-gnu@4.44.2': + resolution: {integrity: sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-riscv64-musl@4.44.2": - resolution: - { - integrity: sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==, - } + '@rollup/rollup-linux-riscv64-musl@4.44.2': + resolution: {integrity: sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-s390x-gnu@4.34.8": - resolution: - { - integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==, - } + '@rollup/rollup-linux-s390x-gnu@4.34.8': + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} cpu: [s390x] os: [linux] - "@rollup/rollup-linux-s390x-gnu@4.44.2": - resolution: - { - integrity: sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==, - } + '@rollup/rollup-linux-s390x-gnu@4.44.2': + resolution: {integrity: sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==} cpu: [s390x] os: [linux] - "@rollup/rollup-linux-x64-gnu@4.34.8": - resolution: - { - integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==, - } + '@rollup/rollup-linux-x64-gnu@4.34.8': + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} cpu: [x64] os: [linux] - "@rollup/rollup-linux-x64-gnu@4.44.2": - resolution: - { - integrity: sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==, - } + '@rollup/rollup-linux-x64-gnu@4.44.2': + resolution: {integrity: sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==} cpu: [x64] os: [linux] - "@rollup/rollup-linux-x64-musl@4.34.8": - resolution: - { - integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==, - } + '@rollup/rollup-linux-x64-musl@4.34.8': + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} cpu: [x64] os: [linux] - "@rollup/rollup-linux-x64-musl@4.44.2": - resolution: - { - integrity: sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==, - } + '@rollup/rollup-linux-x64-musl@4.44.2': + resolution: {integrity: sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==} cpu: [x64] os: [linux] - "@rollup/rollup-win32-arm64-msvc@4.34.8": - resolution: - { - integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==, - } + '@rollup/rollup-win32-arm64-msvc@4.34.8': + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} cpu: [arm64] os: [win32] - "@rollup/rollup-win32-arm64-msvc@4.44.2": - resolution: - { - integrity: sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==, - } + '@rollup/rollup-win32-arm64-msvc@4.44.2': + resolution: {integrity: sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==} cpu: [arm64] os: [win32] - "@rollup/rollup-win32-ia32-msvc@4.34.8": - resolution: - { - integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==, - } + '@rollup/rollup-win32-ia32-msvc@4.34.8': + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} cpu: [ia32] os: [win32] - "@rollup/rollup-win32-ia32-msvc@4.44.2": - resolution: - { - integrity: sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==, - } + '@rollup/rollup-win32-ia32-msvc@4.44.2': + resolution: {integrity: sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==} cpu: [ia32] os: [win32] - "@rollup/rollup-win32-x64-msvc@4.34.8": - resolution: - { - integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==, - } + '@rollup/rollup-win32-x64-msvc@4.34.8': + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} cpu: [x64] os: [win32] - "@rollup/rollup-win32-x64-msvc@4.44.2": - resolution: - { - integrity: sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==, - } + '@rollup/rollup-win32-x64-msvc@4.44.2': + resolution: {integrity: sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==} cpu: [x64] os: [win32] - "@rushstack/node-core-library@5.13.1": - resolution: - { - integrity: sha512-5yXhzPFGEkVc9Fu92wsNJ9jlvdwz4RNb2bMso+/+TH0nMm1jDDDsOIf4l8GAkPxGuwPw5DH24RliWVfSPhlW/Q==, - } + '@rushstack/node-core-library@5.13.1': + resolution: {integrity: sha512-5yXhzPFGEkVc9Fu92wsNJ9jlvdwz4RNb2bMso+/+TH0nMm1jDDDsOIf4l8GAkPxGuwPw5DH24RliWVfSPhlW/Q==} peerDependencies: - "@types/node": "*" + '@types/node': '*' peerDependenciesMeta: - "@types/node": + '@types/node': optional: true - "@rushstack/node-core-library@5.7.0": - resolution: - { - integrity: sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==, - } + '@rushstack/node-core-library@5.7.0': + resolution: {integrity: sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==} peerDependencies: - "@types/node": "*" + '@types/node': '*' peerDependenciesMeta: - "@types/node": + '@types/node': optional: true - "@rushstack/rig-package@0.5.3": - resolution: - { - integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==, - } - - "@rushstack/terminal@0.14.0": - resolution: - { - integrity: sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==, - } + '@rushstack/rig-package@0.5.3': + resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + + '@rushstack/terminal@0.14.0': + resolution: {integrity: sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==} peerDependencies: - "@types/node": "*" + '@types/node': '*' peerDependenciesMeta: - "@types/node": + '@types/node': optional: true - "@rushstack/terminal@0.15.3": - resolution: - { - integrity: sha512-DGJ0B2Vm69468kZCJkPj3AH5nN+nR9SPmC0rFHtzsS4lBQ7/dgOwtwVxYP7W9JPDMuRBkJ4KHmWKr036eJsj9g==, - } + '@rushstack/terminal@0.15.3': + resolution: {integrity: sha512-DGJ0B2Vm69468kZCJkPj3AH5nN+nR9SPmC0rFHtzsS4lBQ7/dgOwtwVxYP7W9JPDMuRBkJ4KHmWKr036eJsj9g==} peerDependencies: - "@types/node": "*" + '@types/node': '*' peerDependenciesMeta: - "@types/node": + '@types/node': optional: true - "@rushstack/ts-command-line@4.22.6": - resolution: - { - integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==, - } - - "@rushstack/ts-command-line@5.0.1": - resolution: - { - integrity: sha512-bsbUucn41UXrQK7wgM8CNM/jagBytEyJqXw/umtI8d68vFm1Jwxh1OtLrlW7uGZgjCWiiPH6ooUNa1aVsuVr3Q==, - } - - "@shikijs/engine-oniguruma@1.29.2": - resolution: - { - integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==, - } - - "@shikijs/types@1.29.2": - resolution: - { - integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==, - } - - "@shikijs/vscode-textmate@10.0.2": - resolution: - { - integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==, - } - - "@sindresorhus/is@7.0.2": - resolution: - { - integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==, - } - engines: { node: ">=18" } - - "@sindresorhus/merge-streams@2.3.0": - resolution: - { - integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==, - } - engines: { node: ">=18" } - - "@speed-highlight/core@1.2.7": - resolution: - { - integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==, - } - - "@standard-schema/spec@1.0.0": - resolution: - { - integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==, - } - - "@stylistic/eslint-plugin-js@4.4.1": - resolution: - { - integrity: sha512-eLisyHvx7Sel8vcFZOEwDEBGmYsYM1SqDn81BWgmbqEXfXRf8oe6Rwp+ryM/8odNjlxtaaxp0Ihmt86CnLAxKg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@rushstack/ts-command-line@4.22.6': + resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} + + '@rushstack/ts-command-line@5.0.1': + resolution: {integrity: sha512-bsbUucn41UXrQK7wgM8CNM/jagBytEyJqXw/umtI8d68vFm1Jwxh1OtLrlW7uGZgjCWiiPH6ooUNa1aVsuVr3Q==} + + '@shikijs/engine-oniguruma@1.29.2': + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + + '@shikijs/types@1.29.2': + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/is@7.0.2': + resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@solid-primitives/event-listener@2.4.3': + resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/keyed@1.5.2': + resolution: {integrity: sha512-BgoEdqPw48URnI+L5sZIHdF4ua4Las1eWEBBPaoSFs42kkhnHue+rwCBPL2Z9ebOyQ75sUhUfOETdJfmv0D6Kg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/map@0.4.13': + resolution: {integrity: sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/media@2.3.3': + resolution: {integrity: sha512-hQ4hLOGvfbugQi5Eu1BFWAIJGIAzztq9x0h02xgBGl2l0Jaa3h7tg6bz5tV1NSuNYVGio4rPoa7zVQQLkkx9dA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/props@3.2.2': + resolution: {integrity: sha512-lZOTwFJajBrshSyg14nBMEP0h8MXzPowGO0s3OeiR3z6nXHTfj0FhzDtJMv+VYoRJKQHG2QRnJTgCzK6erARAw==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/refs@1.1.2': + resolution: {integrity: sha512-K7tf2thy7L+YJjdqXspXOg5xvNEOH8tgEWsp0+1mQk3obHBRD6hEjYZk7p7FlJphSZImS35je3UfmWuD7MhDfg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/resize-observer@2.1.3': + resolution: {integrity: sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/rootless@1.5.2': + resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/static-store@0.1.2': + resolution: {integrity: sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/storage@1.3.11': + resolution: {integrity: sha512-PpQWR3TaTxHIJFbI9ZssYTM4Aa67g1vJIgps4TPhcXzHqqomrPAIveFC2FG7SDQoi9YQia8FVBjigELziJpfIg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/transition-group@1.1.2': + resolution: {integrity: sha512-gnHS0OmcdjeoHN9n7Khu8KNrOlRc8a2weETDt2YT6o1zeW/XtUC6Db3Q9pkMU/9cCKdEmN4b0a/41MKAHRhzWA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/trigger@1.2.2': + resolution: {integrity: sha512-IWoptVc0SWYgmpBPpCMehS5b07+tpFcvw15tOQ3QbXedSYn6KP8zCjPkHNzMxcOvOicTneleeZDP7lqmz+PQ6g==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/utils@6.3.2': + resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@speed-highlight/core@1.2.7': + resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@stylistic/eslint-plugin-js@4.4.1': + resolution: {integrity: sha512-eLisyHvx7Sel8vcFZOEwDEBGmYsYM1SqDn81BWgmbqEXfXRf8oe6Rwp+ryM/8odNjlxtaaxp0Ihmt86CnLAxKg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ">=9.0.0" - - "@stylistic/eslint-plugin@4.4.1": - resolution: - { - integrity: sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + eslint: '>=9.0.0' + + '@stylistic/eslint-plugin@4.4.1': + resolution: {integrity: sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ">=9.0.0" - - "@svitejs/changesets-changelog-github-compact@1.2.0": - resolution: - { - integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==, - } - engines: { node: ^14.13.1 || ^16.0.0 || >=18 } - - "@tailwindcss/node@4.1.11": - resolution: - { - integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==, - } - - "@tailwindcss/oxide-android-arm64@4.1.11": - resolution: - { - integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==, - } - engines: { node: ">= 10" } + eslint: '>=9.0.0' + + '@svitejs/changesets-changelog-github-compact@1.2.0': + resolution: {integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==} + engines: {node: ^14.13.1 || ^16.0.0 || >=18} + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tailwindcss/node@4.1.11': + resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + + '@tailwindcss/oxide-android-arm64@4.1.11': + resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + engines: {node: '>= 10'} cpu: [arm64] os: [android] - "@tailwindcss/oxide-darwin-arm64@4.1.11": - resolution: - { - integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-darwin-arm64@4.1.11': + resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - "@tailwindcss/oxide-darwin-x64@4.1.11": - resolution: - { - integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-darwin-x64@4.1.11': + resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] - "@tailwindcss/oxide-freebsd-x64@4.1.11": - resolution: - { - integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-freebsd-x64@4.1.11': + resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11": - resolution: - { - integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + engines: {node: '>= 10'} cpu: [arm] os: [linux] - "@tailwindcss/oxide-linux-arm64-gnu@4.1.11": - resolution: - { - integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] - "@tailwindcss/oxide-linux-arm64-musl@4.1.11": - resolution: - { - integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] - "@tailwindcss/oxide-linux-x64-gnu@4.1.11": - resolution: - { - integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] - "@tailwindcss/oxide-linux-x64-musl@4.1.11": - resolution: - { - integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] - "@tailwindcss/oxide-wasm32-wasi@4.1.11": - resolution: - { - integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==, - } - engines: { node: ">=14.0.0" } + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} + engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: - - "@napi-rs/wasm-runtime" - - "@emnapi/core" - - "@emnapi/runtime" - - "@tybys/wasm-util" - - "@emnapi/wasi-threads" + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' - tslib - "@tailwindcss/oxide-win32-arm64-msvc@4.1.11": - resolution: - { - integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] - "@tailwindcss/oxide-win32-x64-msvc@4.1.11": - resolution: - { - integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==, - } - engines: { node: ">= 10" } + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] - "@tailwindcss/oxide@4.1.11": - resolution: - { - integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==, - } - engines: { node: ">= 10" } - - "@tailwindcss/vite@4.1.11": - resolution: - { - integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==, - } + '@tailwindcss/oxide@4.1.11': + resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.11': + resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 - "@tanstack/config@0.17.1": - resolution: - { - integrity: sha512-kUqfsU5qO/kiptgkjumdKuu/W4i1iYKPW6pUujEH1I+rzZLGIqD6noq9LDVZRh78ArAiZj+VYrdC5jbrtmsI8A==, - } - engines: { node: ">=18" } - - "@tanstack/directive-functions-plugin@1.124.1": - resolution: - { - integrity: sha512-eZdsPCZz+7VIKiXAF5dNdLJBerAo4t79w/OQTWaKuqPLX1E9GQOKHsmTZChWeQbxPx+y+cOV3/0U/yKxtHsm0Q==, - } - engines: { node: ">=12" } + '@tanstack/config@0.17.1': + resolution: {integrity: sha512-kUqfsU5qO/kiptgkjumdKuu/W4i1iYKPW6pUujEH1I+rzZLGIqD6noq9LDVZRh78ArAiZj+VYrdC5jbrtmsI8A==} + engines: {node: '>=18'} + + '@tanstack/db@0.0.20': + resolution: {integrity: sha512-bh/VggsuV/N5LmNgQiTFuVOATs+c1DRC3D36vRPNWw79V3O4HHptod8hKQdgEQtAbgjXvXrIFJOnlOpc5VOiEQ==} + peerDependencies: + typescript: '>=4.7' + + '@tanstack/directive-functions-plugin@1.124.1': + resolution: {integrity: sha512-eZdsPCZz+7VIKiXAF5dNdLJBerAo4t79w/OQTWaKuqPLX1E9GQOKHsmTZChWeQbxPx+y+cOV3/0U/yKxtHsm0Q==} + engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0' + + '@tanstack/eslint-config@0.1.0': + resolution: {integrity: sha512-/lVsQmmezpqqbCFtaxGNkoSnQ/+H0PAHyHF37PGQ6ZBrF8RXktgazMdsD5SCaNT9oEnGCl274GCZ9sY80b50Sg==} + engines: {node: '>=18'} + + '@tanstack/history@1.121.34': + resolution: {integrity: sha512-YL8dGi5ZU+xvtav2boRlw4zrRghkY6hvdcmHhA0RGSJ/CBgzv+cbADW9eYJLx74XMZvIQ1pp6VMbrpXnnM5gHA==} + engines: {node: '>=12'} + + '@tanstack/match-sorter-utils@8.19.4': + resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} + engines: {node: '>=12'} + + '@tanstack/publish-config@0.1.0': + resolution: {integrity: sha512-nI4F7/SpT6BMoigq1VmrrNe3A6Hsua9XcZNql+qzK2zJUOcKBRqMvC22n3eKcjsbZuWIFvkIC0ThsuBVYCKXfA==} + engines: {node: '>=18'} + + '@tanstack/query-core@5.81.5': + resolution: {integrity: sha512-ZJOgCy/z2qpZXWaj/oxvodDx07XcQa9BF92c0oINjHkoqUPsmm3uG08HpTaviviZ/N9eP1f9CM7mKSEkIo7O1Q==} + + '@tanstack/react-db@0.0.20': + resolution: {integrity: sha512-+odiHmk+09vhVKweeHUedy5jQcMZH97Bn0dN+TncoE9zq107blayF7Pbi4GPW2S30J8EZa+zP+o5aqbo5WtHeA==} peerDependencies: - vite: ">=6.0.0" - - "@tanstack/eslint-config@0.1.0": - resolution: - { - integrity: sha512-/lVsQmmezpqqbCFtaxGNkoSnQ/+H0PAHyHF37PGQ6ZBrF8RXktgazMdsD5SCaNT9oEnGCl274GCZ9sY80b50Sg==, - } - engines: { node: ">=18" } - - "@tanstack/history@1.121.34": - resolution: - { - integrity: sha512-YL8dGi5ZU+xvtav2boRlw4zrRghkY6hvdcmHhA0RGSJ/CBgzv+cbADW9eYJLx74XMZvIQ1pp6VMbrpXnnM5gHA==, - } - engines: { node: ">=12" } - - "@tanstack/publish-config@0.1.0": - resolution: - { - integrity: sha512-nI4F7/SpT6BMoigq1VmrrNe3A6Hsua9XcZNql+qzK2zJUOcKBRqMvC22n3eKcjsbZuWIFvkIC0ThsuBVYCKXfA==, - } - engines: { node: ">=18" } - - "@tanstack/query-core@5.81.5": - resolution: - { - integrity: sha512-ZJOgCy/z2qpZXWaj/oxvodDx07XcQa9BF92c0oINjHkoqUPsmm3uG08HpTaviviZ/N9eP1f9CM7mKSEkIo7O1Q==, - } - - "@tanstack/react-router@1.125.6": - resolution: - { - integrity: sha512-znyUGTq+WRhXwToNTYiluUBLjMdQVxz+ZQ9Ep2PBuS9O+3Qm3kaM7n64hA84ISoCtLqMwTo7Ofw0W4WeLdjpYg==, - } - engines: { node: ">=12" } + react: '>=16.8.0' + + '@tanstack/react-router@1.125.6': + resolution: {integrity: sha512-znyUGTq+WRhXwToNTYiluUBLjMdQVxz+ZQ9Ep2PBuS9O+3Qm3kaM7n64hA84ISoCtLqMwTo7Ofw0W4WeLdjpYg==} + engines: {node: '>=12'} peerDependencies: - react: ">=18.0.0 || >=19.0.0" - react-dom: ">=18.0.0 || >=19.0.0" - - "@tanstack/react-start-client@1.125.6": - resolution: - { - integrity: sha512-s7irNfPDVRlqumA5cHGAsfipyJicUpNIZ8veoKIl8WPYiWCIolbXWzSBXix96KxvFr20lJXgxRWRlWAe9GbOGA==, - } - engines: { node: ">=12" } + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-client@1.125.6': + resolution: {integrity: sha512-s7irNfPDVRlqumA5cHGAsfipyJicUpNIZ8veoKIl8WPYiWCIolbXWzSBXix96KxvFr20lJXgxRWRlWAe9GbOGA==} + engines: {node: '>=12'} peerDependencies: - react: ">=18.0.0 || >=19.0.0" - react-dom: ">=18.0.0 || >=19.0.0" - - "@tanstack/react-start-plugin@1.126.1": - resolution: - { - integrity: sha512-VXRbcNnpuTaLHpBcXQtBOWkk1tlSQM0iXwVI7xTPFr2U7/Iwj/Q7O+PiI/eH60XwGojJnGjelpEAde9KnJtP8w==, - } - engines: { node: ">=12" } + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-plugin@1.126.1': + resolution: {integrity: sha512-VXRbcNnpuTaLHpBcXQtBOWkk1tlSQM0iXwVI7xTPFr2U7/Iwj/Q7O+PiI/eH60XwGojJnGjelpEAde9KnJtP8w==} + engines: {node: '>=12'} peerDependencies: - "@vitejs/plugin-react": ">=4.3.4" - vite: ">=6.0.0" - - "@tanstack/react-start-server@1.126.1": - resolution: - { - integrity: sha512-AdX85pxM+3qgItLNWVpdkLeBuaHE1QQNQNMhm/BzB0fhyyqQXpuAkgUWhxsppU29E+uBQCx+UtramMnNFI7yCQ==, - } - engines: { node: ">=12" } + '@vitejs/plugin-react': '>=4.3.4' + vite: '>=6.0.0' + + '@tanstack/react-start-server@1.126.1': + resolution: {integrity: sha512-AdX85pxM+3qgItLNWVpdkLeBuaHE1QQNQNMhm/BzB0fhyyqQXpuAkgUWhxsppU29E+uBQCx+UtramMnNFI7yCQ==} + engines: {node: '>=12'} peerDependencies: - react: ">=18.0.0 || >=19.0.0" - react-dom: ">=18.0.0 || >=19.0.0" - - "@tanstack/react-start@1.126.1": - resolution: - { - integrity: sha512-l1rUzvj0a/LmEAfnJTRxIf2gj21XkM2TgCwbC49WvqInXA0J6rvulfuqPsBTPSPedXS6bI0fWdQiistR5LN1/g==, - } - engines: { node: ">=12" } + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start@1.126.1': + resolution: {integrity: sha512-l1rUzvj0a/LmEAfnJTRxIf2gj21XkM2TgCwbC49WvqInXA0J6rvulfuqPsBTPSPedXS6bI0fWdQiistR5LN1/g==} + 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-store@0.7.3": - resolution: - { - integrity: sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==, - } + '@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-store@0.7.3': + resolution: {integrity: sha512-3Dnqtbw9P2P0gw8uUM8WP2fFfg8XMDSZCTsywRPZe/XqqYW8PGkXKZTvP0AHkE4mpqP9Y43GpOg9vwO44azu6Q==} 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.125.4": - resolution: - { - integrity: sha512-tdgGI0Kwt3Lgs9ceLbG32NPh4I2H1T9t2TKjcS+I78sifm5rjTWV8lfqVRNrvMPk5ek60vXPOL2AHAUg6ohwsA==, - } - engines: { node: ">=12" } - - "@tanstack/router-generator@1.125.4": - resolution: - { - integrity: sha512-jF71znMvpZxmkQF0MxfjKKyvXtft9NWRCVcLhb+6d/8nrVGNiEw+dsXn/CLpeRQLk7Mg/fsp/WipBql1dd3Qaw==, - } - engines: { node: ">=12" } - - "@tanstack/router-plugin@1.125.6": - resolution: - { - integrity: sha512-SWfp++tkjb0grVqa/Xdvi9QAs93e9/fZMBZ6q0fvvQruMyciCmjWyE/qV3tS/Qh0WZdzIRP6yl8Gha2Lin4q1w==, - } - engines: { node: ">=12" } + '@tanstack/router-core@1.125.4': + resolution: {integrity: sha512-tdgGI0Kwt3Lgs9ceLbG32NPh4I2H1T9t2TKjcS+I78sifm5rjTWV8lfqVRNrvMPk5ek60vXPOL2AHAUg6ohwsA==} + engines: {node: '>=12'} + + '@tanstack/router-generator@1.125.4': + resolution: {integrity: sha512-jF71znMvpZxmkQF0MxfjKKyvXtft9NWRCVcLhb+6d/8nrVGNiEw+dsXn/CLpeRQLk7Mg/fsp/WipBql1dd3Qaw==} + engines: {node: '>=12'} + + '@tanstack/router-plugin@1.125.6': + resolution: {integrity: sha512-SWfp++tkjb0grVqa/Xdvi9QAs93e9/fZMBZ6q0fvvQruMyciCmjWyE/qV3tS/Qh0WZdzIRP6yl8Gha2Lin4q1w==} + engines: {node: '>=12'} peerDependencies: - "@rsbuild/core": ">=1.0.2" - "@tanstack/react-router": ^1.125.6 - vite: ">=5.0.0 || >=6.0.0" + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.125.6 + vite: '>=5.0.0 || >=6.0.0' vite-plugin-solid: ^2.11.2 - webpack: ">=5.92.0" + webpack: '>=5.92.0' peerDependenciesMeta: - "@rsbuild/core": + '@rsbuild/core': optional: true - "@tanstack/react-router": + '@tanstack/react-router': optional: true vite: optional: true @@ -3582,664 +2740,391 @@ packages: webpack: optional: true - "@tanstack/router-utils@1.121.21": - resolution: - { - integrity: sha512-u7ubq1xPBtNiU7Fm+EOWlVWdgFLzuKOa1thhqdscVn8R4dNMUd1VoOjZ6AKmLw201VaUhFtlX+u0pjzI6szX7A==, - } - engines: { node: ">=12" } - - "@tanstack/server-functions-plugin@1.124.1": - resolution: - { - integrity: sha512-9GIu+PXu5itj+Q74FJQpd4WV3FikzkAAxvBl9hrnmiEwz+AGDZL0GOiGy++MdupHJXuHXXss9mHqKtNmw9wMdw==, - } - engines: { node: ">=12" } - - "@tanstack/start-client-core@1.125.4": - resolution: - { - integrity: sha512-rijB1mZf3TazmYinSZBYclUolc/h4W1t/20uOFsjZli/Si8QUaoBdsKHFnZj8c/73H8Yxdzi4ZkLrD2rAesZhg==, - } - engines: { node: ">=12" } - - "@tanstack/start-plugin-core@1.126.1": - resolution: - { - integrity: sha512-EuV10r6r+H6Y91U/YIgsgRyuzLlhnLMg8qFab+iq8w+DFW1rfs9eIqOcv2KGzwIDb5Wmkw3t7c2PJ5kT52J2gQ==, - } - engines: { node: ">=12" } + '@tanstack/router-utils@1.121.21': + resolution: {integrity: sha512-u7ubq1xPBtNiU7Fm+EOWlVWdgFLzuKOa1thhqdscVn8R4dNMUd1VoOjZ6AKmLw201VaUhFtlX+u0pjzI6szX7A==} + engines: {node: '>=12'} + + '@tanstack/server-functions-plugin@1.124.1': + resolution: {integrity: sha512-9GIu+PXu5itj+Q74FJQpd4WV3FikzkAAxvBl9hrnmiEwz+AGDZL0GOiGy++MdupHJXuHXXss9mHqKtNmw9wMdw==} + engines: {node: '>=12'} + + '@tanstack/start-client-core@1.125.4': + resolution: {integrity: sha512-rijB1mZf3TazmYinSZBYclUolc/h4W1t/20uOFsjZli/Si8QUaoBdsKHFnZj8c/73H8Yxdzi4ZkLrD2rAesZhg==} + engines: {node: '>=12'} + + '@tanstack/start-plugin-core@1.126.1': + resolution: {integrity: sha512-EuV10r6r+H6Y91U/YIgsgRyuzLlhnLMg8qFab+iq8w+DFW1rfs9eIqOcv2KGzwIDb5Wmkw3t7c2PJ5kT52J2gQ==} + engines: {node: '>=12'} peerDependencies: - vite: ">=6.0.0" - - "@tanstack/start-server-core@1.126.1": - resolution: - { - integrity: sha512-dmVWtC1OcuLwiJM6fyk61e4TlTKCeVAoKV5Xg/FeVbD+rbAHF7AOsCln/rT3NgT0vUhO7Nxmlr2zjz1j0jV9Hg==, - } - engines: { node: ">=12" } - - "@tanstack/start-server-functions-client@1.125.4": - resolution: - { - integrity: sha512-/Hk6u19YQBbLbzKVZNlUOsPk+Ub84je4EK3ennLppuuNa7aPRvJXyRPn6kCLQXfLE/TZudirK0ze2HwHeuNgbQ==, - } - engines: { node: ">=12" } - - "@tanstack/start-server-functions-fetcher@1.125.4": - resolution: - { - integrity: sha512-vPWSbHlpCsg7g63gvKyiLWW3t4CW9apmNfPFIUKAPK+f+ZIP7PIefG60sFYRmS8jWvZvC1mSz66vkStvfUEfkQ==, - } - engines: { node: ">=12" } - - "@tanstack/start-server-functions-server@1.124.1": - resolution: - { - integrity: sha512-59NJqtdXm2c+JmwDqm3ZuvgcN1KT2LlvApelydj9y201lj76XjcEH4RqbJKm5G7C/wc98QPhghFHY8cwHJUCTg==, - } - engines: { node: ">=12" } - - "@tanstack/store@0.7.2": - resolution: - { - integrity: sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==, - } - - "@tanstack/typedoc-config@0.1.0": - resolution: - { - integrity: sha512-WaeDXvt9Dyds53SCOCZKGmwHdS6LGwNH7LyDeTtsmPW7zn7ApOaNyAPWlqjkEHGVd0ykvR+XA8CI8RPfLGGxmw==, - } - engines: { node: ">=18" } - - "@tanstack/virtual-file-routes@1.121.21": - resolution: - { - integrity: sha512-3nuYsTyaq6ZN7jRZ9z6Gj3GXZqBOqOT0yzd/WZ33ZFfv4yVNIvsa5Lw+M1j3sgyEAxKMqGu/FaNi7FCjr3yOdw==, - } - engines: { node: ">=12" } - - "@tanstack/vite-config@0.1.0": - resolution: - { - integrity: sha512-G6l2Q4hp/Yj43UyE9APz+Fj5sdC15G2UD2xXOSdQCZ6/4gjYd2c040TLk7ObGhypbeWBYvy93Gg18nS41F6eqg==, - } - engines: { node: ">=18" } - - "@testing-library/dom@10.4.0": - resolution: - { - integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==, - } - engines: { node: ">=18" } - - "@testing-library/jest-dom@6.6.3": - resolution: - { - integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==, - } - engines: { node: ">=14", npm: ">=6", yarn: ">=1" } - - "@testing-library/react@16.3.0": - resolution: - { - integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==, - } - engines: { node: ">=18" } + vite: '>=6.0.0' + + '@tanstack/start-server-core@1.126.1': + resolution: {integrity: sha512-dmVWtC1OcuLwiJM6fyk61e4TlTKCeVAoKV5Xg/FeVbD+rbAHF7AOsCln/rT3NgT0vUhO7Nxmlr2zjz1j0jV9Hg==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-client@1.125.4': + resolution: {integrity: sha512-/Hk6u19YQBbLbzKVZNlUOsPk+Ub84je4EK3ennLppuuNa7aPRvJXyRPn6kCLQXfLE/TZudirK0ze2HwHeuNgbQ==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-fetcher@1.125.4': + resolution: {integrity: sha512-vPWSbHlpCsg7g63gvKyiLWW3t4CW9apmNfPFIUKAPK+f+ZIP7PIefG60sFYRmS8jWvZvC1mSz66vkStvfUEfkQ==} + engines: {node: '>=12'} + + '@tanstack/start-server-functions-server@1.124.1': + resolution: {integrity: sha512-59NJqtdXm2c+JmwDqm3ZuvgcN1KT2LlvApelydj9y201lj76XjcEH4RqbJKm5G7C/wc98QPhghFHY8cwHJUCTg==} + engines: {node: '>=12'} + + '@tanstack/store@0.7.2': + resolution: {integrity: sha512-RP80Z30BYiPX2Pyo0Nyw4s1SJFH2jyM6f9i3HfX4pA+gm5jsnYryscdq2aIQLnL4TaGuQMO+zXmN9nh1Qck+Pg==} + + '@tanstack/typedoc-config@0.1.0': + resolution: {integrity: sha512-WaeDXvt9Dyds53SCOCZKGmwHdS6LGwNH7LyDeTtsmPW7zn7ApOaNyAPWlqjkEHGVd0ykvR+XA8CI8RPfLGGxmw==} + engines: {node: '>=18'} + + '@tanstack/virtual-file-routes@1.121.21': + resolution: {integrity: sha512-3nuYsTyaq6ZN7jRZ9z6Gj3GXZqBOqOT0yzd/WZ33ZFfv4yVNIvsa5Lw+M1j3sgyEAxKMqGu/FaNi7FCjr3yOdw==} + engines: {node: '>=12'} + + '@tanstack/vite-config@0.1.0': + resolution: {integrity: sha512-G6l2Q4hp/Yj43UyE9APz+Fj5sdC15G2UD2xXOSdQCZ6/4gjYd2c040TLk7ObGhypbeWBYvy93Gg18nS41F6eqg==} + engines: {node: '>=18'} + + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.6.3': + resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/react@16.3.0': + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} + engines: {node: '>=18'} peerDependencies: - "@testing-library/dom": ^10.0.0 - "@types/react": ^18.0.0 || ^19.0.0 - "@types/react-dom": ^18.0.0 || ^19.0.0 + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: - "@types/react": + '@types/react': optional: true - "@types/react-dom": + '@types/react-dom': optional: true - "@tybys/wasm-util@0.9.0": - resolution: - { - integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==, - } - - "@types/argparse@1.0.38": - resolution: - { - integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==, - } - - "@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==, - } - - "@types/babel__generator@7.27.0": - resolution: - { - integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==, - } - - "@types/babel__template@7.4.4": - resolution: - { - integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, - } - - "@types/babel__traverse@7.20.7": - resolution: - { - integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==, - } - - "@types/body-parser@1.19.5": - resolution: - { - integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, - } - - "@types/chai@5.2.2": - resolution: - { - integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==, - } - - "@types/connect@3.4.38": - resolution: - { - integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, - } - - "@types/conventional-commits-parser@5.0.1": - resolution: - { - integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==, - } - - "@types/cors@2.8.19": - resolution: - { - integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==, - } - - "@types/debug@4.1.12": - resolution: - { - integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, - } - - "@types/deep-eql@4.0.2": - resolution: - { - integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, - } - - "@types/estree@1.0.6": - resolution: - { - integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, - } - - "@types/estree@1.0.8": - resolution: - { - integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, - } - - "@types/express-serve-static-core@4.19.6": - resolution: - { - integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==, - } - - "@types/express@4.17.23": - resolution: - { - integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==, - } - - "@types/hast@3.0.4": - resolution: - { - integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, - } - - "@types/http-errors@2.0.4": - resolution: - { - integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, - } - - "@types/json-schema@7.0.15": - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } - - "@types/mime@1.3.5": - resolution: - { - integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, - } - - "@types/ms@2.1.0": - resolution: - { - integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, - } - - "@types/node@12.20.55": - resolution: - { - integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, - } - - "@types/node@20.19.5": - resolution: - { - integrity: sha512-M4CtoNkoQrYOD7O80KM7DjGdzwMvoXZ12SGUbxc0X1AK6gfBKjkJswW/B4MyTPMIuU0sodukEgj8CzIJKEAQXQ==, - } - - "@types/node@22.16.1": - resolution: - { - integrity: sha512-oaNE4MzsA6uO7HcsjUvqzz19lYIRsV6I1Dc6iOvgwYYDiOeF7/9b2E/PE0UW2ccwpgWPVUedjltYXQXVKFd4EA==, - } - - "@types/node@24.0.11": - resolution: - { - integrity: sha512-CJV8eqrYnwQJGMrvcRhQmZfpyniDavB+7nAZYJc6w99hFYJyFN3INV1/2W3QfQrqM36WTLrijJ1fxxvGBmCSxA==, - } - - "@types/normalize-package-data@2.4.4": - resolution: - { - integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, - } - - "@types/pg@8.15.4": - resolution: - { - integrity: sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==, - } - - "@types/qs@6.14.0": - resolution: - { - integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==, - } - - "@types/range-parser@1.2.7": - resolution: - { - integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, - } - - "@types/react-dom@19.1.6": - resolution: - { - integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==, - } + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@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==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/conventional-commits-parser@5.0.1': + resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express@4.17.23': + resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@20.19.5': + resolution: {integrity: sha512-M4CtoNkoQrYOD7O80KM7DjGdzwMvoXZ12SGUbxc0X1AK6gfBKjkJswW/B4MyTPMIuU0sodukEgj8CzIJKEAQXQ==} + + '@types/node@22.16.1': + resolution: {integrity: sha512-oaNE4MzsA6uO7HcsjUvqzz19lYIRsV6I1Dc6iOvgwYYDiOeF7/9b2E/PE0UW2ccwpgWPVUedjltYXQXVKFd4EA==} + + '@types/node@24.0.11': + resolution: {integrity: sha512-CJV8eqrYnwQJGMrvcRhQmZfpyniDavB+7nAZYJc6w99hFYJyFN3INV1/2W3QfQrqM36WTLrijJ1fxxvGBmCSxA==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/pg@8.15.4': + resolution: {integrity: sha512-I6UNVBAoYbvuWkkU3oosC8yxqH21f4/Jc4DK71JLG3dT2mdlGe1z+ep/LQGXaKaOgcvUrsQoPRqfgtMcvZiJhg==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@19.1.6': + resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} peerDependencies: - "@types/react": ^19.0.0 - - "@types/react@19.1.8": - resolution: - { - integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==, - } - - "@types/resolve@1.20.2": - resolution: - { - integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==, - } - - "@types/send@0.17.5": - resolution: - { - integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==, - } - - "@types/serve-static@1.15.7": - resolution: - { - integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==, - } - - "@types/triple-beam@1.3.5": - resolution: - { - integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==, - } - - "@types/unist@3.0.3": - resolution: - { - integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, - } - - "@types/use-sync-external-store@0.0.6": - resolution: - { - integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==, - } - - "@types/whatwg-mimetype@3.0.2": - resolution: - { - integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==, - } - - "@types/yauzl@2.10.3": - resolution: - { - integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==, - } - - "@typescript-eslint/eslint-plugin@8.36.0": - resolution: - { - integrity: sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@types/react': ^19.0.0 + + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@8.36.0': + resolution: {integrity: sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - "@typescript-eslint/parser": ^8.36.0 + '@typescript-eslint/parser': ^8.36.0 eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - - "@typescript-eslint/parser@8.36.0": - resolution: - { - integrity: sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.36.0': + resolution: {integrity: sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - - "@typescript-eslint/project-service@8.36.0": - resolution: - { - integrity: sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/project-service@8.36.0': + resolution: {integrity: sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ">=4.8.4 <5.9.0" - - "@typescript-eslint/scope-manager@8.36.0": - resolution: - { - integrity: sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@typescript-eslint/tsconfig-utils@8.36.0": - resolution: - { - integrity: sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.36.0': + resolution: {integrity: sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.36.0': + resolution: {integrity: sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ">=4.8.4 <5.9.0" - - "@typescript-eslint/type-utils@8.36.0": - resolution: - { - integrity: sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.36.0': + resolution: {integrity: sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - - "@typescript-eslint/types@8.36.0": - resolution: - { - integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@typescript-eslint/typescript-estree@8.36.0": - resolution: - { - integrity: sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.36.0': + resolution: {integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.36.0': + resolution: {integrity: sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ">=4.8.4 <5.9.0" - - "@typescript-eslint/utils@8.36.0": - resolution: - { - integrity: sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.36.0': + resolution: {integrity: sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - - "@typescript-eslint/visitor-keys@8.36.0": - resolution: - { - integrity: sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - "@unrs/resolver-binding-android-arm-eabi@1.11.0": - resolution: - { - integrity: sha512-LRw5BW29sYj9NsQC6QoqeLVQhEa+BwVINYyMlcve+6stwdBsSt5UB7zw4UZB4+4PNqIVilHoMaPWCb/KhABHQw==, - } + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.36.0': + resolution: {integrity: sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@unrs/resolver-binding-android-arm-eabi@1.11.0': + resolution: {integrity: sha512-LRw5BW29sYj9NsQC6QoqeLVQhEa+BwVINYyMlcve+6stwdBsSt5UB7zw4UZB4+4PNqIVilHoMaPWCb/KhABHQw==} cpu: [arm] os: [android] - "@unrs/resolver-binding-android-arm64@1.11.0": - resolution: - { - integrity: sha512-zYX8D2zcWCAHqghA8tPjbp7LwjVXbIZP++mpU/Mrf5jUVlk3BWIxkeB8yYzZi5GpFSlqMcRZQxQqbMI0c2lASQ==, - } + '@unrs/resolver-binding-android-arm64@1.11.0': + resolution: {integrity: sha512-zYX8D2zcWCAHqghA8tPjbp7LwjVXbIZP++mpU/Mrf5jUVlk3BWIxkeB8yYzZi5GpFSlqMcRZQxQqbMI0c2lASQ==} cpu: [arm64] os: [android] - "@unrs/resolver-binding-darwin-arm64@1.11.0": - resolution: - { - integrity: sha512-YsYOT049hevAY/lTYD77GhRs885EXPeAfExG5KenqMJ417nYLS2N/kpRpYbABhFZBVQn+2uRPasTe4ypmYoo3w==, - } + '@unrs/resolver-binding-darwin-arm64@1.11.0': + resolution: {integrity: sha512-YsYOT049hevAY/lTYD77GhRs885EXPeAfExG5KenqMJ417nYLS2N/kpRpYbABhFZBVQn+2uRPasTe4ypmYoo3w==} cpu: [arm64] os: [darwin] - "@unrs/resolver-binding-darwin-x64@1.11.0": - resolution: - { - integrity: sha512-PSjvk3OZf1aZImdGY5xj9ClFG3bC4gnSSYWrt+id0UAv+GwwVldhpMFjAga8SpMo2T1GjV9UKwM+QCsQCQmtdA==, - } + '@unrs/resolver-binding-darwin-x64@1.11.0': + resolution: {integrity: sha512-PSjvk3OZf1aZImdGY5xj9ClFG3bC4gnSSYWrt+id0UAv+GwwVldhpMFjAga8SpMo2T1GjV9UKwM+QCsQCQmtdA==} cpu: [x64] os: [darwin] - "@unrs/resolver-binding-freebsd-x64@1.11.0": - resolution: - { - integrity: sha512-KC/iFaEN/wsTVYnHClyHh5RSYA9PpuGfqkFua45r4sweXpC0KHZ+BYY7ikfcGPt5w1lMpR1gneFzuqWLQxsRKg==, - } + '@unrs/resolver-binding-freebsd-x64@1.11.0': + resolution: {integrity: sha512-KC/iFaEN/wsTVYnHClyHh5RSYA9PpuGfqkFua45r4sweXpC0KHZ+BYY7ikfcGPt5w1lMpR1gneFzuqWLQxsRKg==} cpu: [x64] os: [freebsd] - "@unrs/resolver-binding-linux-arm-gnueabihf@1.11.0": - resolution: - { - integrity: sha512-CDh/0v8uot43cB4yKtDL9CVY8pbPnMV0dHyQCE4lFz6PW/+9tS0i9eqP5a91PAqEBVMqH1ycu+k8rP6wQU846w==, - } + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.0': + resolution: {integrity: sha512-CDh/0v8uot43cB4yKtDL9CVY8pbPnMV0dHyQCE4lFz6PW/+9tS0i9eqP5a91PAqEBVMqH1ycu+k8rP6wQU846w==} cpu: [arm] os: [linux] - "@unrs/resolver-binding-linux-arm-musleabihf@1.11.0": - resolution: - { - integrity: sha512-+TE7epATDSnvwr3L/hNHX3wQ8KQYB+jSDTdywycg3qDqvavRP8/HX9qdq/rMcnaRDn4EOtallb3vL/5wCWGCkw==, - } + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.0': + resolution: {integrity: sha512-+TE7epATDSnvwr3L/hNHX3wQ8KQYB+jSDTdywycg3qDqvavRP8/HX9qdq/rMcnaRDn4EOtallb3vL/5wCWGCkw==} cpu: [arm] os: [linux] - "@unrs/resolver-binding-linux-arm64-gnu@1.11.0": - resolution: - { - integrity: sha512-VBAYGg3VahofpQ+L4k/ZO8TSICIbUKKTaMYOWHWfuYBFqPbSkArZZLezw3xd27fQkxX4BaLGb/RKnW0dH9Y/UA==, - } + '@unrs/resolver-binding-linux-arm64-gnu@1.11.0': + resolution: {integrity: sha512-VBAYGg3VahofpQ+L4k/ZO8TSICIbUKKTaMYOWHWfuYBFqPbSkArZZLezw3xd27fQkxX4BaLGb/RKnW0dH9Y/UA==} cpu: [arm64] os: [linux] - "@unrs/resolver-binding-linux-arm64-musl@1.11.0": - resolution: - { - integrity: sha512-9IgGFUUb02J1hqdRAHXpZHIeUHRrbnGo6vrRbz0fREH7g+rzQy53/IBSyadZ/LG5iqMxukriNPu4hEMUn+uWEg==, - } + '@unrs/resolver-binding-linux-arm64-musl@1.11.0': + resolution: {integrity: sha512-9IgGFUUb02J1hqdRAHXpZHIeUHRrbnGo6vrRbz0fREH7g+rzQy53/IBSyadZ/LG5iqMxukriNPu4hEMUn+uWEg==} cpu: [arm64] os: [linux] - "@unrs/resolver-binding-linux-ppc64-gnu@1.11.0": - resolution: - { - integrity: sha512-LR4iQ/LPjMfivpL2bQ9kmm3UnTas3U+umcCnq/CV7HAkukVdHxrDD1wwx74MIWbbgzQTLPYY7Ur2MnnvkYJCBQ==, - } + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.0': + resolution: {integrity: sha512-LR4iQ/LPjMfivpL2bQ9kmm3UnTas3U+umcCnq/CV7HAkukVdHxrDD1wwx74MIWbbgzQTLPYY7Ur2MnnvkYJCBQ==} cpu: [ppc64] os: [linux] - "@unrs/resolver-binding-linux-riscv64-gnu@1.11.0": - resolution: - { - integrity: sha512-HCupFQwMrRhrOg7YHrobbB5ADg0Q8RNiuefqMHVsdhEy9lLyXm/CxsCXeLJdrg27NAPsCaMDtdlm8Z2X8x91Tg==, - } + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.0': + resolution: {integrity: sha512-HCupFQwMrRhrOg7YHrobbB5ADg0Q8RNiuefqMHVsdhEy9lLyXm/CxsCXeLJdrg27NAPsCaMDtdlm8Z2X8x91Tg==} cpu: [riscv64] os: [linux] - "@unrs/resolver-binding-linux-riscv64-musl@1.11.0": - resolution: - { - integrity: sha512-Ckxy76A5xgjWa4FNrzcKul5qFMWgP5JSQ5YKd0XakmWOddPLSkQT+uAvUpQNnFGNbgKzv90DyQlxPDYPQ4nd6A==, - } + '@unrs/resolver-binding-linux-riscv64-musl@1.11.0': + resolution: {integrity: sha512-Ckxy76A5xgjWa4FNrzcKul5qFMWgP5JSQ5YKd0XakmWOddPLSkQT+uAvUpQNnFGNbgKzv90DyQlxPDYPQ4nd6A==} cpu: [riscv64] os: [linux] - "@unrs/resolver-binding-linux-s390x-gnu@1.11.0": - resolution: - { - integrity: sha512-HfO0PUCCRte2pMJmVyxPI+eqT7KuV3Fnvn2RPvMe5mOzb2BJKf4/Vth8sSt9cerQboMaTVpbxyYjjLBWIuI5BQ==, - } + '@unrs/resolver-binding-linux-s390x-gnu@1.11.0': + resolution: {integrity: sha512-HfO0PUCCRte2pMJmVyxPI+eqT7KuV3Fnvn2RPvMe5mOzb2BJKf4/Vth8sSt9cerQboMaTVpbxyYjjLBWIuI5BQ==} cpu: [s390x] os: [linux] - "@unrs/resolver-binding-linux-x64-gnu@1.11.0": - resolution: - { - integrity: sha512-9PZdjP7tLOEjpXHS6+B/RNqtfVUyDEmaViPOuSqcbomLdkJnalt5RKQ1tr2m16+qAufV0aDkfhXtoO7DQos/jg==, - } + '@unrs/resolver-binding-linux-x64-gnu@1.11.0': + resolution: {integrity: sha512-9PZdjP7tLOEjpXHS6+B/RNqtfVUyDEmaViPOuSqcbomLdkJnalt5RKQ1tr2m16+qAufV0aDkfhXtoO7DQos/jg==} cpu: [x64] os: [linux] - "@unrs/resolver-binding-linux-x64-musl@1.11.0": - resolution: - { - integrity: sha512-qkE99ieiSKMnFJY/EfyGKVtNra52/k+lVF/PbO4EL5nU6AdvG4XhtJ+WHojAJP7ID9BNIra/yd75EHndewNRfA==, - } + '@unrs/resolver-binding-linux-x64-musl@1.11.0': + resolution: {integrity: sha512-qkE99ieiSKMnFJY/EfyGKVtNra52/k+lVF/PbO4EL5nU6AdvG4XhtJ+WHojAJP7ID9BNIra/yd75EHndewNRfA==} cpu: [x64] os: [linux] - "@unrs/resolver-binding-wasm32-wasi@1.11.0": - resolution: - { - integrity: sha512-MjXek8UL9tIX34gymvQLecz2hMaQzOlaqYJJBomwm1gsvK2F7hF+YqJJ2tRyBDTv9EZJGMt4KlKkSD/gZWCOiw==, - } - engines: { node: ">=14.0.0" } + '@unrs/resolver-binding-wasm32-wasi@1.11.0': + resolution: {integrity: sha512-MjXek8UL9tIX34gymvQLecz2hMaQzOlaqYJJBomwm1gsvK2F7hF+YqJJ2tRyBDTv9EZJGMt4KlKkSD/gZWCOiw==} + engines: {node: '>=14.0.0'} cpu: [wasm32] - "@unrs/resolver-binding-win32-arm64-msvc@1.11.0": - resolution: - { - integrity: sha512-9LT6zIGO7CHybiQSh7DnQGwFMZvVr0kUjah6qQfkH2ghucxPV6e71sUXJdSM4Ba0MaGE6DC/NwWf7mJmc3DAng==, - } + '@unrs/resolver-binding-win32-arm64-msvc@1.11.0': + resolution: {integrity: sha512-9LT6zIGO7CHybiQSh7DnQGwFMZvVr0kUjah6qQfkH2ghucxPV6e71sUXJdSM4Ba0MaGE6DC/NwWf7mJmc3DAng==} cpu: [arm64] os: [win32] - "@unrs/resolver-binding-win32-ia32-msvc@1.11.0": - resolution: - { - integrity: sha512-HYchBYOZ7WN266VjoGm20xFv5EonG/ODURRgwl9EZT7Bq1nLEs6VKJddzfFdXEAho0wfFlt8L/xIiE29Pmy1RA==, - } + '@unrs/resolver-binding-win32-ia32-msvc@1.11.0': + resolution: {integrity: sha512-HYchBYOZ7WN266VjoGm20xFv5EonG/ODURRgwl9EZT7Bq1nLEs6VKJddzfFdXEAho0wfFlt8L/xIiE29Pmy1RA==} cpu: [ia32] os: [win32] - "@unrs/resolver-binding-win32-x64-msvc@1.11.0": - resolution: - { - integrity: sha512-+oLKLHw3I1UQo4MeHfoLYF+e6YBa8p5vYUw3Rgt7IDzCs+57vIZqQlIo62NDpYM0VG6BjWOwnzBczMvbtH8hag==, - } + '@unrs/resolver-binding-win32-x64-msvc@1.11.0': + resolution: {integrity: sha512-+oLKLHw3I1UQo4MeHfoLYF+e6YBa8p5vYUw3Rgt7IDzCs+57vIZqQlIo62NDpYM0VG6BjWOwnzBczMvbtH8hag==} cpu: [x64] os: [win32] - "@vercel/nft@0.29.4": - resolution: - { - integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==, - } - engines: { node: ">=18" } + '@vercel/nft@0.29.4': + resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} + engines: {node: '>=18'} hasBin: true - "@vitejs/plugin-react@4.6.0": - resolution: - { - integrity: sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + '@vitejs/plugin-react@4.6.0': + resolution: {integrity: sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 - "@vitejs/plugin-vue@5.2.4": - resolution: - { - integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==, - } - engines: { node: ^18.0.0 || >=20.0.0 } + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - "@vitest/coverage-istanbul@3.2.4": - resolution: - { - integrity: sha512-IDlpuFJiWU9rhcKLkpzj8mFu/lpe64gVgnV15ZOrYx1iFzxxrxCzbExiUEKtwwXRvEiEMUS6iZeYgnMxgbqbxQ==, - } + '@vitest/coverage-istanbul@3.2.4': + resolution: {integrity: sha512-IDlpuFJiWU9rhcKLkpzj8mFu/lpe64gVgnV15ZOrYx1iFzxxrxCzbExiUEKtwwXRvEiEMUS6iZeYgnMxgbqbxQ==} peerDependencies: vitest: 3.2.4 - "@vitest/expect@3.2.4": - resolution: - { - integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, - } - - "@vitest/mocker@3.2.4": - resolution: - { - integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==, - } + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 @@ -4249,226 +3134,151 @@ packages: vite: optional: true - "@vitest/pretty-format@3.2.4": - resolution: - { - integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, - } - - "@vitest/runner@3.2.4": - resolution: - { - integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==, - } - - "@vitest/snapshot@3.2.4": - resolution: - { - integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==, - } - - "@vitest/spy@3.2.4": - resolution: - { - integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, - } - - "@vitest/utils@3.2.4": - resolution: - { - integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, - } - - "@volar/language-core@2.4.17": - resolution: - { - integrity: sha512-chmRZMbKmcGpKMoO7Reb70uiLrzo0KWC2CkFttKUuKvrE+VYgi+fL9vWMJ07Fv5ulX0V1TAyyacN9q3nc5/ecA==, - } - - "@volar/source-map@2.4.17": - resolution: - { - integrity: sha512-QDybtQyO3Ms/NjFqNHTC5tbDN2oK5VH7ZaKrcubtfHBDj63n2pizHC3wlMQ+iT55kQXZUUAbmBX5L1C8CHFeBw==, - } - - "@volar/typescript@2.4.17": - resolution: - { - integrity: sha512-3paEFNh4P5DkgNUB2YkTRrfUekN4brAXxd3Ow1syMqdIPtCZHbUy4AW99S5RO/7mzyTWPMdDSo3mqTpB/LPObQ==, - } - - "@vue/compiler-core@3.5.17": - resolution: - { - integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==, - } - - "@vue/compiler-dom@3.5.17": - resolution: - { - integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==, - } - - "@vue/compiler-sfc@3.5.17": - resolution: - { - integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==, - } - - "@vue/compiler-ssr@3.5.17": - resolution: - { - integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==, - } - - "@vue/compiler-vue2@2.7.16": - resolution: - { - integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==, - } - - "@vue/language-core@2.1.6": - resolution: - { - integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==, - } + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + '@volar/language-core@2.4.17': + resolution: {integrity: sha512-chmRZMbKmcGpKMoO7Reb70uiLrzo0KWC2CkFttKUuKvrE+VYgi+fL9vWMJ07Fv5ulX0V1TAyyacN9q3nc5/ecA==} + + '@volar/source-map@2.4.17': + resolution: {integrity: sha512-QDybtQyO3Ms/NjFqNHTC5tbDN2oK5VH7ZaKrcubtfHBDj63n2pizHC3wlMQ+iT55kQXZUUAbmBX5L1C8CHFeBw==} + + '@volar/typescript@2.4.17': + resolution: {integrity: sha512-3paEFNh4P5DkgNUB2YkTRrfUekN4brAXxd3Ow1syMqdIPtCZHbUy4AW99S5RO/7mzyTWPMdDSo3mqTpB/LPObQ==} + + '@vue/compiler-core@3.5.17': + resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} + + '@vue/compiler-dom@3.5.17': + resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} + + '@vue/compiler-sfc@3.5.17': + resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} + + '@vue/compiler-ssr@3.5.17': + resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/language-core@2.1.6': + resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} peerDependencies: - typescript: "*" + typescript: '*' peerDependenciesMeta: typescript: optional: true - "@vue/reactivity@3.5.17": - resolution: - { - integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==, - } - - "@vue/runtime-core@3.5.17": - resolution: - { - integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==, - } - - "@vue/runtime-dom@3.5.17": - resolution: - { - integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==, - } - - "@vue/server-renderer@3.5.17": - resolution: - { - integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==, - } + '@vue/reactivity@3.5.17': + resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} + + '@vue/runtime-core@3.5.17': + resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} + + '@vue/runtime-dom@3.5.17': + resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} + + '@vue/server-renderer@3.5.17': + resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} peerDependencies: vue: 3.5.17 - "@vue/shared@3.5.17": - resolution: - { - integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==, - } - - "@whatwg-node/disposablestack@0.0.6": - resolution: - { - integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==, - } - engines: { node: ">=18.0.0" } - - "@whatwg-node/fetch@0.10.8": - resolution: - { - integrity: sha512-Rw9z3ctmeEj8QIB9MavkNJqekiu9usBCSMZa+uuAvM0lF3v70oQVCXNppMIqaV6OTZbdaHF1M2HLow58DEw+wg==, - } - engines: { node: ">=18.0.0" } - - "@whatwg-node/node-fetch@0.7.21": - resolution: - { - integrity: sha512-QC16IdsEyIW7kZd77aodrMO7zAoDyyqRCTLg+qG4wqtP4JV9AA+p7/lgqMdD29XyiYdVvIdFrfI9yh7B1QvRvw==, - } - engines: { node: ">=18.0.0" } - - "@whatwg-node/promise-helpers@1.3.2": - resolution: - { - integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==, - } - engines: { node: ">=16.0.0" } - - "@whatwg-node/server@0.9.71": - resolution: - { - integrity: sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g==, - } - engines: { node: ">=18.0.0" } + '@vue/shared@3.5.17': + resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + + '@whatwg-node/disposablestack@0.0.6': + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/fetch@0.10.8': + resolution: {integrity: sha512-Rw9z3ctmeEj8QIB9MavkNJqekiu9usBCSMZa+uuAvM0lF3v70oQVCXNppMIqaV6OTZbdaHF1M2HLow58DEw+wg==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.7.21': + resolution: {integrity: sha512-QC16IdsEyIW7kZd77aodrMO7zAoDyyqRCTLg+qG4wqtP4JV9AA+p7/lgqMdD29XyiYdVvIdFrfI9yh7B1QvRvw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/promise-helpers@1.3.2': + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + + '@whatwg-node/server@0.9.71': + resolution: {integrity: sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g==} + engines: {node: '>=18.0.0'} JSONStream@1.3.5: - resolution: - { - integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, - } + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true abbrev@3.0.1: - resolution: - { - integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==, - } - engines: { node: ^18.17.0 || >=20.5.0 } + 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" } + 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" } + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} acorn-import-attributes@1.9.5: - resolution: - { - integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==, - } + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: acorn: ^8 acorn-jsx@5.3.2: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + acorn@8.15.0: - resolution: - { - integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} hasBin: true agent-base@7.1.3: - resolution: - { - integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} ajv-draft-04@1.0.0: - resolution: - { - integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==, - } + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: ajv: ^8.5.0 peerDependenciesMeta: @@ -4476,10 +3286,7 @@ packages: optional: true ajv-formats@3.0.1: - resolution: - { - integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==, - } + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -4487,395 +3294,234 @@ packages: optional: true ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ajv@8.12.0: - resolution: - { - integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, - } + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} ajv@8.13.0: - resolution: - { - integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==, - } + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} ansi-colors@4.1.3: - resolution: - { - integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} ansi-escapes@7.0.0: - resolution: - { - integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} ansi-regex@6.1.0: - resolution: - { - integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} ansis@4.1.0: - resolution: - { - integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} any-promise@1.3.0: - resolution: - { - integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, - } + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} archiver-utils@5.0.2: - resolution: - { - integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} archiver@7.0.1: - resolution: - { - integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} aria-query@5.3.0: - resolution: - { - integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==, - } + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} aria-query@5.3.2: - resolution: - { - integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} array-buffer-byte-length@1.0.2: - resolution: - { - integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} array-flatten@1.1.1: - resolution: - { - integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, - } + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} array-ify@1.0.0: - resolution: - { - integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, - } + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} array-includes@3.1.8: - resolution: - { - integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} array.prototype.findlast@1.2.5: - resolution: - { - integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} array.prototype.flat@1.3.3: - resolution: - { - integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} array.prototype.flatmap@1.3.3: - resolution: - { - integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: - resolution: - { - integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} arraybuffer.prototype.slice@1.0.4: - resolution: - { - integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} assertion-error@2.0.1: - resolution: - { - integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} ast-module-types@6.0.1: - resolution: - { - integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} + engines: {node: '>=18'} ast-types@0.16.1: - resolution: - { - integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} async-function@1.0.0: - resolution: - { - integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} async-sema@3.1.1: - resolution: - { - integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==, - } + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} async@3.2.6: - resolution: - { - integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, - } + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} available-typed-arrays@1.0.7: - resolution: - { - integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} b4a@1.6.7: - resolution: - { - integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==, - } + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} babel-dead-code-elimination@1.0.10: - resolution: - { - integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==, - } + resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} + + babel-plugin-jsx-dom-expressions@0.39.8: + resolution: {integrity: sha512-/MVOIIjonylDXnrWmG23ZX82m9mtKATsVHB7zYlPfDR9Vdd/NBE48if+wv27bSkBtyO7EPMUlcUc4J63QwuACQ==} + peerDependencies: + '@babel/core': ^7.20.12 + + babel-preset-solid@1.9.6: + resolution: {integrity: sha512-HXTK9f93QxoH8dYn1M2mJdOlWgMsR88Lg/ul6QCZGkNTktjTE5HAf93YxQumHoCudLEtZrU1cFCMFOVho6GqFg==} + peerDependencies: + '@babel/core': ^7.0.0 balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} bare-events@2.6.0: - resolution: - { - integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==, - } + resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==} base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} better-path-resolve@1.0.0: - resolution: - { - integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} binary-extensions@2.3.0: - resolution: - { - integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} bindings@1.5.0: - resolution: - { - integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, - } + 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 } + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} boolbase@1.0.0: - resolution: - { - integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, - } + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@1.1.12: - resolution: - { - integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==, - } + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.2: - resolution: - { - integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==, - } + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: - resolution: - { - integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} browserslist@4.25.1: - resolution: - { - integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true buffer-crc32@0.2.13: - resolution: - { - integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==, - } + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} buffer-crc32@1.0.0: - resolution: - { - integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==, - } - engines: { node: ">=8.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==, - } + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer@6.0.3: - resolution: - { - integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, - } + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} builtin-modules@3.3.0: - resolution: - { - integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} bundle-require@5.1.0: - resolution: - { - integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: ">=0.18" + esbuild: '>=0.18' bytes@3.1.2: - resolution: - { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} c12@3.0.4: - resolution: - { - integrity: sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==, - } + resolution: {integrity: sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==} peerDependencies: magicast: ^0.3.5 peerDependenciesMeta: @@ -4883,580 +3529,340 @@ packages: optional: true cac@6.7.14: - resolution: - { - integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} call-bind-apply-helpers@1.0.2: - resolution: - { - integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} call-bind@1.0.8: - resolution: - { - integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} call-bound@1.0.3: - resolution: - { - integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} call-bound@1.0.4: - resolution: - { - integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} callsite@1.0.0: - resolution: - { - integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==, - } + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} caniuse-lite@1.0.30001727: - resolution: - { - integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==, - } + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} chai@5.2.0: - resolution: - { - integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} chalk@3.0.0: - resolution: - { - integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} chalk@5.4.1: - resolution: - { - integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} chardet@0.7.0: - resolution: - { - integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, - } + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} check-error@2.1.1: - resolution: - { - integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, - } - engines: { node: ">= 16" } + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} cheerio-select@2.1.0: - resolution: - { - integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==, - } + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} cheerio@1.1.0: - resolution: - { - integrity: sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==, - } - engines: { node: ">=18.17" } + resolution: {integrity: sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==} + engines: {node: '>=18.17'} chokidar@3.6.0: - resolution: - { - integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, - } - engines: { node: ">= 8.10.0" } + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} chokidar@4.0.3: - resolution: - { - integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, - } - engines: { node: ">= 14.16.0" } + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} chownr@3.0.0: - resolution: - { - integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} ci-info@3.9.0: - resolution: - { - integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} citty@0.1.6: - resolution: - { - integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==, - } + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} cli-cursor@5.0.0: - resolution: - { - integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} cli-truncate@4.0.0: - resolution: - { - integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} clipboardy@4.0.0: - resolution: - { - integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} + engines: {node: '>=18'} cliui@8.0.1: - resolution: - { - integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + 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" } + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-string@1.9.1: - resolution: - { - integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, - } + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} color@3.2.1: - resolution: - { - integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==, - } + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} colorette@2.0.20: - resolution: - { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, - } + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} colorspace@1.1.4: - resolution: - { - integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==, - } + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} commander@10.0.1: - resolution: - { - integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} commander@12.1.0: - resolution: - { - integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} commander@13.1.0: - resolution: - { - integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} commander@4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} comment-parser@1.4.1: - resolution: - { - integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} common-path-prefix@3.0.0: - resolution: - { - integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==, - } + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} commondir@1.0.1: - resolution: - { - integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, - } + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} compare-func@2.0.0: - resolution: - { - integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, - } + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} compare-versions@6.1.1: - resolution: - { - integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==, - } + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} compatx@0.2.0: - resolution: - { - integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==, - } + resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==} compress-commons@6.0.2: - resolution: - { - integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} computeds@0.0.1: - resolution: - { - integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==, - } + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} concurrently@9.2.0: - resolution: - { - integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==} + engines: {node: '>=18'} hasBin: true confbox@0.1.8: - resolution: - { - integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==, - } + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} confbox@0.2.2: - resolution: - { - integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==, - } + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} consola@3.4.0: - resolution: - { - integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==, - } - engines: { node: ^14.18.0 || >=16.10.0 } + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} consola@3.4.2: - resolution: - { - integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==, - } - engines: { node: ^14.18.0 || >=16.10.0 } + 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" } + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} conventional-changelog-angular@7.0.0: - resolution: - { - integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} conventional-commits-parser@5.0.0: - resolution: - { - integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} hasBin: true convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie-es@1.2.2: - resolution: - { - integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==, - } + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} cookie-es@2.0.0: - resolution: - { - integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==, - } + resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} cookie-signature@1.0.6: - resolution: - { - integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, - } + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} cookie@0.7.1: - resolution: - { - integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} cookie@1.0.2: - resolution: - { - integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} copy-file@11.0.0: - resolution: - { - integrity: sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw==} + engines: {node: '>=18'} core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} cors@2.8.5: - resolution: - { - integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, - } - engines: { node: ">= 0.10" } + 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" } + 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" } + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} cron-parser@4.9.0: - resolution: - { - integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} croner@9.1.0: - resolution: - { - integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==, - } - engines: { node: ">=18.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" } + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} + engines: {node: '>=4.8'} cross-spawn@7.0.6: - resolution: - { - integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} crossws@0.3.5: - resolution: - { - integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==, - } + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} css-select@5.2.2: - resolution: - { - integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==, - } + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} css-what@6.2.2: - resolution: - { - integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} css.escape@1.5.1: - resolution: - { - integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==, - } + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} cssstyle@4.2.1: - resolution: - { - integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} + engines: {node: '>=18'} csstype@3.1.3: - resolution: - { - integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, - } + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} data-uri-to-buffer@4.0.1: - resolution: - { - integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, - } - engines: { node: ">= 12" } + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} data-urls@5.0.0: - resolution: - { - integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} data-view-buffer@1.0.2: - resolution: - { - integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} data-view-byte-length@1.0.2: - resolution: - { - integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} data-view-byte-offset@1.0.1: - resolution: - { - integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} dataloader@1.4.0: - resolution: - { - integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==, - } + resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} db0@0.3.2: - resolution: - { - integrity: sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==, - } + resolution: {integrity: sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==} peerDependencies: - "@electric-sql/pglite": "*" - "@libsql/client": "*" - better-sqlite3: "*" - drizzle-orm: "*" - mysql2: "*" - sqlite3: "*" + '@electric-sql/pglite': '*' + '@libsql/client': '*' + better-sqlite3: '*' + drizzle-orm: '*' + mysql2: '*' + sqlite3: '*' peerDependenciesMeta: - "@electric-sql/pglite": + '@electric-sql/pglite': optional: true - "@libsql/client": + '@libsql/client': optional: true better-sqlite3: optional: true @@ -5468,394 +3874,267 @@ packages: optional: true de-indent@1.0.2: - resolution: - { - integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==, - } + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} debug@2.6.9: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@3.2.7: - resolution: - { - integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, - } + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.4.0: - resolution: - { - integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, - } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.4.1: - resolution: - { - integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==, - } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true decache@4.6.2: - resolution: - { - integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==, - } + resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} decimal.js@10.5.0: - resolution: - { - integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==, - } + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} deep-eql@5.0.2: - resolution: - { - integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} define-data-property@1.1.4: - resolution: - { - integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, - } - engines: { node: ">= 0.4" } + 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" } + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} define-properties@1.2.1: - resolution: - { - integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} defu@6.1.4: - resolution: - { - integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==, - } + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} denque@2.1.0: - resolution: - { - integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, - } - engines: { node: ">=0.10" } + 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" } + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} dequal@2.0.3: - resolution: - { - integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} destr@2.0.5: - resolution: - { - integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==, - } + 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 } + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} detect-indent@6.1.0: - resolution: - { - integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} detect-libc@1.0.3: - resolution: - { - integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, - } - engines: { node: ">=0.10" } + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} hasBin: true detect-libc@2.0.4: - resolution: - { - integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} detective-amd@6.0.1: - resolution: - { - integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==} + engines: {node: '>=18'} hasBin: true detective-cjs@6.0.1: - resolution: - { - integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==} + engines: {node: '>=18'} detective-es6@5.0.1: - resolution: - { - integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==} + engines: {node: '>=18'} detective-postcss@7.0.1: - resolution: - { - integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==, - } - engines: { node: ^14.0.0 || >=16.0.0 } + resolution: {integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==} + engines: {node: ^14.0.0 || >=16.0.0} peerDependencies: postcss: ^8.4.47 detective-sass@6.0.1: - resolution: - { - integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==} + engines: {node: '>=18'} detective-scss@5.0.1: - resolution: - { - integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==} + engines: {node: '>=18'} detective-stylus@5.0.1: - resolution: - { - integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} + engines: {node: '>=18'} detective-typescript@14.0.0: - resolution: - { - integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} + engines: {node: '>=18'} peerDependencies: typescript: ^5.4.4 detective-vue2@2.2.0: - resolution: - { - integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} + engines: {node: '>=18'} peerDependencies: typescript: ^5.4.4 + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@8.0.2: - resolution: - { - integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==, - } - engines: { node: ">=0.3.1" } + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} doctrine@2.1.0: - resolution: - { - integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} dom-accessibility-api@0.5.16: - resolution: - { - integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==, - } + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} dom-accessibility-api@0.6.3: - resolution: - { - integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==, - } + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} dom-serializer@2.0.0: - resolution: - { - integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, - } + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} domhandler@5.0.3: - resolution: - { - integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} domutils@3.2.2: - resolution: - { - integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==, - } + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dot-prop@5.3.0: - resolution: - { - integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} dot-prop@9.0.0: - resolution: - { - integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} dotenv@16.6.1: - resolution: - { - integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} drizzle-kit@0.30.6: - resolution: - { - integrity: sha512-U4wWit0fyZuGuP7iNmRleQyK2V8wCuv57vf5l3MnG4z4fzNTjY/U13M8owyQ5RavqvqxBifWORaR3wIUzlN64g==, - } + resolution: {integrity: sha512-U4wWit0fyZuGuP7iNmRleQyK2V8wCuv57vf5l3MnG4z4fzNTjY/U13M8owyQ5RavqvqxBifWORaR3wIUzlN64g==} hasBin: true drizzle-orm@0.40.1: - resolution: - { - integrity: sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew==, - } + resolution: {integrity: sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew==} peerDependencies: - "@aws-sdk/client-rds-data": ">=3" - "@cloudflare/workers-types": ">=4" - "@electric-sql/pglite": ">=0.2.0" - "@libsql/client": ">=0.10.0" - "@libsql/client-wasm": ">=0.10.0" - "@neondatabase/serverless": ">=0.10.0" - "@op-engineering/op-sqlite": ">=2" - "@opentelemetry/api": ^1.4.1 - "@planetscale/database": ">=1" - "@prisma/client": "*" - "@tidbcloud/serverless": "*" - "@types/better-sqlite3": "*" - "@types/pg": "*" - "@types/sql.js": "*" - "@vercel/postgres": ">=0.8.0" - "@xata.io/client": "*" - better-sqlite3: ">=7" - bun-types: "*" - expo-sqlite: ">=14.0.0" - gel: ">=2" - knex: "*" - kysely: "*" - mysql2: ">=2" - pg: ">=8" - postgres: ">=3" - prisma: "*" - sql.js: ">=1" - sqlite3: ">=5" + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + sql.js: '>=1' + sqlite3: '>=5' peerDependenciesMeta: - "@aws-sdk/client-rds-data": + '@aws-sdk/client-rds-data': optional: true - "@cloudflare/workers-types": + '@cloudflare/workers-types': optional: true - "@electric-sql/pglite": + '@electric-sql/pglite': optional: true - "@libsql/client": + '@libsql/client': optional: true - "@libsql/client-wasm": + '@libsql/client-wasm': optional: true - "@neondatabase/serverless": + '@neondatabase/serverless': optional: true - "@op-engineering/op-sqlite": + '@op-engineering/op-sqlite': optional: true - "@opentelemetry/api": + '@opentelemetry/api': optional: true - "@planetscale/database": + '@planetscale/database': optional: true - "@prisma/client": + '@prisma/client': optional: true - "@tidbcloud/serverless": + '@tidbcloud/serverless': optional: true - "@types/better-sqlite3": + '@types/better-sqlite3': optional: true - "@types/pg": + '@types/pg': optional: true - "@types/sql.js": + '@types/sql.js': optional: true - "@vercel/postgres": + '@vercel/postgres': optional: true - "@xata.io/client": + '@xata.io/client': optional: true better-sqlite3: optional: true @@ -5883,320 +4162,199 @@ packages: optional: true drizzle-zod@0.7.1: - resolution: - { - integrity: sha512-nZzALOdz44/AL2U005UlmMqaQ1qe5JfanvLujiTHiiT8+vZJTBFhj3pY4Vk+L6UWyKFfNmLhk602Hn4kCTynKQ==, - } + resolution: {integrity: sha512-nZzALOdz44/AL2U005UlmMqaQ1qe5JfanvLujiTHiiT8+vZJTBFhj3pY4Vk+L6UWyKFfNmLhk602Hn4kCTynKQ==} peerDependencies: - drizzle-orm: ">=0.36.0" - zod: ">=3.0.0" + drizzle-orm: '>=0.36.0' + zod: '>=3.0.0' dunder-proto@1.0.1: - resolution: - { - integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} duplexer@0.1.2: - resolution: - { - integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, - } + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ee-first@1.1.1: - resolution: - { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} electron-to-chromium@1.5.180: - resolution: - { - integrity: sha512-ED+GEyEh3kYMwt2faNmgMB0b8O5qtATGgR4RmRsIp4T6p7B8vdMbIedYndnvZfsaXvSzegtpfqRMDNCjjiSduA==, - } + resolution: {integrity: sha512-ED+GEyEh3kYMwt2faNmgMB0b8O5qtATGgR4RmRsIp4T6p7B8vdMbIedYndnvZfsaXvSzegtpfqRMDNCjjiSduA==} emoji-regex@10.4.0: - resolution: - { - integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==, - } + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} enabled@2.0.0: - resolution: - { - integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==, - } + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} encodeurl@1.0.2: - resolution: - { - integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} encodeurl@2.0.0: - resolution: - { - integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} encoding-sniffer@0.2.1: - resolution: - { - integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==, - } + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} enhanced-resolve@5.18.2: - resolution: - { - integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==, - } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} + engines: {node: '>=10.13.0'} enquirer@2.4.1: - resolution: - { - integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: ">=0.12" } + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} entities@6.0.1: - resolution: - { - integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==, - } - engines: { node: ">=0.12" } + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} env-paths@3.0.0: - resolution: - { - integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.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" } + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} error-stack-parser-es@1.0.5: - resolution: - { - integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==, - } + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} es-abstract@1.23.9: - resolution: - { - integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} es-define-property@1.0.1: - resolution: - { - integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} es-iterator-helpers@1.2.1: - resolution: - { - integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} es-module-lexer@1.7.0: - resolution: - { - integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, - } + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} es-object-atoms@1.1.1: - resolution: - { - integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: - resolution: - { - integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} es-shim-unscopables@1.1.0: - resolution: - { - integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: - resolution: - { - integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild-plugin-solid@0.5.0: + resolution: {integrity: sha512-ITK6n+0ayGFeDVUZWNMxX+vLsasEN1ILrg4pISsNOQ+mq4ljlJJiuXotInd+HE0MzwTcA9wExT1yzDE2hsqPsg==} + peerDependencies: + esbuild: '>=0.12' + solid-js: '>= 1.0' esbuild-register@3.6.0: - resolution: - { - integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==, - } + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: - esbuild: ">=0.12 <1" + esbuild: '>=0.12 <1' esbuild@0.18.20: - resolution: - { - integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} hasBin: true esbuild@0.19.12: - resolution: - { - integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} hasBin: true esbuild@0.25.0: - resolution: - { - integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} hasBin: true esbuild@0.25.1: - resolution: - { - integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + engines: {node: '>=18'} hasBin: true esbuild@0.25.5: - resolution: - { - integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} hasBin: true esbuild@0.25.6: - resolution: - { - integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: - resolution: - { - integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} escape-string-regexp@5.0.0: - resolution: - { - integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} escodegen@2.1.0: - resolution: - { - integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, - } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} hasBin: true eslint-compat-utils@0.5.1: - resolution: - { - integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} peerDependencies: - eslint: ">=6.0.0" + eslint: '>=6.0.0' eslint-config-prettier@10.1.5: - resolution: - { - integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==, - } + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} hasBin: true peerDependencies: - eslint: ">=7.0.0" + eslint: '>=7.0.0' eslint-import-context@0.1.9: - resolution: - { - integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==, - } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} peerDependencies: unrs-resolver: ^1.0.0 peerDependenciesMeta: @@ -6204,327 +4362,198 @@ packages: optional: true eslint-import-resolver-node@0.3.9: - resolution: - { - integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, - } + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} eslint-plugin-es-x@7.8.0: - resolution: - { - integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: ">=8" + eslint: '>=8' eslint-plugin-import-x@4.16.1: - resolution: - { - integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - "@typescript-eslint/utils": ^8.0.0 + '@typescript-eslint/utils': ^8.0.0 eslint: ^8.57.0 || ^9.0.0 - eslint-import-resolver-node: "*" + eslint-import-resolver-node: '*' peerDependenciesMeta: - "@typescript-eslint/utils": + '@typescript-eslint/utils': optional: true eslint-import-resolver-node: optional: true eslint-plugin-n@17.21.0: - resolution: - { - integrity: sha512-1+iZ8We4ZlwVMtb/DcHG3y5/bZOdazIpa/4TySo22MLKdwrLcfrX0hbadnCvykSQCCmkAnWmIP8jZVb2AAq29A==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-1+iZ8We4ZlwVMtb/DcHG3y5/bZOdazIpa/4TySo22MLKdwrLcfrX0hbadnCvykSQCCmkAnWmIP8jZVb2AAq29A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ">=8.23.0" + eslint: '>=8.23.0' eslint-plugin-prettier@5.5.1: - resolution: - { - integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - "@types/eslint": ">=8.0.0" - eslint: ">=8.0.0" - eslint-config-prettier: ">= 7.0.0 <10.0.0 || >=10.1.0" - prettier: ">=3.0.0" + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' peerDependenciesMeta: - "@types/eslint": + '@types/eslint': optional: true eslint-config-prettier: optional: true eslint-plugin-react-hooks@5.2.0: - resolution: - { - integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} 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.20: - resolution: - { - integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==, - } + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} peerDependencies: - eslint: ">=8.40" + eslint: '>=8.40' eslint-plugin-react@7.37.5: - resolution: - { - integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + 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 } + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.2.1: - resolution: - { - integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.30.1: - resolution: - { - integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: - jiti: "*" + jiti: '*' peerDependenciesMeta: jiti: optional: true espree@10.4.0: - resolution: - { - integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + 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 } + 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" } + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} hasBin: true esquery@1.6.0: - resolution: - { - integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, - } - engines: { node: ">=0.10" } + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} estree-walker@2.0.2: - resolution: - { - integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, - } + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: - resolution: - { - integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, - } + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} event-target-shim@5.0.1: - resolution: - { - integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} eventemitter3@5.0.1: - resolution: - { - integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, - } + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} events@3.3.0: - resolution: - { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, - } - engines: { node: ">=0.8.x" } + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} execa@1.0.0: - resolution: - { - integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} execa@8.0.1: - resolution: - { - integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, - } - engines: { node: ">=16.17" } + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} expect-type@1.2.2: - resolution: - { - integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} express@4.21.2: - resolution: - { - integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==, - } - engines: { node: ">= 0.10.0" } + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} exsolve@1.0.7: - resolution: - { - integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==, - } + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} extendable-error@0.1.7: - resolution: - { - integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==, - } + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} external-editor@3.1.0: - resolution: - { - integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} extract-zip@2.0.1: - resolution: - { - integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==, - } - engines: { node: ">= 10.17.0" } + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} hasBin: true fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-diff@1.3.0: - resolution: - { - integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==, - } + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} fast-fifo@1.3.2: - resolution: - { - integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, - } + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} fast-glob@3.3.3: - resolution: - { - integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, - } - engines: { node: ">=8.6.0" } + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fastq@1.19.1: - resolution: - { - integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==, - } + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fd-slicer@1.1.0: - resolution: - { - integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==, - } + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} fdir@6.4.6: - resolution: - { - integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==, - } + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -6532,1173 +4561,681 @@ packages: optional: true fecha@4.2.3: - resolution: - { - integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==, - } + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} fetch-blob@3.2.0: - resolution: - { - integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, - } - engines: { node: ^12.20 || >= 14.13 } + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} file-entry-cache@8.0.0: - resolution: - { - integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, - } - engines: { node: ">=16.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==, - } + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} fill-range@7.1.1: - resolution: - { - integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} filter-obj@6.1.0: - resolution: - { - integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==} + engines: {node: '>=18'} finalhandler@1.3.1: - resolution: - { - integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} find-up-simple@1.0.1: - resolution: - { - integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} find-up@7.0.0: - resolution: - { - integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} fix-dts-default-cjs-exports@1.0.1: - resolution: - { - integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==, - } + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} flat-cache@4.0.1: - resolution: - { - integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.3: - resolution: - { - integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, - } + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} fn.name@1.1.0: - resolution: - { - integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==, - } + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} for-each@0.3.5: - resolution: - { - integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} foreground-child@3.3.1: - resolution: - { - integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} formdata-polyfill@4.0.10: - resolution: - { - integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, - } - engines: { node: ">=12.20.0" } + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} fractional-indexing@3.2.0: - resolution: - { - integrity: sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ==, - } - engines: { node: ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ==} + engines: {node: ^14.13.1 || >=16.0.0} fresh@0.5.2: - resolution: - { - integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} fresh@2.0.0: - resolution: - { - integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} fs-extra@11.3.0: - resolution: - { - integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==, - } - engines: { node: ">=14.14" } + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} fs-extra@7.0.1: - resolution: - { - integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, - } - engines: { node: ">=6 <7 || >=8" } + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} fs-extra@8.1.0: - resolution: - { - integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, - } - engines: { node: ">=6 <7 || >=8" } + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} function.prototype.name@1.1.8: - resolution: - { - integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} functions-have-names@1.2.3: - resolution: - { - integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, - } + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} gel@2.1.1: - resolution: - { - integrity: sha512-Newg9X7mRYskoBjSw70l1YnJ/ZGbq64VPyR821H5WVkTGpHG2O0mQILxCeUhxdYERLFY9B4tUyKLyf3uMTjtKw==, - } - engines: { node: ">= 18.0.0" } + resolution: {integrity: sha512-Newg9X7mRYskoBjSw70l1YnJ/ZGbq64VPyR821H5WVkTGpHG2O0mQILxCeUhxdYERLFY9B4tUyKLyf3uMTjtKw==} + engines: {node: '>= 18.0.0'} hasBin: true gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: ">=6.9.0" } + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} get-amd-module-type@6.0.1: - resolution: - { - integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} + engines: {node: '>=18'} get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} get-east-asian-width@1.3.0: - resolution: - { - integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} get-intrinsic@1.2.7: - resolution: - { - integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} get-intrinsic@1.3.0: - resolution: - { - integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} get-port-please@3.1.2: - resolution: - { - integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==, - } + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} get-proto@1.0.1: - resolution: - { - integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} get-stream@4.1.0: - resolution: - { - integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} get-stream@5.2.0: - resolution: - { - integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} get-stream@8.0.1: - resolution: - { - integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} get-symbol-description@1.1.0: - resolution: - { - integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} get-tsconfig@4.10.0: - resolution: - { - integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==, - } + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} get-tsconfig@4.10.1: - resolution: - { - integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==, - } + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} giget@2.0.0: - resolution: - { - integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==, - } + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} glob@10.4.5: - resolution: - { - integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, - } + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true globals@14.0.0: - resolution: - { - integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} globals@15.15.0: - resolution: - { - integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} globals@16.3.0: - resolution: - { - integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + engines: {node: '>=18'} globalthis@1.0.4: - resolution: - { - integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} globby@14.1.0: - resolution: - { - integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} globrex@0.1.2: - resolution: - { - integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==, - } + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} gonzales-pe@4.3.0: - resolution: - { - integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==, - } - engines: { node: ">=0.6.0" } + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} hasBin: true + goober@2.1.16: + resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} + peerDependencies: + csstype: ^3.0.10 + gopd@1.2.0: - resolution: - { - integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} gzip-size@7.0.0: - resolution: - { - integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.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==, - } + resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} h3@1.15.3: - resolution: - { - integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==, - } + resolution: {integrity: sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ==} happy-dom@18.0.1: - resolution: - { - integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==, - } - engines: { node: ">=20.0.0" } + resolution: {integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==} + engines: {node: '>=20.0.0'} has-bigints@1.1.0: - resolution: - { - integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} has-property-descriptors@1.0.2: - resolution: - { - integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, - } + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} has-proto@1.2.0: - resolution: - { - integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} has-symbols@1.1.0: - resolution: - { - integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} has-tostringtag@1.0.2: - resolution: - { - integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} he@1.2.0: - resolution: - { - integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, - } + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true hookable@5.5.3: - resolution: - { - integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, - } + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} hosted-git-info@7.0.2: - resolution: - { - integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} html-encoding-sniffer@4.0.0: - resolution: - { - integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} html-escaper@2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - } + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} htmlparser2@10.0.0: - resolution: - { - integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==, - } + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} http-errors@2.0.0: - resolution: - { - integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} http-proxy-agent@7.0.2: - resolution: - { - integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} http-shutdown@1.2.2: - resolution: - { - integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==, - } - engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } + 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" } + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} httpxy@0.1.7: - resolution: - { - integrity: sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==, - } + resolution: {integrity: sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==} human-id@4.1.1: - resolution: - { - integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==, - } + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true human-signals@5.0.0: - resolution: - { - integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, - } - engines: { node: ">=16.17.0" } + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} husky@9.1.7: - resolution: - { - integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} hasBin: true iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ignore@5.3.2: - resolution: - { - integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} ignore@7.0.5: - resolution: - { - integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} import-fresh@3.3.1: - resolution: - { - integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} import-lazy@4.0.0: - resolution: - { - integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} indent-string@4.0.0: - resolution: - { - integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} index-to-position@1.1.0: - resolution: - { - integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} + engines: {node: '>=18'} inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} internal-slot@1.1.0: - resolution: - { - integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} interpret@1.4.0: - resolution: - { - integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==, - } - engines: { node: ">= 0.10" } + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} ioredis@5.6.1: - resolution: - { - integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==, - } - engines: { node: ">=12.22.0" } + resolution: {integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==} + engines: {node: '>=12.22.0'} ipaddr.js@1.9.1: - resolution: - { - integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, - } - engines: { node: ">= 0.10" } + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} iron-webcrypto@1.2.1: - resolution: - { - integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==, - } + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} is-array-buffer@3.0.5: - resolution: - { - integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.2: - resolution: - { - integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, - } + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} is-async-function@2.1.1: - resolution: - { - integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} is-bigint@1.1.0: - resolution: - { - integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} is-boolean-object@1.2.2: - resolution: - { - integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} is-builtin-module@3.2.1: - resolution: - { - integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} is-callable@1.2.7: - resolution: - { - integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} is-core-module@2.16.1: - resolution: - { - integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} is-data-view@1.0.2: - resolution: - { - integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} is-date-object@1.1.0: - resolution: - { - integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: ">=8" } + 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 } + 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" } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-finalizationregistry@1.1.1: - resolution: - { - integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} is-fullwidth-code-point@4.0.0: - resolution: - { - integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} is-fullwidth-code-point@5.0.0: - resolution: - { - integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} is-generator-function@1.1.0: - resolution: - { - integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-inside-container@1.0.0: - resolution: - { - integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, - } - engines: { node: ">=14.16" } + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} hasBin: true is-map@2.0.3: - resolution: - { - integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, - } - engines: { node: ">= 0.4" } + 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==, - } + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} is-number-object@1.1.1: - resolution: - { - integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-obj@2.0.0: - resolution: - { - integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} is-path-inside@4.0.0: - resolution: - { - integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} is-plain-obj@2.1.0: - resolution: - { - integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} is-potential-custom-element-name@1.0.1: - resolution: - { - integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, - } + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} is-reference@1.2.1: - resolution: - { - integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==, - } + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} is-regex@1.2.1: - resolution: - { - integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} is-set@2.0.3: - resolution: - { - integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} is-shared-array-buffer@1.0.4: - resolution: - { - integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} is-stream@1.1.0: - resolution: - { - integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: ">=8" } + 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 } + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} is-stream@4.0.1: - resolution: - { - integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} is-string@1.1.1: - resolution: - { - integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} is-subdir@1.2.0: - resolution: - { - integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} is-symbol@1.1.1: - resolution: - { - integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} is-text-path@2.0.0: - resolution: - { - integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} is-typed-array@1.1.15: - resolution: - { - integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} is-url-superb@4.0.0: - resolution: - { - integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} is-url@1.2.4: - resolution: - { - integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==, - } + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} is-weakmap@2.0.2: - resolution: - { - integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} is-weakref@1.1.1: - resolution: - { - integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} is-weakset@2.0.4: - resolution: - { - integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} is-windows@1.0.2: - resolution: - { - integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, - } - engines: { node: ">=0.10.0" } + 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" } + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} is-wsl@3.1.0: - resolution: - { - integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} is64bit@2.0.0: - resolution: - { - integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} + engines: {node: '>=18'} isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isarray@2.0.5: - resolution: - { - integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, - } + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isbot@5.1.28: - resolution: - { - integrity: sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==} + engines: {node: '>=18'} isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} isexe@3.1.1: - resolution: - { - integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} istanbul-lib-coverage@3.2.2: - resolution: - { - integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} istanbul-lib-instrument@6.0.3: - resolution: - { - integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} istanbul-lib-report@3.0.1: - resolution: - { - integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} istanbul-lib-source-maps@5.0.6: - resolution: - { - integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} istanbul-reports@3.1.7: - resolution: - { - integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} iterator.prototype@1.1.5: - resolution: - { - integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} jackspeak@3.4.3: - resolution: - { - integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, - } + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jiti@2.4.2: - resolution: - { - integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==, - } + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true jju@1.4.0: - resolution: - { - integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==, - } + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} joycon@3.1.1: - resolution: - { - integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-tokens@9.0.1: - resolution: - { - integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, - } + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} js-yaml@3.14.1: - resolution: - { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, - } + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true jsdom@26.1.0: - resolution: - { - integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -7706,790 +5243,462 @@ packages: optional: true jsesc@3.1.0: - resolution: - { - integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true jsonfile@4.0.0: - resolution: - { - integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, - } + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} jsonparse@1.3.1: - resolution: - { - integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, - } - engines: { "0": node >= 0.2.0 } + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} jsx-ast-utils@3.3.5: - resolution: - { - integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, - } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} junk@4.0.1: - resolution: - { - integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==, - } - engines: { node: ">=12.20" } + resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} + engines: {node: '>=12.20'} jwt-decode@4.0.0: - resolution: - { - integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kleur@4.1.5: - resolution: - { - integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} klona@2.0.6: - resolution: - { - integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} knitwork@1.2.0: - resolution: - { - integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==, - } + resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} kolorist@1.8.0: - resolution: - { - integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==, - } + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} kuler@2.0.0: - resolution: - { - integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==, - } + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} kysely@0.28.2: - resolution: - { - integrity: sha512-4YAVLoF0Sf0UTqlhgQMFU9iQECdah7n+13ANkiuVfRvlK+uI0Etbgd7bVP36dKlG+NXWbhGua8vnGt+sdhvT7A==, - } - engines: { node: ">=18.0.0" } + resolution: {integrity: sha512-4YAVLoF0Sf0UTqlhgQMFU9iQECdah7n+13ANkiuVfRvlK+uI0Etbgd7bVP36dKlG+NXWbhGua8vnGt+sdhvT7A==} + engines: {node: '>=18.0.0'} lambda-local@2.2.0: - resolution: - { - integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==} + engines: {node: '>=8'} hasBin: true lazystream@1.0.1: - resolution: - { - integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==, - } - engines: { node: ">= 0.6.3" } + 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" } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} lightningcss-darwin-arm64@1.30.1: - resolution: - { - integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.30.1: - resolution: - { - integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.30.1: - resolution: - { - integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.30.1: - resolution: - { - integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.30.1: - resolution: - { - integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] lightningcss-linux-arm64-musl@1.30.1: - resolution: - { - integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] lightningcss-linux-x64-gnu@1.30.1: - resolution: - { - integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] lightningcss-linux-x64-musl@1.30.1: - resolution: - { - integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] lightningcss-win32-arm64-msvc@1.30.1: - resolution: - { - integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.30.1: - resolution: - { - integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] lightningcss@1.30.1: - resolution: - { - integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} lilconfig@3.1.3: - resolution: - { - integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} linkify-it@5.0.0: - resolution: - { - integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==, - } + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} lint-staged@15.5.2: - resolution: - { - integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==, - } - engines: { node: ">=18.12.0" } + resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==} + engines: {node: '>=18.12.0'} hasBin: true listhen@1.9.0: - resolution: - { - integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==, - } + resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true listr2@8.3.3: - resolution: - { - integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==, - } - engines: { node: ">=18.0.0" } + resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} + engines: {node: '>=18.0.0'} load-tsconfig@0.2.5: - resolution: - { - integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} local-pkg@0.5.1: - resolution: - { - integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} local-pkg@1.1.1: - resolution: - { - integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} locate-path@7.2.0: - resolution: - { - integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} lodash-es@4.17.21: - resolution: - { - integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, - } + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} lodash.debounce@4.0.8: - resolution: - { - integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, - } + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} lodash.defaults@4.2.0: - resolution: - { - integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==, - } + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} lodash.isarguments@3.1.0: - resolution: - { - integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==, - } + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash.sortby@4.7.0: - resolution: - { - integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, - } + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} lodash.startcase@4.4.0: - resolution: - { - integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, - } + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} log-update@6.1.0: - resolution: - { - integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} logform@2.7.0: - resolution: - { - integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.3: - resolution: - { - integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==, - } + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} loupe@3.1.4: - resolution: - { - integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==, - } + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} lru-cache@10.4.3: - resolution: - { - integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, - } + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} lunr@2.3.9: - resolution: - { - integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==, - } + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} luxon@3.7.1: - resolution: - { - integrity: sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==} + engines: {node: '>=12'} lz-string@1.5.0: - resolution: - { - integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==, - } + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true magic-string@0.30.17: - resolution: - { - integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, - } + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magicast@0.3.5: - resolution: - { - integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==, - } + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} make-dir@4.0.0: - resolution: - { - integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} markdown-it@14.1.0: - resolution: - { - integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==, - } + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true math-intrinsics@1.1.0: - resolution: - { - integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} mdurl@2.0.0: - resolution: - { - integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==, - } + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} media-typer@0.3.0: - resolution: - { - integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} meow@12.1.1: - resolution: - { - integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==, - } - engines: { node: ">=16.10" } + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + merge-anything@5.1.7: + resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} + engines: {node: '>=12.13'} merge-descriptors@1.0.3: - resolution: - { - integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==, - } + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} merge-options@3.0.4: - resolution: - { - integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} methods@1.1.2: - resolution: - { - integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} micro-api-client@3.3.0: - resolution: - { - integrity: sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==, - } + resolution: {integrity: sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==} micromatch@4.0.8: - resolution: - { - integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} mime-db@1.54.0: - resolution: - { - integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} mime-types@3.0.1: - resolution: - { - integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} mime@1.6.0: - resolution: - { - integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} hasBin: true mime@3.0.0: - resolution: - { - integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, - } - engines: { node: ">=10.0.0" } + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} hasBin: true mime@4.0.7: - resolution: - { - integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==} + engines: {node: '>=16'} hasBin: true mimic-fn@4.0.0: - resolution: - { - integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} mimic-function@5.0.1: - resolution: - { - integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} min-indent@1.0.1: - resolution: - { - integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} minimatch@10.0.3: - resolution: - { - integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} minimatch@3.0.8: - resolution: - { - integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==, - } + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: ">=10" } + 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" } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minipass@7.1.2: - resolution: - { - integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} minizlib@3.0.2: - resolution: - { - integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} mitt@3.0.1: - resolution: - { - integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==, - } + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} mkdirp@3.0.1: - resolution: - { - integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} hasBin: true mlly@1.7.4: - resolution: - { - integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==, - } + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} module-definition@6.0.1: - resolution: - { - integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} + engines: {node: '>=18'} hasBin: true mri@1.2.0: - resolution: - { - integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} muggle-string@0.4.1: - resolution: - { - integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==, - } + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} murmurhash-js@1.0.0: - resolution: - { - integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==, - } + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} mz@2.7.0: - resolution: - { - integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, - } + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} nanoid@3.3.11: - resolution: - { - integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true napi-postinstall@0.3.0: - resolution: - { - integrity: sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==, - } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} negotiator@0.6.3: - resolution: - { - integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} netlify@13.3.5: - resolution: - { - integrity: sha512-Nc3loyVASW59W+8fLDZT1lncpG7llffyZ2o0UQLx/Fr20i7P8oP+lE7+TEcFvXj9IUWU6LjB9P3BH+iFGyp+mg==, - } - engines: { node: ^14.16.0 || >=16.0.0 } + resolution: {integrity: sha512-Nc3loyVASW59W+8fLDZT1lncpG7llffyZ2o0UQLx/Fr20i7P8oP+lE7+TEcFvXj9IUWU6LjB9P3BH+iFGyp+mg==} + engines: {node: ^14.16.0 || >=16.0.0} nice-try@1.0.5: - resolution: - { - integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, - } + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} nitropack@2.11.13: - resolution: - { - integrity: sha512-xKng/szRZmFEsrB1Z+sFzYDhXL5KUtUkEouPCj9LiBPhJ7qV3jdOv1MSis++8H8zNI6dEurt51ZlK4VRDvedsA==, - } - engines: { node: ^16.11.0 || >=17.0.0 } + resolution: {integrity: sha512-xKng/szRZmFEsrB1Z+sFzYDhXL5KUtUkEouPCj9LiBPhJ7qV3jdOv1MSis++8H8zNI6dEurt51ZlK4VRDvedsA==} + engines: {node: ^16.11.0 || >=17.0.0} hasBin: true peerDependencies: xml2js: ^0.6.2 @@ -8498,31 +5707,19 @@ packages: optional: true node-addon-api@7.1.1: - resolution: - { - integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, - } + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} node-domexception@1.0.0: - resolution: - { - integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, - } - engines: { node: ">=10.5.0" } + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead node-fetch-native@1.6.6: - resolution: - { - integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==, - } + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: { node: 4.x || >=6.0.0 } + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -8530,649 +5727,388 @@ packages: optional: true node-fetch@3.3.2: - resolution: - { - integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} node-gyp-build@4.8.4: - resolution: - { - integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==, - } + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true node-mock-http@1.0.1: - resolution: - { - integrity: sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==, - } + resolution: {integrity: sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==} node-releases@2.0.19: - resolution: - { - integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, - } + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} node-source-walk@7.0.1: - resolution: - { - integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==} + engines: {node: '>=18'} nopt@8.1.0: - resolution: - { - integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==, - } - engines: { node: ^18.17.0 || >=20.5.0 } + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@6.0.2: - resolution: - { - integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} normalize-path@2.1.1: - resolution: - { - integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-all2@5.0.2: + resolution: {integrity: sha512-S2G6FWZ3pNWAAKm2PFSOtEAG/N+XO/kz3+9l6V91IY+Y3XFSt7Lp7DV92KCgEboEW0hRTu0vFaMe4zXDZYaOyA==} + engines: {node: '>= 10'} + hasBin: true npm-run-path@2.0.2: - resolution: - { - integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} npm-run-path@5.3.0: - resolution: - { - integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} nth-check@2.1.1: - resolution: - { - integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, - } + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} nwsapi@2.2.16: - resolution: - { - integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==, - } + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} nypm@0.6.0: - resolution: - { - integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==, - } - engines: { node: ^14.16.0 || >=16.10.0 } + resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==} + 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" } + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} object-inspect@1.13.4: - resolution: - { - integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} object-keys@1.1.1: - resolution: - { - integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} object.assign@4.1.7: - resolution: - { - integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} object.entries@1.1.9: - resolution: - { - integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} object.fromentries@2.0.8: - resolution: - { - integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} object.values@1.2.1: - resolution: - { - integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} ofetch@1.4.1: - resolution: - { - integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==, - } + resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} ohash@1.1.6: - resolution: - { - integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==, - } + resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==} ohash@2.0.11: - resolution: - { - integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==, - } + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} on-finished@2.4.1: - resolution: - { - integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} one-time@1.0.0: - resolution: - { - integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==, - } + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} onetime@6.0.0: - resolution: - { - integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} onetime@7.0.0: - resolution: - { - integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==, - } - engines: { node: ">=18" } + 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" } + 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" } + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} os-tmpdir@1.0.2: - resolution: - { - integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} outdent@0.5.0: - resolution: - { - integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==, - } + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} own-keys@1.0.1: - resolution: - { - integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} p-event@6.0.1: - resolution: - { - integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==, - } - engines: { node: ">=16.17" } + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} p-filter@2.1.0: - resolution: - { - integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} p-finally@1.0.0: - resolution: - { - integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-limit@4.0.0: - resolution: - { - integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} p-locate@6.0.0: - resolution: - { - integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} p-map@2.1.0: - resolution: - { - integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} p-map@7.0.3: - resolution: - { - integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} p-timeout@6.1.4: - resolution: - { - integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==, - } - engines: { node: ">=14.16" } + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} p-wait-for@5.0.2: - resolution: - { - integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==} + engines: {node: '>=12'} package-json-from-dist@1.0.1: - resolution: - { - integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, - } + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} package-manager-detector@0.2.11: - resolution: - { - integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==, - } + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} package-manager-detector@1.3.0: - resolution: - { - integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==, - } + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} parse-gitignore@2.0.0: - resolution: - { - integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} parse-json@8.3.0: - resolution: - { - integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} parse5-htmlparser2-tree-adapter@7.1.0: - resolution: - { - integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==, - } + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} parse5-parser-stream@7.1.2: - resolution: - { - integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==, - } + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} parse5@7.2.1: - resolution: - { - integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==, - } + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} parse5@7.3.0: - resolution: - { - integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==, - } + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} path-browserify@1.0.1: - resolution: - { - integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, - } + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-exists@5.0.0: - resolution: - { - integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} path-key@2.0.1: - resolution: - { - integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} path-key@4.0.0: - resolution: - { - integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-scurry@1.11.1: - resolution: - { - integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, - } - engines: { node: ">=16 || 14 >=14.18" } + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-to-regexp@0.1.12: - resolution: - { - integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==, - } + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} path-type@4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} path-type@6.0.0: - resolution: - { - integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} pathe@1.1.2: - resolution: - { - integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, - } + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} pathe@2.0.3: - resolution: - { - integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, - } + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} pathval@2.0.0: - resolution: - { - integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==, - } - engines: { node: ">= 14.16" } + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} pend@1.2.0: - resolution: - { - integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==, - } + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} perfect-debounce@1.0.0: - resolution: - { - integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==, - } + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} pg-cloudflare@1.2.7: - resolution: - { - integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==, - } + resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} pg-connection-string@2.9.1: - resolution: - { - integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==, - } + resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} pg-int8@1.0.1: - resolution: - { - integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==, - } - engines: { node: ">=4.0.0" } + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} pg-pool@3.10.1: - resolution: - { - integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==, - } + resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==} peerDependencies: - pg: ">=8.0" + pg: '>=8.0' pg-protocol@1.10.3: - resolution: - { - integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==, - } + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} pg-protocol@1.8.0: - resolution: - { - integrity: sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==, - } + resolution: {integrity: sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==} pg-types@2.2.0: - resolution: - { - integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} pg@8.16.3: - resolution: - { - integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==, - } - engines: { node: ">= 16.0.0" } + resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==} + engines: {node: '>= 16.0.0'} peerDependencies: - pg-native: ">=3.0.1" + pg-native: '>=3.0.1' peerDependenciesMeta: pg-native: optional: true pgpass@1.0.5: - resolution: - { - integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==, - } + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} picomatch@4.0.2: - resolution: - { - integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.5.0: + resolution: {integrity: sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==} + engines: {node: '>=0.10'} + hasBin: true pidtree@0.6.0: - resolution: - { - integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, - } - engines: { node: ">=0.10" } + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} hasBin: true pify@4.0.1: - resolution: - { - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} pirates@4.0.6: - resolution: - { - integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} pkg-types@1.3.1: - resolution: - { - integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==, - } + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} pkg-types@2.2.0: - resolution: - { - integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==, - } + resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} possible-typed-array-names@1.1.0: - resolution: - { - integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} postcss-load-config@6.0.1: - resolution: - { - integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} peerDependencies: - jiti: ">=1.21.0" - postcss: ">=8.0.9" + jiti: '>=1.21.0' + postcss: '>=8.0.9' tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: @@ -9186,464 +6122,277 @@ packages: optional: true postcss-values-parser@6.0.2: - resolution: - { - integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} peerDependencies: postcss: ^8.2.9 postcss@8.5.6: - resolution: - { - integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: - resolution: - { - integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} postgres-bytea@1.0.0: - resolution: - { - integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} postgres-date@1.0.7: - resolution: - { - integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} postgres-interval@1.2.0: - resolution: - { - integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} postgres@3.4.7: - resolution: - { - integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} + engines: {node: '>=12'} precinct@12.2.0: - resolution: - { - integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==} + engines: {node: '>=18'} hasBin: true prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} prettier-linter-helpers@1.0.0: - resolution: - { - integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, - } - engines: { node: ">=6.0.0" } + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} prettier@2.8.8: - resolution: - { - integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, - } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} hasBin: true prettier@3.6.2: - resolution: - { - integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} hasBin: true pretty-bytes@6.1.1: - resolution: - { - integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, - } - engines: { node: ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} 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 } + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } + 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" } + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} prop-types@15.8.1: - resolution: - { - integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, - } + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} proxy-addr@2.0.7: - resolution: - { - integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, - } - engines: { node: ">= 0.10" } + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} publint@0.3.12: - resolution: - { - integrity: sha512-1w3MMtL9iotBjm1mmXtG3Nk06wnq9UhGNRpQ2j6n1Zq7YAD6gnxMMZMIxlRPAydVjVbjSm+n0lhwqsD1m4LD5w==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-1w3MMtL9iotBjm1mmXtG3Nk06wnq9UhGNRpQ2j6n1Zq7YAD6gnxMMZMIxlRPAydVjVbjSm+n0lhwqsD1m4LD5w==} + engines: {node: '>=18'} hasBin: true pump@3.0.2: - resolution: - { - integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==, - } + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} punycode.js@2.3.1: - resolution: - { - integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} qs@6.13.0: - resolution: - { - integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==, - } - engines: { node: ">=0.6" } + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} quansync@0.2.8: - resolution: - { - integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==, - } + resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==} queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} quote-unquote@1.0.0: - resolution: - { - integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==, - } + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} radix3@1.1.2: - resolution: - { - integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==, - } + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} randombytes@2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - } + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} raw-body@2.5.2: - resolution: - { - integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} rc9@2.1.2: - resolution: - { - integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==, - } + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} react-dom@19.1.0: - resolution: - { - integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==, - } + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: react: ^19.1.0 react-is@16.13.1: - resolution: - { - integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, - } + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react-is@17.0.2: - resolution: - { - integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, - } + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} react-refresh@0.17.0: - resolution: - { - integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} react@19.1.0: - resolution: - { - integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} read-package-up@11.0.0: - resolution: - { - integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} read-pkg@9.0.1: - resolution: - { - integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} read-yaml-file@1.1.0: - resolution: - { - integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } + 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 } + 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==, - } + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} readdirp@4.1.2: - resolution: - { - integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, - } - engines: { node: ">= 14.18.0" } + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} recast@0.23.11: - resolution: - { - integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} rechoir@0.6.2: - resolution: - { - integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==, - } - engines: { node: ">= 0.10" } + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} redent@3.0.0: - resolution: - { - integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} redis-errors@1.2.0: - resolution: - { - integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} redis-parser@3.0.0: - resolution: - { - integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} reflect.getprototypeof@1.0.10: - resolution: - { - integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regexp.prototype.flags@1.5.4: - resolution: - { - integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} remove-trailing-separator@1.1.0: - resolution: - { - integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==, - } + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} require-package-name@2.0.1: - resolution: - { - integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==, - } + resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} resolve-pkg-maps@1.0.0: - resolution: - { - integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, - } + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve@1.22.10: - resolution: - { - integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: - resolution: - { - integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, - } + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true restore-cursor@5.1.0: - resolution: - { - integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} reusify@1.1.0: - resolution: - { - integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: - resolution: - { - integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, - } + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rollup-plugin-preserve-directives@0.4.0: - resolution: - { - integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==, - } + resolution: {integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==} peerDependencies: rollup: 2.x || 3.x || 4.x rollup-plugin-visualizer@6.0.3: - resolution: - { - integrity: sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==} + engines: {node: '>=18'} hasBin: true peerDependencies: rolldown: 1.x || ^1.0.0-beta @@ -9655,939 +6404,571 @@ packages: optional: true rollup@4.34.8: - resolution: - { - integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==, - } - engines: { node: ">=18.0.0", npm: ">=8.0.0" } + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rollup@4.44.2: - resolution: - { - integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==, - } - engines: { node: ">=18.0.0", npm: ">=8.0.0" } + resolution: {integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rrweb-cssom@0.8.0: - resolution: - { - integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==, - } + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} rxjs@7.8.2: - resolution: - { - integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, - } + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} sade@1.8.1: - resolution: - { - integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} safe-array-concat@1.1.3: - resolution: - { - integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==, - } - engines: { node: ">=0.4" } + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safe-push-apply@1.0.0: - resolution: - { - integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} safe-regex-test@1.1.0: - resolution: - { - integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} safe-stable-stringify@2.5.0: - resolution: - { - integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} saxes@6.0.0: - resolution: - { - integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, - } - engines: { node: ">=v12.22.7" } + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} scheduler@0.26.0: - resolution: - { - integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==, - } + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} scule@1.3.0: - resolution: - { - integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==, - } + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} semver@5.7.2: - resolution: - { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, - } + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} hasBin: true semver@7.7.1: - resolution: - { - integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} hasBin: true semver@7.7.2: - resolution: - { - integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} hasBin: true send@0.19.0: - resolution: - { - integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} send@1.2.0: - resolution: - { - integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} serialize-javascript@6.0.2: - resolution: - { - integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, - } + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + seroval-plugins@1.3.2: + resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.3.2: + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + engines: {node: '>=10'} serve-placeholder@2.0.2: - resolution: - { - integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==, - } + resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} serve-static@1.16.2: - resolution: - { - integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} serve-static@2.2.0: - resolution: - { - integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} set-function-length@1.2.2: - resolution: - { - integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} set-function-name@2.0.2: - resolution: - { - integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} set-proto@1.0.0: - resolution: - { - integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} shebang-command@1.2.0: - resolution: - { - integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@1.0.0: - resolution: - { - integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} shell-quote@1.8.3: - resolution: - { - integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} shelljs@0.9.2: - resolution: - { - integrity: sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==} + engines: {node: '>=18'} hasBin: true shx@0.4.0: - resolution: - { - integrity: sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==} + engines: {node: '>=18'} hasBin: true side-channel-list@1.0.0: - resolution: - { - integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} side-channel-map@1.0.1: - resolution: - { - integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} side-channel-weakmap@1.0.2: - resolution: - { - integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} side-channel@1.1.0: - resolution: - { - integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} siginfo@2.0.0: - resolution: - { - integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, - } + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} simple-git@3.28.0: - resolution: - { - integrity: sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==, - } + resolution: {integrity: sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==} simple-swizzle@0.2.2: - resolution: - { - integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, - } + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} slash@5.1.0: - resolution: - { - integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==, - } - engines: { node: ">=14.16" } + 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" } + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} slice-ansi@7.1.0: - resolution: - { - integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} smob@1.5.0: - resolution: - { - integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==, - } + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + + solid-js@1.9.7: + resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} + + solid-presence@0.1.8: + resolution: {integrity: sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA==} + peerDependencies: + solid-js: ^1.8 + + solid-prevent-scroll@0.1.10: + resolution: {integrity: sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw==} + peerDependencies: + solid-js: ^1.8 + + solid-refresh@0.6.3: + resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} + peerDependencies: + solid-js: ^1.3 + + solid-transition-group@0.2.3: + resolution: {integrity: sha512-iB72c9N5Kz9ykRqIXl0lQohOau4t0dhel9kjwFvx81UZJbVwaChMuBuyhiZmK24b8aKEK0w3uFM96ZxzcyZGdg==} + engines: {node: '>=18.0.0', pnpm: '>=8.6.0'} + peerDependencies: + solid-js: ^1.6.12 sorted-btree@1.8.1: - resolution: - { - integrity: sha512-395+XIP+wqNn3USkFSrNz7G3Ss/MXlZEqesxvzCRFwL14h6e8LukDHdLBePn5pwbm5OQ9vGu8mDyz2lLDIqamQ==, - } + resolution: {integrity: sha512-395+XIP+wqNn3USkFSrNz7G3Ss/MXlZEqesxvzCRFwL14h6e8LukDHdLBePn5pwbm5OQ9vGu8mDyz2lLDIqamQ==} source-map-js@1.2.1: - resolution: - { - integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} source-map@0.7.4: - resolution: - { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} source-map@0.8.0-beta.0: - resolution: - { - integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} spawndamnit@3.0.1: - resolution: - { - integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==, - } + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} spdx-correct@3.2.0: - resolution: - { - integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, - } + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} spdx-exceptions@2.5.0: - resolution: - { - integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, - } + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@3.0.1: - resolution: - { - integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, - } + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} spdx-license-ids@3.0.21: - resolution: - { - integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==, - } + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} split2@4.2.0: - resolution: - { - integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, - } - engines: { node: ">= 10.x" } + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} stable-hash-x@0.2.0: - resolution: - { - integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} stack-trace@0.0.10: - resolution: - { - integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==, - } + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} stackback@0.0.2: - resolution: - { - integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, - } + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} standard-as-callback@2.1.0: - resolution: - { - integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==, - } + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} statuses@2.0.1: - resolution: - { - integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} std-env@3.9.0: - resolution: - { - integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==, - } + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} streamx@2.22.1: - resolution: - { - integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==, - } + 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" } + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} string-width@7.2.0: - resolution: - { - integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} string.prototype.matchall@4.0.12: - resolution: - { - integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: - resolution: - { - integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, - } + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} string.prototype.trim@1.2.10: - resolution: - { - integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} string.prototype.trimend@1.0.9: - resolution: - { - integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: - resolution: - { - integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} strip-bom@3.0.0: - resolution: - { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} strip-eof@1.0.0: - resolution: - { - integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} strip-final-newline@3.0.0: - resolution: - { - integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} strip-indent@3.0.0: - resolution: - { - integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} strip-literal@3.0.0: - resolution: - { - integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==, - } + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} sucrase@3.35.0: - resolution: - { - integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} + supports-color@10.0.0: - resolution: - { - integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} + engines: {node: '>=18'} supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-color@8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} symbol-tree@3.2.4: - resolution: - { - integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, - } + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} synckit@0.11.8: - resolution: - { - integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + engines: {node: ^14.18.0 || >=16.0.0} system-architecture@0.1.0: - resolution: - { - integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} + engines: {node: '>=18'} tailwindcss@4.1.11: - resolution: - { - integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==, - } + resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} tapable@2.2.2: - resolution: - { - integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} tar-stream@3.1.7: - resolution: - { - integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==, - } + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} tar@7.4.3: - resolution: - { - integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} term-size@2.2.1: - resolution: - { - integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} terser@5.43.1: - resolution: - { - integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + engines: {node: '>=10'} hasBin: true test-exclude@7.0.1: - resolution: - { - integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} text-decoder@1.2.3: - resolution: - { - integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==, - } + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} text-extensions@2.4.0: - resolution: - { - integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} text-hex@1.0.0: - resolution: - { - integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==, - } + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} thenify-all@1.6.0: - resolution: - { - integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, - } - engines: { node: ">=0.8" } + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} thenify@3.3.1: - resolution: - { - integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, - } + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} through@2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} tiny-invariant@1.3.3: - resolution: - { - integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==, - } + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} tiny-warning@1.0.3: - resolution: - { - integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==, - } + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} tinybench@2.9.0: - resolution: - { - integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, - } + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@0.3.2: - resolution: - { - integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, - } + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} tinyglobby@0.2.12: - resolution: - { - integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} tinyglobby@0.2.14: - resolution: - { - integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} tinypool@1.1.1: - resolution: - { - integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==, - } - engines: { node: ^18.0.0 || >=20.0.0 } + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: - resolution: - { - integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} tinyspy@4.0.3: - resolution: - { - integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} tldts-core@6.1.78: - resolution: - { - integrity: sha512-jS0svNsB99jR6AJBmfmEWuKIgz91Haya91Z43PATaeHJ24BkMoNRb/jlaD37VYjb0mYf6gRL/HOnvS1zEnYBiw==, - } + resolution: {integrity: sha512-jS0svNsB99jR6AJBmfmEWuKIgz91Haya91Z43PATaeHJ24BkMoNRb/jlaD37VYjb0mYf6gRL/HOnvS1zEnYBiw==} tldts@6.1.78: - resolution: - { - integrity: sha512-fSgYrW0ITH0SR/CqKMXIruYIPpNu5aDgUp22UhYoSrnUQwc7SBqifEBFNce7AAcygUPBo6a/gbtcguWdmko4RQ==, - } + resolution: {integrity: sha512-fSgYrW0ITH0SR/CqKMXIruYIPpNu5aDgUp22UhYoSrnUQwc7SBqifEBFNce7AAcygUPBo6a/gbtcguWdmko4RQ==} hasBin: true tmp-promise@3.0.3: - resolution: - { - integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==, - } + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} tmp@0.0.33: - resolution: - { - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, - } - engines: { node: ">=0.6.0" } + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} tmp@0.2.3: - resolution: - { - integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==, - } - engines: { node: ">=14.14" } + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: ">=0.6" } + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} toml@3.0.0: - resolution: - { - integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==, - } + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} tough-cookie@5.1.1: - resolution: - { - integrity: sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA==} + engines: {node: '>=16'} tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} tr46@1.0.1: - resolution: - { - integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, - } + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} tr46@5.0.0: - resolution: - { - integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} tree-kill@1.2.2: - resolution: - { - integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, - } + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true triple-beam@1.4.1: - resolution: - { - integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==, - } - engines: { node: ">= 14.0.0" } + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} ts-api-utils@2.1.0: - resolution: - { - integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==, - } - engines: { node: ">=18.12" } + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: ">=4.8.4" + typescript: '>=4.8.4' ts-declaration-location@1.0.7: - resolution: - { - integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==, - } + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} peerDependencies: - typescript: ">=4.0.0" + typescript: '>=4.0.0' ts-interface-checker@0.1.13: - resolution: - { - integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, - } + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} tsconfck@3.1.6: - resolution: - { - integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==, - } - engines: { node: ^18 || >=20 } + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} hasBin: true peerDependencies: typescript: ^5.0.0 @@ -10596,27 +6977,26 @@ packages: optional: true tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsup-preset-solid@2.2.0: + resolution: {integrity: sha512-sPAzeArmYkVAZNRN+m4tkiojdd0GzW/lCwd4+TQDKMENe8wr2uAuro1s0Z59ASmdBbkXoxLgCiNcuQMyiidMZg==} + peerDependencies: + tsup: ^8.0.0 tsup@8.5.0: - resolution: - { - integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + engines: {node: '>=18'} hasBin: true peerDependencies: - "@microsoft/api-extractor": ^7.36.0 - "@swc/core": ^1 + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 postcss: ^8.4.12 - typescript: ">=4.5.0" + typescript: '>=4.5.0' peerDependenciesMeta: - "@microsoft/api-extractor": + '@microsoft/api-extractor': optional: true - "@swc/core": + '@swc/core': optional: true postcss: optional: true @@ -10624,317 +7004,211 @@ packages: optional: true tsx@4.20.3: - resolution: - { - integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==, - } - engines: { node: ">=18.0.0" } + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} + engines: {node: '>=18.0.0'} hasBin: true type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} type-fest@4.41.0: - resolution: - { - integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} type-is@1.6.18: - resolution: - { - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, - } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} typed-array-buffer@1.0.3: - resolution: - { - integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} typed-array-byte-length@1.0.3: - resolution: - { - integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} typed-array-byte-offset@1.0.4: - resolution: - { - integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} typed-array-length@1.0.7: - resolution: - { - integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} typedoc-plugin-frontmatter@1.2.1: - resolution: - { - integrity: sha512-TKiOOQCxC1uUYldokAegap2oAtDy9QpsUoVDRohcB6Dm45T91qMgkWqHVS8qbCpDc4SJoGqmGTULGfrqeRqXtA==, - } + resolution: {integrity: sha512-TKiOOQCxC1uUYldokAegap2oAtDy9QpsUoVDRohcB6Dm45T91qMgkWqHVS8qbCpDc4SJoGqmGTULGfrqeRqXtA==} peerDependencies: - typedoc-plugin-markdown: ">=4.4.2" + typedoc-plugin-markdown: '>=4.4.2' typedoc-plugin-markdown@4.4.2: - resolution: - { - integrity: sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg==} + engines: {node: '>= 18'} peerDependencies: typedoc: 0.27.x typedoc@0.27.9: - resolution: - { - integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==} + engines: {node: '>= 18'} hasBin: true 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.36.0: - resolution: - { - integrity: sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: '>=4.8.4 <5.9.0' typescript@5.4.2: - resolution: - { - integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==, - } - engines: { node: ">=14.17" } + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} hasBin: true typescript@5.8.2: - resolution: - { - integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==, - } - engines: { node: ">=14.17" } + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} hasBin: true typescript@5.8.3: - resolution: - { - integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==, - } - engines: { node: ">=14.17" } + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} hasBin: true uc.micro@2.1.0: - resolution: - { - integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==, - } + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} ufo@1.6.1: - resolution: - { - integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==, - } + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} ultrahtml@1.6.0: - resolution: - { - integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==, - } + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} unbox-primitive@1.1.0: - resolution: - { - integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} uncrypto@0.1.3: - resolution: - { - integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, - } + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} unctx@2.4.1: - resolution: - { - integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==, - } + resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==} undici-types@6.21.0: - resolution: - { - integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, - } + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} undici-types@7.8.0: - resolution: - { - integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==, - } + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} undici@7.11.0: - resolution: - { - integrity: sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==, - } - engines: { node: ">=20.18.1" } + resolution: {integrity: sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==} + engines: {node: '>=20.18.1'} unenv@1.10.0: - resolution: - { - integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==, - } + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} unenv@2.0.0-rc.18: - resolution: - { - integrity: sha512-O0oVQVJ2X3Q8H4HITJr4e2cWxMYBeZ+p8S25yoKCxVCgDWtIJDcgwWNonYz12tI3ylVQCRyPV/Bdq0KJeXo7AA==, - } + resolution: {integrity: sha512-O0oVQVJ2X3Q8H4HITJr4e2cWxMYBeZ+p8S25yoKCxVCgDWtIJDcgwWNonYz12tI3ylVQCRyPV/Bdq0KJeXo7AA==} unicorn-magic@0.1.0: - resolution: - { - integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} unicorn-magic@0.3.0: - resolution: - { - integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} unimport@5.1.0: - resolution: - { - integrity: sha512-wMmuG+wkzeHh2KCE6yiDlHmKelN8iE/maxkUYMbmrS6iV8+n6eP1TH3yKKlepuF4hrkepinEGmBXdfo9XZUvAw==, - } - engines: { node: ">=18.12.0" } + resolution: {integrity: sha512-wMmuG+wkzeHh2KCE6yiDlHmKelN8iE/maxkUYMbmrS6iV8+n6eP1TH3yKKlepuF4hrkepinEGmBXdfo9XZUvAw==} + engines: {node: '>=18.12.0'} universalify@0.1.2: - resolution: - { - integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, - } - engines: { node: ">= 4.0.0" } + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} unixify@1.0.0: - resolution: - { - integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} + engines: {node: '>=0.10.0'} unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} unplugin-utils@0.2.4: - resolution: - { - integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==, - } - engines: { node: ">=18.12.0" } + resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} + engines: {node: '>=18.12.0'} unplugin@1.16.1: - resolution: - { - integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} unplugin@2.3.5: - resolution: - { - integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==, - } - engines: { node: ">=18.12.0" } + resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} + engines: {node: '>=18.12.0'} unrs-resolver@1.11.0: - resolution: - { - integrity: sha512-uw3hCGO/RdAEAb4zgJ3C/v6KIAFFOtBoxR86b2Ejc5TnH7HrhTWJR2o0A9ullC3eWMegKQCw/arQ/JivywQzkg==, - } + resolution: {integrity: sha512-uw3hCGO/RdAEAb4zgJ3C/v6KIAFFOtBoxR86b2Ejc5TnH7HrhTWJR2o0A9ullC3eWMegKQCw/arQ/JivywQzkg==} unstorage@1.16.0: - resolution: - { - integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==, - } + resolution: {integrity: sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA==} 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 - "@planetscale/database": ^1.19.0 - "@upstash/redis": ^1.34.3 - "@vercel/blob": ">=0.27.1" - "@vercel/kv": ^1.0.1 + '@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 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/kv': ^1.0.1 aws4fetch: ^1.0.20 - db0: ">=0.2.1" + db0: '>=0.2.1' idb-keyval: ^6.2.1 ioredis: ^5.4.2 uploadthing: ^7.4.4 peerDependenciesMeta: - "@azure/app-configuration": + '@azure/app-configuration': optional: true - "@azure/cosmos": + '@azure/cosmos': optional: true - "@azure/data-tables": + '@azure/data-tables': optional: true - "@azure/identity": + '@azure/identity': optional: true - "@azure/keyvault-secrets": + '@azure/keyvault-secrets': optional: true - "@azure/storage-blob": + '@azure/storage-blob': optional: true - "@capacitor/preferences": + '@capacitor/preferences': optional: true - "@deno/kv": + '@deno/kv': optional: true - "@netlify/blobs": + '@netlify/blobs': optional: true - "@planetscale/database": + '@planetscale/database': optional: true - "@upstash/redis": + '@upstash/redis': optional: true - "@vercel/blob": + '@vercel/blob': optional: true - "@vercel/kv": + '@vercel/kv': optional: true aws4fetch: optional: true @@ -10948,160 +7222,161 @@ packages: optional: true untun@0.1.3: - resolution: - { - integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==, - } + resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} hasBin: true untyped@2.0.0: - resolution: - { - integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==, - } + resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} hasBin: true unwasm@0.3.9: - resolution: - { - integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==, - } + resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} update-browserslist-db@1.1.3: - resolution: - { - integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, - } + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: - browserslist: ">= 4.21.0" + browserslist: '>= 4.21.0' uqr@0.1.2: - resolution: - { - integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==, - } + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} urlpattern-polyfill@10.1.0: - resolution: - { - integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==, - } + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} urlpattern-polyfill@8.0.2: - resolution: - { - integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==, - } + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} use-sync-external-store@1.5.0: - resolution: - { - integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==, - } + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} utils-merge@1.0.1: - resolution: - { - integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, - } - engines: { node: ">= 0.4.0" } + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} uuid@11.1.0: - resolution: - { - integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==, - } + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true + validate-html-nesting@1.2.3: + resolution: {integrity: sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==} + validate-npm-package-license@3.0.4: - resolution: - { - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, - } + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} vary@1.1.2: - resolution: - { - integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, - } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true vite-node@3.2.4: - resolution: - { - integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true vite-plugin-dts@4.2.3: - resolution: - { - integrity: sha512-O5NalzHANQRwVw1xj8KQun3Bv8OSDAlNJXrnqoAz10BOuW8FVvY5g4ygj+DlJZL5mtSPuMu9vd3OfrdW5d4k6w==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-O5NalzHANQRwVw1xj8KQun3Bv8OSDAlNJXrnqoAz10BOuW8FVvY5g4ygj+DlJZL5mtSPuMu9vd3OfrdW5d4k6w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite-plugin-dts@4.5.4: + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} peerDependencies: - typescript: "*" - vite: "*" + typescript: '*' + vite: '*' peerDependenciesMeta: vite: optional: true vite-plugin-externalize-deps@0.9.0: - resolution: - { - integrity: sha512-wg3qb5gCy2d1KpPKyD9wkXMcYJ84yjgziHrStq9/8R7chhUC73mhQz+tVtvhFiICQHsBn1pnkY4IBbPqF9JHNw==, - } + resolution: {integrity: sha512-wg3qb5gCy2d1KpPKyD9wkXMcYJ84yjgziHrStq9/8R7chhUC73mhQz+tVtvhFiICQHsBn1pnkY4IBbPqF9JHNw==} peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite-plugin-solid@2.11.7: + resolution: {integrity: sha512-5TgK1RnE449g0Ryxb9BXqem89RSy7fE8XGVCo+Gw84IHgPuPVP7nYNP6WBVAaY/0xw+OqfdQee+kusL0y3XYNg==} + peerDependencies: + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: ^1.7.2 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + vite-tsconfig-paths@5.1.4: - resolution: - { - integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==, - } + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: - vite: "*" + vite: '*' peerDependenciesMeta: vite: optional: true + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@6.3.5: - resolution: - { - integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + 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: "*" + '@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: "*" + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - "@types/node": + '@types/node': optional: true jiti: optional: true @@ -11125,26 +7400,23 @@ packages: optional: true vite@7.0.3: - resolution: - { - integrity: sha512-y2L5oJZF7bj4c0jgGYgBNSdIu+5HF+m68rn2cQXFbGoShdhV1phX9rbnxy9YXj82aS8MMsCLAAFkRxZeWdldrQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-y2L5oJZF7bj4c0jgGYgBNSdIu+5HF+m68rn2cQXFbGoShdhV1phX9rbnxy9YXj82aS8MMsCLAAFkRxZeWdldrQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - "@types/node": ^20.19.0 || >=22.12.0 - jiti: ">=1.21.0" + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' less: ^4.0.0 lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 - stylus: ">=0.54.8" + stylus: '>=0.54.8' sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - "@types/node": + '@types/node': optional: true jiti: optional: true @@ -11167,31 +7439,61 @@ packages: yaml: optional: true + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@3.2.4: - resolution: - { - integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - "@edge-runtime/vm": "*" - "@types/debug": ^4.1.12 - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - "@vitest/browser": 3.2.4 - "@vitest/ui": 3.2.4 - happy-dom: "*" - jsdom: "*" + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' peerDependenciesMeta: - "@edge-runtime/vm": + '@edge-runtime/vm': optional: true - "@types/debug": + '@types/debug': optional: true - "@types/node": + '@types/node': optional: true - "@vitest/browser": + '@vitest/browser': optional: true - "@vitest/ui": + '@vitest/ui': optional: true happy-dom: optional: true @@ -11199,233 +7501,137 @@ packages: optional: true vscode-uri@3.1.0: - resolution: - { - integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==, - } + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} vue-eslint-parser@9.4.3: - resolution: - { - integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==, - } - engines: { node: ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ">=6.0.0" + eslint: '>=6.0.0' vue@3.5.17: - resolution: - { - integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==, - } + resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} peerDependencies: - typescript: "*" + typescript: '*' peerDependenciesMeta: typescript: optional: true w3c-xmlserializer@5.0.0: - resolution: - { - integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} web-streams-polyfill@3.3.3: - resolution: - { - integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} webidl-conversions@4.0.2: - resolution: - { - integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, - } + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} webidl-conversions@7.0.0: - resolution: - { - integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} webpack-virtual-modules@0.6.2: - resolution: - { - integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==, - } + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} whatwg-encoding@3.1.1: - resolution: - { - integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} whatwg-mimetype@3.0.0: - resolution: - { - integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} whatwg-mimetype@4.0.0: - resolution: - { - integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} whatwg-url@14.1.1: - resolution: - { - integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==} + engines: {node: '>=18'} whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} whatwg-url@7.1.0: - resolution: - { - integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, - } + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} which-boxed-primitive@1.1.1: - resolution: - { - integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} which-builtin-type@1.2.1: - resolution: - { - integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} which-collection@1.0.2: - resolution: - { - integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-typed-array@1.1.18: - resolution: - { - integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==, - } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} which@1.3.1: - resolution: - { - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, - } + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true which@4.0.0: - resolution: - { - integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, - } - engines: { node: ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} hasBin: true why-is-node-running@2.3.0: - resolution: - { - integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} hasBin: true winston-transport@4.9.0: - resolution: - { - integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} winston@3.17.0: - resolution: - { - integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==, - } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + engines: {node: '>= 12.0.0'} word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} wrap-ansi@9.0.0: - resolution: - { - integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} write-file-atomic@6.0.0: - resolution: - { - integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==, - } - engines: { node: ^18.17.0 || >=20.5.0 } + resolution: {integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==} + engines: {node: ^18.17.0 || >=20.5.0} ws@8.18.0: - resolution: - { - integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==, - } - engines: { node: ">=10.0.0" } + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true @@ -11433,168 +7639,115 @@ packages: optional: true xml-name-validator@5.0.0: - resolution: - { - integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} xmlbuilder2@3.1.1: - resolution: - { - integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==, - } - engines: { node: ">=12.0" } + resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} + engines: {node: '>=12.0'} xmlchars@2.2.0: - resolution: - { - integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, - } + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: ">=0.4" } + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} yallist@5.0.0: - resolution: - { - integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} yaml@2.8.0: - resolution: - { - integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==, - } - engines: { node: ">= 14.6" } + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} yargs@17.7.2: - resolution: - { - integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} yauzl@2.10.0: - resolution: - { - integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==, - } + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} yocto-queue@1.2.1: - resolution: - { - integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==, - } - engines: { node: ">=12.20" } + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} youch-core@0.3.3: - resolution: - { - integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==, - } + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} youch@4.1.0-beta.8: - resolution: - { - integrity: sha512-rY2A2lSF7zC+l7HH9Mq+83D1dLlsPnEvy8jTouzaptDZM6geqZ3aJe/b7ULCwRURPtWV3vbDjA2DDMdoBol0HQ==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-rY2A2lSF7zC+l7HH9Mq+83D1dLlsPnEvy8jTouzaptDZM6geqZ3aJe/b7ULCwRURPtWV3vbDjA2DDMdoBol0HQ==} + engines: {node: '>=18'} zip-stream@6.0.1: - resolution: - { - integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} zod@3.25.76: - resolution: - { - integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==, - } + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: - "@adobe/css-tools@4.4.2": {} - "@ampproject/remapping@2.3.0": + '@adobe/css-tools@4.4.2': {} + + '@ampproject/remapping@2.3.0': dependencies: - "@jridgewell/gen-mapping": 0.3.12 - "@jridgewell/trace-mapping": 0.3.29 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 - "@asamuzakjp/css-color@2.8.3": + '@asamuzakjp/css-color@2.8.3': dependencies: - "@csstools/css-calc": 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - "@csstools/css-color-parser": 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) - "@csstools/css-tokenizer": 3.0.3 + '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-color-parser': 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 lru-cache: 10.4.3 - "@babel/code-frame@7.26.2": + '@babel/code-frame@7.26.2': dependencies: - "@babel/helper-validator-identifier": 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - "@babel/code-frame@7.27.1": + '@babel/code-frame@7.27.1': dependencies: - "@babel/helper-validator-identifier": 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - "@babel/compat-data@7.28.0": {} + '@babel/compat-data@7.28.0': {} - "@babel/core@7.28.0": + '@babel/core@7.28.0': dependencies: - "@ampproject/remapping": 2.3.0 - "@babel/code-frame": 7.27.1 - "@babel/generator": 7.28.0 - "@babel/helper-compilation-targets": 7.27.2 - "@babel/helper-module-transforms": 7.27.3(@babel/core@7.28.0) - "@babel/helpers": 7.27.6 - "@babel/parser": 7.28.0 - "@babel/template": 7.27.2 - "@babel/traverse": 7.28.0 - "@babel/types": 7.28.0 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -11603,201 +7756,205 @@ snapshots: transitivePeerDependencies: - supports-color - "@babel/generator@7.28.0": + '@babel/generator@7.28.0': dependencies: - "@babel/parser": 7.28.0 - "@babel/types": 7.28.0 - "@jridgewell/gen-mapping": 0.3.12 - "@jridgewell/trace-mapping": 0.3.29 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 - "@babel/helper-annotate-as-pure@7.27.3": + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - "@babel/types": 7.28.0 + '@babel/types': 7.28.0 - "@babel/helper-compilation-targets@7.27.2": + '@babel/helper-compilation-targets@7.27.2': dependencies: - "@babel/compat-data": 7.28.0 - "@babel/helper-validator-option": 7.27.1 + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 browserslist: 4.25.1 lru-cache: 5.1.1 semver: 6.3.1 - "@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)": + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': dependencies: - "@babel/core": 7.28.0 - "@babel/helper-annotate-as-pure": 7.27.3 - "@babel/helper-member-expression-to-functions": 7.27.1 - "@babel/helper-optimise-call-expression": 7.27.1 - "@babel/helper-replace-supers": 7.27.1(@babel/core@7.28.0) - "@babel/helper-skip-transparent-expression-wrappers": 7.27.1 - "@babel/traverse": 7.28.0 + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - "@babel/helper-globals@7.28.0": {} + '@babel/helper-globals@7.28.0': {} - "@babel/helper-member-expression-to-functions@7.27.1": + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - "@babel/traverse": 7.28.0 - "@babel/types": 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color - "@babel/helper-module-imports@7.27.1": + '@babel/helper-module-imports@7.18.6': + dependencies: + '@babel/types': 7.28.0 + + '@babel/helper-module-imports@7.27.1': dependencies: - "@babel/traverse": 7.28.0 - "@babel/types": 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color - "@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)": + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: - "@babel/core": 7.28.0 - "@babel/helper-module-imports": 7.27.1 - "@babel/helper-validator-identifier": 7.27.1 - "@babel/traverse": 7.28.0 + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - "@babel/helper-optimise-call-expression@7.27.1": + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - "@babel/types": 7.28.0 + '@babel/types': 7.28.0 - "@babel/helper-plugin-utils@7.27.1": {} + '@babel/helper-plugin-utils@7.27.1': {} - "@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)": + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': dependencies: - "@babel/core": 7.28.0 - "@babel/helper-member-expression-to-functions": 7.27.1 - "@babel/helper-optimise-call-expression": 7.27.1 - "@babel/traverse": 7.28.0 + '@babel/core': 7.28.0 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - "@babel/helper-skip-transparent-expression-wrappers@7.27.1": + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - "@babel/traverse": 7.28.0 - "@babel/types": 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color - "@babel/helper-string-parser@7.25.9": {} + '@babel/helper-string-parser@7.25.9': {} - "@babel/helper-string-parser@7.27.1": {} + '@babel/helper-string-parser@7.27.1': {} - "@babel/helper-validator-identifier@7.25.9": {} + '@babel/helper-validator-identifier@7.25.9': {} - "@babel/helper-validator-identifier@7.27.1": {} + '@babel/helper-validator-identifier@7.27.1': {} - "@babel/helper-validator-option@7.27.1": {} + '@babel/helper-validator-option@7.27.1': {} - "@babel/helpers@7.27.6": + '@babel/helpers@7.27.6': dependencies: - "@babel/template": 7.27.2 - "@babel/types": 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.0 - "@babel/parser@7.26.10": + '@babel/parser@7.26.10': dependencies: - "@babel/types": 7.26.10 + '@babel/types': 7.26.10 - "@babel/parser@7.28.0": + '@babel/parser@7.28.0': dependencies: - "@babel/types": 7.28.0 + '@babel/types': 7.28.0 - "@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)": + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': dependencies: - "@babel/core": 7.28.0 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)": + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': dependencies: - "@babel/core": 7.28.0 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)": + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': dependencies: - "@babel/core": 7.28.0 - "@babel/helper-module-transforms": 7.27.3(@babel/core@7.28.0) - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.0 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - "@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)": + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': dependencies: - "@babel/core": 7.28.0 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)": + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': dependencies: - "@babel/core": 7.28.0 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)": + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)': dependencies: - "@babel/core": 7.28.0 - "@babel/helper-annotate-as-pure": 7.27.3 - "@babel/helper-create-class-features-plugin": 7.27.1(@babel/core@7.28.0) - "@babel/helper-plugin-utils": 7.27.1 - "@babel/helper-skip-transparent-expression-wrappers": 7.27.1 - "@babel/plugin-syntax-typescript": 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) transitivePeerDependencies: - supports-color - "@babel/preset-typescript@7.27.1(@babel/core@7.28.0)": + '@babel/preset-typescript@7.27.1(@babel/core@7.28.0)': dependencies: - "@babel/core": 7.28.0 - "@babel/helper-plugin-utils": 7.27.1 - "@babel/helper-validator-option": 7.27.1 - "@babel/plugin-syntax-jsx": 7.27.1(@babel/core@7.28.0) - "@babel/plugin-transform-modules-commonjs": 7.27.1(@babel/core@7.28.0) - "@babel/plugin-transform-typescript": 7.28.0(@babel/core@7.28.0) + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) transitivePeerDependencies: - supports-color - "@babel/runtime@7.26.10": + '@babel/runtime@7.26.10': dependencies: regenerator-runtime: 0.14.1 - "@babel/runtime@7.27.6": {} + '@babel/runtime@7.27.6': {} - "@babel/template@7.27.2": + '@babel/template@7.27.2': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/parser": 7.28.0 - "@babel/types": 7.28.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 - "@babel/traverse@7.28.0": + '@babel/traverse@7.28.0': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/generator": 7.28.0 - "@babel/helper-globals": 7.28.0 - "@babel/parser": 7.28.0 - "@babel/template": 7.27.2 - "@babel/types": 7.28.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.0 debug: 4.4.1 transitivePeerDependencies: - supports-color - "@babel/types@7.26.10": + '@babel/types@7.26.10': dependencies: - "@babel/helper-string-parser": 7.25.9 - "@babel/helper-validator-identifier": 7.25.9 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - "@babel/types@7.28.0": + '@babel/types@7.28.0': dependencies: - "@babel/helper-string-parser": 7.27.1 - "@babel/helper-validator-identifier": 7.27.1 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 - "@changesets/apply-release-plan@7.0.12": + '@changesets/apply-release-plan@7.0.12': dependencies: - "@changesets/config": 3.1.1 - "@changesets/get-version-range-type": 0.4.0 - "@changesets/git": 3.0.4 - "@changesets/should-skip-package": 0.1.2 - "@changesets/types": 6.1.0 - "@manypkg/get-packages": 1.1.3 + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 lodash.startcase: 4.4.0 @@ -11806,36 +7963,36 @@ snapshots: resolve-from: 5.0.0 semver: 7.7.1 - "@changesets/assemble-release-plan@6.0.9": + '@changesets/assemble-release-plan@6.0.9': dependencies: - "@changesets/errors": 0.2.0 - "@changesets/get-dependents-graph": 2.1.3 - "@changesets/should-skip-package": 0.1.2 - "@changesets/types": 6.1.0 - "@manypkg/get-packages": 1.1.3 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 semver: 7.7.1 - "@changesets/changelog-git@0.2.1": - dependencies: - "@changesets/types": 6.1.0 - - "@changesets/cli@2.29.5": - dependencies: - "@changesets/apply-release-plan": 7.0.12 - "@changesets/assemble-release-plan": 6.0.9 - "@changesets/changelog-git": 0.2.1 - "@changesets/config": 3.1.1 - "@changesets/errors": 0.2.0 - "@changesets/get-dependents-graph": 2.1.3 - "@changesets/get-release-plan": 4.0.13 - "@changesets/git": 3.0.4 - "@changesets/logger": 0.1.1 - "@changesets/pre": 2.0.2 - "@changesets/read": 0.6.5 - "@changesets/should-skip-package": 0.1.2 - "@changesets/types": 6.1.0 - "@changesets/write": 0.4.0 - "@manypkg/get-packages": 1.1.3 + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.5': + dependencies: + '@changesets/apply-release-plan': 7.0.12 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 enquirer: 2.4.1 @@ -11850,650 +8007,724 @@ snapshots: spawndamnit: 3.0.1 term-size: 2.2.1 - "@changesets/config@3.1.1": + '@changesets/config@3.1.1': dependencies: - "@changesets/errors": 0.2.0 - "@changesets/get-dependents-graph": 2.1.3 - "@changesets/logger": 0.1.1 - "@changesets/types": 6.1.0 - "@manypkg/get-packages": 1.1.3 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.8 - "@changesets/errors@0.2.0": + '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - "@changesets/get-dependents-graph@2.1.3": + '@changesets/get-dependents-graph@2.1.3': dependencies: - "@changesets/types": 6.1.0 - "@manypkg/get-packages": 1.1.3 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 semver: 7.7.1 - "@changesets/get-github-info@0.6.0": + '@changesets/get-github-info@0.6.0': dependencies: dataloader: 1.4.0 node-fetch: 2.7.0 transitivePeerDependencies: - encoding - "@changesets/get-release-plan@4.0.13": + '@changesets/get-release-plan@4.0.13': dependencies: - "@changesets/assemble-release-plan": 6.0.9 - "@changesets/config": 3.1.1 - "@changesets/pre": 2.0.2 - "@changesets/read": 0.6.5 - "@changesets/types": 6.1.0 - "@manypkg/get-packages": 1.1.3 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 - "@changesets/get-version-range-type@0.4.0": {} + '@changesets/get-version-range-type@0.4.0': {} - "@changesets/git@3.0.4": + '@changesets/git@3.0.4': dependencies: - "@changesets/errors": 0.2.0 - "@manypkg/get-packages": 1.1.3 + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 micromatch: 4.0.8 spawndamnit: 3.0.1 - "@changesets/logger@0.1.1": + '@changesets/logger@0.1.1': dependencies: picocolors: 1.1.1 - "@changesets/parse@0.4.1": + '@changesets/parse@0.4.1': dependencies: - "@changesets/types": 6.1.0 + '@changesets/types': 6.1.0 js-yaml: 3.14.1 - "@changesets/pre@2.0.2": + '@changesets/pre@2.0.2': dependencies: - "@changesets/errors": 0.2.0 - "@changesets/types": 6.1.0 - "@manypkg/get-packages": 1.1.3 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - "@changesets/read@0.6.5": + '@changesets/read@0.6.5': dependencies: - "@changesets/git": 3.0.4 - "@changesets/logger": 0.1.1 - "@changesets/parse": 0.4.1 - "@changesets/types": 6.1.0 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 picocolors: 1.1.1 - "@changesets/should-skip-package@0.1.2": + '@changesets/should-skip-package@0.1.2': dependencies: - "@changesets/types": 6.1.0 - "@manypkg/get-packages": 1.1.3 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 - "@changesets/types@4.1.0": {} + '@changesets/types@4.1.0': {} - "@changesets/types@6.1.0": {} + '@changesets/types@6.1.0': {} - "@changesets/write@0.4.0": + '@changesets/write@0.4.0': dependencies: - "@changesets/types": 6.1.0 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 human-id: 4.1.1 prettier: 2.8.8 - "@cloudflare/kv-asset-handler@0.4.0": + '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 - "@colors/colors@1.6.0": {} + '@colors/colors@1.6.0': {} - "@commitlint/parse@19.8.1": + '@commitlint/parse@19.8.1': dependencies: - "@commitlint/types": 19.8.1 + '@commitlint/types': 19.8.1 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - "@commitlint/types@19.8.1": + '@commitlint/types@19.8.1': dependencies: - "@types/conventional-commits-parser": 5.0.1 + '@types/conventional-commits-parser': 5.0.1 chalk: 5.4.1 - "@csstools/color-helpers@5.0.1": {} + '@corvu/utils@0.4.2(solid-js@1.9.7)': + dependencies: + '@floating-ui/dom': 1.7.2 + solid-js: 1.9.7 + + '@csstools/color-helpers@5.0.1': {} - "@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)": + '@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': dependencies: - "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) - "@csstools/css-tokenizer": 3.0.3 + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 - "@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)": + '@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': dependencies: - "@csstools/color-helpers": 5.0.1 - "@csstools/css-calc": 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - "@csstools/css-parser-algorithms": 3.0.4(@csstools/css-tokenizer@3.0.3) - "@csstools/css-tokenizer": 3.0.3 + '@csstools/color-helpers': 5.0.1 + '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 - "@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)": + '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': dependencies: - "@csstools/css-tokenizer": 3.0.3 + '@csstools/css-tokenizer': 3.0.3 - "@csstools/css-tokenizer@3.0.3": {} + '@csstools/css-tokenizer@3.0.3': {} - "@dabh/diagnostics@2.0.3": + '@dabh/diagnostics@2.0.3': dependencies: colorspace: 1.1.4 enabled: 2.0.0 kuler: 2.0.0 - "@dependents/detective-less@5.0.1": + '@dependents/detective-less@5.0.1': dependencies: gonzales-pe: 4.3.0 node-source-walk: 7.0.1 - "@drizzle-team/brocli@0.10.2": {} + '@drizzle-team/brocli@0.10.2': {} - "@electric-sql/client@1.0.0": + '@electric-sql/client@1.0.0': optionalDependencies: - "@rollup/rollup-darwin-arm64": 4.44.2 + '@rollup/rollup-darwin-arm64': 4.44.2 - "@electric-sql/d2mini@0.1.6": + '@electric-sql/d2mini@0.1.6': dependencies: fractional-indexing: 3.2.0 murmurhash-js: 1.0.0 sorted-btree: 1.8.1 - "@emnapi/core@1.4.4": + '@emnapi/core@1.4.4': dependencies: - "@emnapi/wasi-threads": 1.0.3 + '@emnapi/wasi-threads': 1.0.3 tslib: 2.8.1 optional: true - "@emnapi/runtime@1.4.4": + '@emnapi/runtime@1.4.4': dependencies: tslib: 2.8.1 optional: true - "@emnapi/wasi-threads@1.0.3": + '@emnapi/wasi-threads@1.0.3': dependencies: tslib: 2.8.1 optional: true - "@esbuild-kit/core-utils@3.3.2": + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 source-map-support: 0.5.21 - "@esbuild-kit/esm-loader@2.6.5": + '@esbuild-kit/esm-loader@2.6.5': dependencies: - "@esbuild-kit/core-utils": 3.3.2 + '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.10.1 - "@esbuild/aix-ppc64@0.19.12": + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.0': + optional: true + + '@esbuild/aix-ppc64@0.25.1': + optional: true + + '@esbuild/aix-ppc64@0.25.5': + optional: true + + '@esbuild/aix-ppc64@0.25.6': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.0': + optional: true + + '@esbuild/android-arm64@0.25.1': + optional: true + + '@esbuild/android-arm64@0.25.5': + optional: true + + '@esbuild/android-arm64@0.25.6': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.0': + optional: true + + '@esbuild/android-arm@0.25.1': + optional: true + + '@esbuild/android-arm@0.25.5': + optional: true + + '@esbuild/android-arm@0.25.6': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.0': optional: true - "@esbuild/aix-ppc64@0.25.0": + '@esbuild/android-x64@0.25.1': optional: true - "@esbuild/aix-ppc64@0.25.1": + '@esbuild/android-x64@0.25.5': optional: true - "@esbuild/aix-ppc64@0.25.5": + '@esbuild/android-x64@0.25.6': optional: true - "@esbuild/aix-ppc64@0.25.6": + '@esbuild/darwin-arm64@0.18.20': optional: true - "@esbuild/android-arm64@0.18.20": + '@esbuild/darwin-arm64@0.19.12': optional: true - "@esbuild/android-arm64@0.19.12": + '@esbuild/darwin-arm64@0.21.5': optional: true - "@esbuild/android-arm64@0.25.0": + '@esbuild/darwin-arm64@0.25.0': optional: true - "@esbuild/android-arm64@0.25.1": + '@esbuild/darwin-arm64@0.25.1': optional: true - "@esbuild/android-arm64@0.25.5": + '@esbuild/darwin-arm64@0.25.5': optional: true - "@esbuild/android-arm64@0.25.6": + '@esbuild/darwin-arm64@0.25.6': optional: true - "@esbuild/android-arm@0.18.20": + '@esbuild/darwin-x64@0.18.20': optional: true - "@esbuild/android-arm@0.19.12": + '@esbuild/darwin-x64@0.19.12': optional: true - "@esbuild/android-arm@0.25.0": + '@esbuild/darwin-x64@0.21.5': optional: true - "@esbuild/android-arm@0.25.1": + '@esbuild/darwin-x64@0.25.0': optional: true - "@esbuild/android-arm@0.25.5": + '@esbuild/darwin-x64@0.25.1': optional: true - "@esbuild/android-arm@0.25.6": + '@esbuild/darwin-x64@0.25.5': optional: true - "@esbuild/android-x64@0.18.20": + '@esbuild/darwin-x64@0.25.6': optional: true - "@esbuild/android-x64@0.19.12": + '@esbuild/freebsd-arm64@0.18.20': optional: true - "@esbuild/android-x64@0.25.0": + '@esbuild/freebsd-arm64@0.19.12': optional: true - "@esbuild/android-x64@0.25.1": + '@esbuild/freebsd-arm64@0.21.5': optional: true - "@esbuild/android-x64@0.25.5": + '@esbuild/freebsd-arm64@0.25.0': optional: true - "@esbuild/android-x64@0.25.6": + '@esbuild/freebsd-arm64@0.25.1': optional: true - "@esbuild/darwin-arm64@0.18.20": + '@esbuild/freebsd-arm64@0.25.5': optional: true - "@esbuild/darwin-arm64@0.19.12": + '@esbuild/freebsd-arm64@0.25.6': optional: true - "@esbuild/darwin-arm64@0.25.0": + '@esbuild/freebsd-x64@0.18.20': optional: true - "@esbuild/darwin-arm64@0.25.1": + '@esbuild/freebsd-x64@0.19.12': optional: true - "@esbuild/darwin-arm64@0.25.5": + '@esbuild/freebsd-x64@0.21.5': optional: true - "@esbuild/darwin-arm64@0.25.6": + '@esbuild/freebsd-x64@0.25.0': optional: true - "@esbuild/darwin-x64@0.18.20": + '@esbuild/freebsd-x64@0.25.1': optional: true - "@esbuild/darwin-x64@0.19.12": + '@esbuild/freebsd-x64@0.25.5': optional: true - "@esbuild/darwin-x64@0.25.0": + '@esbuild/freebsd-x64@0.25.6': optional: true - "@esbuild/darwin-x64@0.25.1": + '@esbuild/linux-arm64@0.18.20': optional: true - "@esbuild/darwin-x64@0.25.5": + '@esbuild/linux-arm64@0.19.12': optional: true - "@esbuild/darwin-x64@0.25.6": + '@esbuild/linux-arm64@0.21.5': optional: true - "@esbuild/freebsd-arm64@0.18.20": + '@esbuild/linux-arm64@0.25.0': optional: true - "@esbuild/freebsd-arm64@0.19.12": + '@esbuild/linux-arm64@0.25.1': optional: true - "@esbuild/freebsd-arm64@0.25.0": + '@esbuild/linux-arm64@0.25.5': optional: true - "@esbuild/freebsd-arm64@0.25.1": + '@esbuild/linux-arm64@0.25.6': optional: true - "@esbuild/freebsd-arm64@0.25.5": + '@esbuild/linux-arm@0.18.20': optional: true - "@esbuild/freebsd-arm64@0.25.6": + '@esbuild/linux-arm@0.19.12': optional: true - "@esbuild/freebsd-x64@0.18.20": + '@esbuild/linux-arm@0.21.5': optional: true - "@esbuild/freebsd-x64@0.19.12": + '@esbuild/linux-arm@0.25.0': optional: true - "@esbuild/freebsd-x64@0.25.0": + '@esbuild/linux-arm@0.25.1': optional: true - "@esbuild/freebsd-x64@0.25.1": + '@esbuild/linux-arm@0.25.5': optional: true - "@esbuild/freebsd-x64@0.25.5": + '@esbuild/linux-arm@0.25.6': optional: true - "@esbuild/freebsd-x64@0.25.6": + '@esbuild/linux-ia32@0.18.20': optional: true - "@esbuild/linux-arm64@0.18.20": + '@esbuild/linux-ia32@0.19.12': optional: true - "@esbuild/linux-arm64@0.19.12": + '@esbuild/linux-ia32@0.21.5': optional: true - "@esbuild/linux-arm64@0.25.0": + '@esbuild/linux-ia32@0.25.0': optional: true - "@esbuild/linux-arm64@0.25.1": + '@esbuild/linux-ia32@0.25.1': optional: true - "@esbuild/linux-arm64@0.25.5": + '@esbuild/linux-ia32@0.25.5': optional: true - "@esbuild/linux-arm64@0.25.6": + '@esbuild/linux-ia32@0.25.6': optional: true - "@esbuild/linux-arm@0.18.20": + '@esbuild/linux-loong64@0.18.20': optional: true - "@esbuild/linux-arm@0.19.12": + '@esbuild/linux-loong64@0.19.12': optional: true - "@esbuild/linux-arm@0.25.0": + '@esbuild/linux-loong64@0.21.5': optional: true - "@esbuild/linux-arm@0.25.1": + '@esbuild/linux-loong64@0.25.0': optional: true - "@esbuild/linux-arm@0.25.5": + '@esbuild/linux-loong64@0.25.1': optional: true - "@esbuild/linux-arm@0.25.6": + '@esbuild/linux-loong64@0.25.5': optional: true - "@esbuild/linux-ia32@0.18.20": + '@esbuild/linux-loong64@0.25.6': optional: true - "@esbuild/linux-ia32@0.19.12": + '@esbuild/linux-mips64el@0.18.20': optional: true - "@esbuild/linux-ia32@0.25.0": + '@esbuild/linux-mips64el@0.19.12': optional: true - "@esbuild/linux-ia32@0.25.1": + '@esbuild/linux-mips64el@0.21.5': optional: true - "@esbuild/linux-ia32@0.25.5": + '@esbuild/linux-mips64el@0.25.0': optional: true - "@esbuild/linux-ia32@0.25.6": + '@esbuild/linux-mips64el@0.25.1': optional: true - "@esbuild/linux-loong64@0.18.20": + '@esbuild/linux-mips64el@0.25.5': optional: true - "@esbuild/linux-loong64@0.19.12": + '@esbuild/linux-mips64el@0.25.6': optional: true - "@esbuild/linux-loong64@0.25.0": + '@esbuild/linux-ppc64@0.18.20': optional: true - "@esbuild/linux-loong64@0.25.1": + '@esbuild/linux-ppc64@0.19.12': optional: true - "@esbuild/linux-loong64@0.25.5": + '@esbuild/linux-ppc64@0.21.5': optional: true - "@esbuild/linux-loong64@0.25.6": + '@esbuild/linux-ppc64@0.25.0': optional: true - "@esbuild/linux-mips64el@0.18.20": + '@esbuild/linux-ppc64@0.25.1': optional: true - "@esbuild/linux-mips64el@0.19.12": + '@esbuild/linux-ppc64@0.25.5': optional: true - "@esbuild/linux-mips64el@0.25.0": + '@esbuild/linux-ppc64@0.25.6': optional: true - "@esbuild/linux-mips64el@0.25.1": + '@esbuild/linux-riscv64@0.18.20': optional: true - "@esbuild/linux-mips64el@0.25.5": + '@esbuild/linux-riscv64@0.19.12': optional: true - "@esbuild/linux-mips64el@0.25.6": + '@esbuild/linux-riscv64@0.21.5': optional: true - "@esbuild/linux-ppc64@0.18.20": + '@esbuild/linux-riscv64@0.25.0': optional: true - "@esbuild/linux-ppc64@0.19.12": + '@esbuild/linux-riscv64@0.25.1': optional: true - "@esbuild/linux-ppc64@0.25.0": + '@esbuild/linux-riscv64@0.25.5': optional: true - "@esbuild/linux-ppc64@0.25.1": + '@esbuild/linux-riscv64@0.25.6': optional: true - "@esbuild/linux-ppc64@0.25.5": + '@esbuild/linux-s390x@0.18.20': optional: true - "@esbuild/linux-ppc64@0.25.6": + '@esbuild/linux-s390x@0.19.12': optional: true - "@esbuild/linux-riscv64@0.18.20": + '@esbuild/linux-s390x@0.21.5': optional: true - "@esbuild/linux-riscv64@0.19.12": + '@esbuild/linux-s390x@0.25.0': optional: true - "@esbuild/linux-riscv64@0.25.0": + '@esbuild/linux-s390x@0.25.1': optional: true - "@esbuild/linux-riscv64@0.25.1": + '@esbuild/linux-s390x@0.25.5': optional: true - "@esbuild/linux-riscv64@0.25.5": + '@esbuild/linux-s390x@0.25.6': optional: true - "@esbuild/linux-riscv64@0.25.6": + '@esbuild/linux-x64@0.18.20': optional: true - "@esbuild/linux-s390x@0.18.20": + '@esbuild/linux-x64@0.19.12': optional: true - "@esbuild/linux-s390x@0.19.12": + '@esbuild/linux-x64@0.21.5': optional: true - "@esbuild/linux-s390x@0.25.0": + '@esbuild/linux-x64@0.25.0': optional: true - "@esbuild/linux-s390x@0.25.1": + '@esbuild/linux-x64@0.25.1': optional: true - "@esbuild/linux-s390x@0.25.5": + '@esbuild/linux-x64@0.25.5': optional: true - "@esbuild/linux-s390x@0.25.6": + '@esbuild/linux-x64@0.25.6': optional: true - "@esbuild/linux-x64@0.18.20": + '@esbuild/netbsd-arm64@0.25.0': optional: true - "@esbuild/linux-x64@0.19.12": + '@esbuild/netbsd-arm64@0.25.1': optional: true - "@esbuild/linux-x64@0.25.0": + '@esbuild/netbsd-arm64@0.25.5': optional: true - "@esbuild/linux-x64@0.25.1": + '@esbuild/netbsd-arm64@0.25.6': optional: true - "@esbuild/linux-x64@0.25.5": + '@esbuild/netbsd-x64@0.18.20': optional: true - "@esbuild/linux-x64@0.25.6": + '@esbuild/netbsd-x64@0.19.12': optional: true - "@esbuild/netbsd-arm64@0.25.0": + '@esbuild/netbsd-x64@0.21.5': optional: true - "@esbuild/netbsd-arm64@0.25.1": + '@esbuild/netbsd-x64@0.25.0': optional: true - "@esbuild/netbsd-arm64@0.25.5": + '@esbuild/netbsd-x64@0.25.1': optional: true - "@esbuild/netbsd-arm64@0.25.6": + '@esbuild/netbsd-x64@0.25.5': optional: true - "@esbuild/netbsd-x64@0.18.20": + '@esbuild/netbsd-x64@0.25.6': optional: true - "@esbuild/netbsd-x64@0.19.12": + '@esbuild/openbsd-arm64@0.25.0': optional: true - "@esbuild/netbsd-x64@0.25.0": + '@esbuild/openbsd-arm64@0.25.1': optional: true - "@esbuild/netbsd-x64@0.25.1": + '@esbuild/openbsd-arm64@0.25.5': optional: true - "@esbuild/netbsd-x64@0.25.5": + '@esbuild/openbsd-arm64@0.25.6': optional: true - "@esbuild/netbsd-x64@0.25.6": + '@esbuild/openbsd-x64@0.18.20': optional: true - "@esbuild/openbsd-arm64@0.25.0": + '@esbuild/openbsd-x64@0.19.12': optional: true - "@esbuild/openbsd-arm64@0.25.1": + '@esbuild/openbsd-x64@0.21.5': optional: true - "@esbuild/openbsd-arm64@0.25.5": + '@esbuild/openbsd-x64@0.25.0': optional: true - "@esbuild/openbsd-arm64@0.25.6": + '@esbuild/openbsd-x64@0.25.1': optional: true - "@esbuild/openbsd-x64@0.18.20": + '@esbuild/openbsd-x64@0.25.5': optional: true - "@esbuild/openbsd-x64@0.19.12": + '@esbuild/openbsd-x64@0.25.6': optional: true - "@esbuild/openbsd-x64@0.25.0": + '@esbuild/openharmony-arm64@0.25.6': optional: true - "@esbuild/openbsd-x64@0.25.1": + '@esbuild/sunos-x64@0.18.20': optional: true - "@esbuild/openbsd-x64@0.25.5": + '@esbuild/sunos-x64@0.19.12': optional: true - "@esbuild/openbsd-x64@0.25.6": + '@esbuild/sunos-x64@0.21.5': optional: true - "@esbuild/openharmony-arm64@0.25.6": + '@esbuild/sunos-x64@0.25.0': optional: true - "@esbuild/sunos-x64@0.18.20": + '@esbuild/sunos-x64@0.25.1': optional: true - "@esbuild/sunos-x64@0.19.12": + '@esbuild/sunos-x64@0.25.5': optional: true - "@esbuild/sunos-x64@0.25.0": + '@esbuild/sunos-x64@0.25.6': optional: true - "@esbuild/sunos-x64@0.25.1": + '@esbuild/win32-arm64@0.18.20': optional: true - "@esbuild/sunos-x64@0.25.5": + '@esbuild/win32-arm64@0.19.12': optional: true - "@esbuild/sunos-x64@0.25.6": + '@esbuild/win32-arm64@0.21.5': optional: true - "@esbuild/win32-arm64@0.18.20": + '@esbuild/win32-arm64@0.25.0': optional: true - "@esbuild/win32-arm64@0.19.12": + '@esbuild/win32-arm64@0.25.1': optional: true - "@esbuild/win32-arm64@0.25.0": + '@esbuild/win32-arm64@0.25.5': optional: true - "@esbuild/win32-arm64@0.25.1": + '@esbuild/win32-arm64@0.25.6': optional: true - "@esbuild/win32-arm64@0.25.5": + '@esbuild/win32-ia32@0.18.20': optional: true - "@esbuild/win32-arm64@0.25.6": + '@esbuild/win32-ia32@0.19.12': optional: true - "@esbuild/win32-ia32@0.18.20": + '@esbuild/win32-ia32@0.21.5': optional: true - "@esbuild/win32-ia32@0.19.12": + '@esbuild/win32-ia32@0.25.0': optional: true - "@esbuild/win32-ia32@0.25.0": + '@esbuild/win32-ia32@0.25.1': optional: true - "@esbuild/win32-ia32@0.25.1": + '@esbuild/win32-ia32@0.25.5': optional: true - "@esbuild/win32-ia32@0.25.5": + '@esbuild/win32-ia32@0.25.6': optional: true - "@esbuild/win32-ia32@0.25.6": + '@esbuild/win32-x64@0.18.20': optional: true - "@esbuild/win32-x64@0.18.20": + '@esbuild/win32-x64@0.19.12': optional: true - "@esbuild/win32-x64@0.19.12": + '@esbuild/win32-x64@0.21.5': optional: true - "@esbuild/win32-x64@0.25.0": + '@esbuild/win32-x64@0.25.0': optional: true - "@esbuild/win32-x64@0.25.1": + '@esbuild/win32-x64@0.25.1': optional: true - "@esbuild/win32-x64@0.25.5": + '@esbuild/win32-x64@0.25.5': optional: true - "@esbuild/win32-x64@0.25.6": + '@esbuild/win32-x64@0.25.6': optional: true - "@eslint-community/eslint-utils@4.5.1(eslint@9.30.1(jiti@2.4.2))": + '@eslint-community/eslint-utils@4.5.1(eslint@9.30.1(jiti@2.4.2))': dependencies: eslint: 9.30.1(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - "@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))": + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))': dependencies: eslint: 9.30.1(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - "@eslint-community/regexpp@4.12.1": {} + '@eslint-community/regexpp@4.12.1': {} - "@eslint/config-array@0.21.0": + '@eslint/config-array@0.21.0': dependencies: - "@eslint/object-schema": 2.1.6 + '@eslint/object-schema': 2.1.6 debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - "@eslint/config-helpers@0.3.0": {} + '@eslint/config-helpers@0.3.0': {} - "@eslint/core@0.14.0": + '@eslint/core@0.14.0': dependencies: - "@types/json-schema": 7.0.15 + '@types/json-schema': 7.0.15 - "@eslint/core@0.15.1": + '@eslint/core@0.15.1': dependencies: - "@types/json-schema": 7.0.15 + '@types/json-schema': 7.0.15 - "@eslint/eslintrc@3.3.1": + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.1 @@ -12507,45 +8738,64 @@ snapshots: transitivePeerDependencies: - supports-color - "@eslint/js@9.30.1": {} + '@eslint/js@9.30.1': {} - "@eslint/object-schema@2.1.6": {} + '@eslint/object-schema@2.1.6': {} - "@eslint/plugin-kit@0.3.3": + '@eslint/plugin-kit@0.3.3': dependencies: - "@eslint/core": 0.15.1 + '@eslint/core': 0.15.1 levn: 0.4.1 - "@fastify/busboy@3.1.1": {} + '@fastify/busboy@3.1.1': {} + + '@floating-ui/core@1.7.2': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.2': + dependencies: + '@floating-ui/core': 1.7.2 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} - "@gerrit0/mini-shiki@1.27.2": + '@gerrit0/mini-shiki@1.27.2': dependencies: - "@shikijs/engine-oniguruma": 1.29.2 - "@shikijs/types": 1.29.2 - "@shikijs/vscode-textmate": 10.0.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 - "@humanfs/core@0.19.1": {} + '@humanfs/core@0.19.1': {} - "@humanfs/node@0.16.6": + '@humanfs/node@0.16.6': dependencies: - "@humanfs/core": 0.19.1 - "@humanwhocodes/retry": 0.3.1 + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} - "@humanwhocodes/module-importer@1.0.1": {} + '@humanwhocodes/retry@0.4.2': {} - "@humanwhocodes/retry@0.3.1": {} + '@internationalized/date@3.8.2': + dependencies: + '@swc/helpers': 0.5.17 - "@humanwhocodes/retry@0.4.2": {} + '@internationalized/number@3.6.3': + dependencies: + '@swc/helpers': 0.5.17 - "@ioredis/commands@1.2.0": {} + '@ioredis/commands@1.2.0': {} - "@isaacs/balanced-match@4.0.1": {} + '@isaacs/balanced-match@4.0.1': {} - "@isaacs/brace-expansion@5.0.0": + '@isaacs/brace-expansion@5.0.0': dependencies: - "@isaacs/balanced-match": 4.0.1 + '@isaacs/balanced-match': 4.0.1 - "@isaacs/cliui@8.0.2": + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 @@ -12554,71 +8804,98 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - "@isaacs/fs-minipass@4.0.1": + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 - "@istanbuljs/schema@0.1.3": {} + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 - "@jridgewell/gen-mapping@0.3.12": + '@jridgewell/gen-mapping@0.3.12': dependencies: - "@jridgewell/sourcemap-codec": 1.5.4 - "@jridgewell/trace-mapping": 0.3.29 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 - "@jridgewell/gen-mapping@0.3.8": + '@jridgewell/gen-mapping@0.3.8': dependencies: - "@jridgewell/set-array": 1.2.1 - "@jridgewell/sourcemap-codec": 1.5.0 - "@jridgewell/trace-mapping": 0.3.25 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 - "@jridgewell/resolve-uri@3.1.2": {} + '@jridgewell/resolve-uri@3.1.2': {} - "@jridgewell/set-array@1.2.1": {} + '@jridgewell/set-array@1.2.1': {} - "@jridgewell/source-map@0.3.10": + '@jridgewell/source-map@0.3.10': dependencies: - "@jridgewell/gen-mapping": 0.3.12 - "@jridgewell/trace-mapping": 0.3.29 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 - "@jridgewell/sourcemap-codec@1.5.0": {} + '@jridgewell/sourcemap-codec@1.5.0': {} - "@jridgewell/sourcemap-codec@1.5.4": {} + '@jridgewell/sourcemap-codec@1.5.4': {} - "@jridgewell/trace-mapping@0.3.25": + '@jridgewell/trace-mapping@0.3.25': dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.0 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - "@jridgewell/trace-mapping@0.3.29": + '@jridgewell/trace-mapping@0.3.29': dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.4 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 - "@kwsites/file-exists@1.1.1": + '@kobalte/core@0.13.10(solid-js@1.9.7)': + dependencies: + '@floating-ui/dom': 1.7.2 + '@internationalized/date': 3.8.2 + '@internationalized/number': 3.6.3 + '@kobalte/utils': 0.9.1(solid-js@1.9.7) + '@solid-primitives/props': 3.2.2(solid-js@1.9.7) + '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.7) + solid-js: 1.9.7 + solid-presence: 0.1.8(solid-js@1.9.7) + solid-prevent-scroll: 0.1.10(solid-js@1.9.7) + + '@kobalte/utils@0.9.1(solid-js@1.9.7)': + dependencies: + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) + '@solid-primitives/keyed': 1.5.2(solid-js@1.9.7) + '@solid-primitives/map': 0.4.13(solid-js@1.9.7) + '@solid-primitives/media': 2.3.3(solid-js@1.9.7) + '@solid-primitives/props': 3.2.2(solid-js@1.9.7) + '@solid-primitives/refs': 1.1.2(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@kwsites/file-exists@1.1.1': dependencies: debug: 4.4.1 transitivePeerDependencies: - supports-color - "@kwsites/promise-deferred@1.1.1": {} + '@kwsites/promise-deferred@1.1.1': {} - "@manypkg/find-root@1.1.0": + '@manypkg/find-root@1.1.0': dependencies: - "@babel/runtime": 7.27.6 - "@types/node": 12.20.55 + '@babel/runtime': 7.27.6 + '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 - "@manypkg/get-packages@1.1.3": + '@manypkg/get-packages@1.1.3': dependencies: - "@babel/runtime": 7.27.6 - "@changesets/types": 4.1.0 - "@manypkg/find-root": 1.1.0 + '@babel/runtime': 7.27.6 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - "@mapbox/node-pre-gyp@2.0.0": + '@mapbox/node-pre-gyp@2.0.0': dependencies: consola: 3.4.2 detect-libc: 2.0.4 @@ -12631,32 +8908,49 @@ snapshots: - encoding - supports-color - "@microsoft/api-extractor-model@7.29.6(@types/node@22.16.1)": + '@microsoft/api-extractor-model@7.29.6(@types/node@22.16.1)': dependencies: - "@microsoft/tsdoc": 0.15.1 - "@microsoft/tsdoc-config": 0.17.1 - "@rushstack/node-core-library": 5.7.0(@types/node@22.16.1) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.7.0(@types/node@22.16.1) transitivePeerDependencies: - - "@types/node" + - '@types/node' + + '@microsoft/api-extractor-model@7.30.6(@types/node@20.19.5)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.1(@types/node@20.19.5) + transitivePeerDependencies: + - '@types/node' + optional: true - "@microsoft/api-extractor-model@7.30.6(@types/node@22.16.1)": + '@microsoft/api-extractor-model@7.30.6(@types/node@22.16.1)': dependencies: - "@microsoft/tsdoc": 0.15.1 - "@microsoft/tsdoc-config": 0.17.1 - "@rushstack/node-core-library": 5.13.1(@types/node@22.16.1) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.1(@types/node@22.16.1) transitivePeerDependencies: - - "@types/node" + - '@types/node' optional: true - "@microsoft/api-extractor@7.47.7(@types/node@22.16.1)": + '@microsoft/api-extractor-model@7.30.6(@types/node@24.0.11)': dependencies: - "@microsoft/api-extractor-model": 7.29.6(@types/node@22.16.1) - "@microsoft/tsdoc": 0.15.1 - "@microsoft/tsdoc-config": 0.17.1 - "@rushstack/node-core-library": 5.7.0(@types/node@22.16.1) - "@rushstack/rig-package": 0.5.3 - "@rushstack/terminal": 0.14.0(@types/node@22.16.1) - "@rushstack/ts-command-line": 4.22.6(@types/node@22.16.1) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.1(@types/node@24.0.11) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.47.7(@types/node@22.16.1)': + dependencies: + '@microsoft/api-extractor-model': 7.29.6(@types/node@22.16.1) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.7.0(@types/node@22.16.1) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.14.0(@types/node@22.16.1) + '@rushstack/ts-command-line': 4.22.6(@types/node@22.16.1) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -12664,17 +8958,36 @@ snapshots: source-map: 0.6.1 typescript: 5.4.2 transitivePeerDependencies: - - "@types/node" + - '@types/node' + + '@microsoft/api-extractor@7.52.8(@types/node@20.19.5)': + dependencies: + '@microsoft/api-extractor-model': 7.30.6(@types/node@20.19.5) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.1(@types/node@20.19.5) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.3(@types/node@20.19.5) + '@rushstack/ts-command-line': 5.0.1(@types/node@20.19.5) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.10 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + optional: true - "@microsoft/api-extractor@7.52.8(@types/node@22.16.1)": + '@microsoft/api-extractor@7.52.8(@types/node@22.16.1)': dependencies: - "@microsoft/api-extractor-model": 7.30.6(@types/node@22.16.1) - "@microsoft/tsdoc": 0.15.1 - "@microsoft/tsdoc-config": 0.17.1 - "@rushstack/node-core-library": 5.13.1(@types/node@22.16.1) - "@rushstack/rig-package": 0.5.3 - "@rushstack/terminal": 0.15.3(@types/node@22.16.1) - "@rushstack/ts-command-line": 5.0.1(@types/node@22.16.1) + '@microsoft/api-extractor-model': 7.30.6(@types/node@22.16.1) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.1(@types/node@22.16.1) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.3(@types/node@22.16.1) + '@rushstack/ts-command-line': 5.0.1(@types/node@22.16.1) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -12682,35 +8995,53 @@ snapshots: source-map: 0.6.1 typescript: 5.8.2 transitivePeerDependencies: - - "@types/node" + - '@types/node' optional: true - "@microsoft/tsdoc-config@0.17.1": + '@microsoft/api-extractor@7.52.8(@types/node@24.0.11)': + dependencies: + '@microsoft/api-extractor-model': 7.30.6(@types/node@24.0.11) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.13.1(@types/node@24.0.11) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.3(@types/node@24.0.11) + '@rushstack/ts-command-line': 5.0.1(@types/node@24.0.11) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.10 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.17.1': dependencies: - "@microsoft/tsdoc": 0.15.1 + '@microsoft/tsdoc': 0.15.1 ajv: 8.12.0 jju: 1.4.0 resolve: 1.22.10 - "@microsoft/tsdoc@0.15.1": {} + '@microsoft/tsdoc@0.15.1': {} - "@napi-rs/wasm-runtime@0.2.11": + '@napi-rs/wasm-runtime@0.2.11': dependencies: - "@emnapi/core": 1.4.4 - "@emnapi/runtime": 1.4.4 - "@tybys/wasm-util": 0.9.0 + '@emnapi/core': 1.4.4 + '@emnapi/runtime': 1.4.4 + '@tybys/wasm-util': 0.9.0 optional: true - "@netlify/binary-info@1.0.0": {} + '@netlify/binary-info@1.0.0': {} - "@netlify/blobs@9.1.2": + '@netlify/blobs@9.1.2': dependencies: - "@netlify/dev-utils": 2.2.0 - "@netlify/runtime-utils": 1.3.1 + '@netlify/dev-utils': 2.2.0 + '@netlify/runtime-utils': 1.3.1 - "@netlify/dev-utils@2.2.0": + '@netlify/dev-utils@2.2.0': dependencies: - "@whatwg-node/server": 0.9.71 + '@whatwg-node/server': 0.9.71 chokidar: 4.0.3 decache: 4.6.2 dot-prop: 9.0.0 @@ -12722,12 +9053,12 @@ snapshots: uuid: 11.1.0 write-file-atomic: 6.0.0 - "@netlify/functions@3.1.10(rollup@4.44.2)": + '@netlify/functions@3.1.10(rollup@4.44.2)': dependencies: - "@netlify/blobs": 9.1.2 - "@netlify/dev-utils": 2.2.0 - "@netlify/serverless-functions-api": 1.41.2 - "@netlify/zip-it-and-ship-it": 12.2.1(rollup@4.44.2) + '@netlify/blobs': 9.1.2 + '@netlify/dev-utils': 2.2.0 + '@netlify/serverless-functions-api': 1.41.2 + '@netlify/zip-it-and-ship-it': 12.2.1(rollup@4.44.2) cron-parser: 4.9.0 decache: 4.6.2 extract-zip: 2.0.1 @@ -12741,21 +9072,21 @@ snapshots: - rollup - supports-color - "@netlify/open-api@2.37.0": {} + '@netlify/open-api@2.37.0': {} - "@netlify/runtime-utils@1.3.1": {} + '@netlify/runtime-utils@1.3.1': {} - "@netlify/serverless-functions-api@1.41.2": {} + '@netlify/serverless-functions-api@1.41.2': {} - "@netlify/serverless-functions-api@2.1.3": {} + '@netlify/serverless-functions-api@2.1.3': {} - "@netlify/zip-it-and-ship-it@12.2.1(rollup@4.44.2)": + '@netlify/zip-it-and-ship-it@12.2.1(rollup@4.44.2)': dependencies: - "@babel/parser": 7.28.0 - "@babel/types": 7.28.0 - "@netlify/binary-info": 1.0.0 - "@netlify/serverless-functions-api": 2.1.3 - "@vercel/nft": 0.29.4(rollup@4.44.2) + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@netlify/binary-info': 1.0.0 + '@netlify/serverless-functions-api': 2.1.3 + '@vercel/nft': 0.29.4(rollup@4.44.2) archiver: 7.0.1 common-path-prefix: 3.0.0 copy-file: 11.0.0 @@ -12789,130 +9120,130 @@ snapshots: - rollup - supports-color - "@nodelib/fs.scandir@2.1.5": + '@nodelib/fs.scandir@2.1.5': dependencies: - "@nodelib/fs.stat": 2.0.5 + '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - "@nodelib/fs.stat@2.0.5": {} + '@nodelib/fs.stat@2.0.5': {} - "@nodelib/fs.walk@1.2.8": + '@nodelib/fs.walk@1.2.8': dependencies: - "@nodelib/fs.scandir": 2.1.5 + '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - "@oozcitak/dom@1.15.10": + '@oozcitak/dom@1.15.10': dependencies: - "@oozcitak/infra": 1.0.8 - "@oozcitak/url": 1.0.4 - "@oozcitak/util": 8.3.8 + '@oozcitak/infra': 1.0.8 + '@oozcitak/url': 1.0.4 + '@oozcitak/util': 8.3.8 - "@oozcitak/infra@1.0.8": + '@oozcitak/infra@1.0.8': dependencies: - "@oozcitak/util": 8.3.8 + '@oozcitak/util': 8.3.8 - "@oozcitak/url@1.0.4": + '@oozcitak/url@1.0.4': dependencies: - "@oozcitak/infra": 1.0.8 - "@oozcitak/util": 8.3.8 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 - "@oozcitak/util@8.3.8": {} + '@oozcitak/util@8.3.8': {} - "@parcel/watcher-android-arm64@2.5.1": + '@parcel/watcher-android-arm64@2.5.1': optional: true - "@parcel/watcher-darwin-arm64@2.5.1": + '@parcel/watcher-darwin-arm64@2.5.1': optional: true - "@parcel/watcher-darwin-x64@2.5.1": + '@parcel/watcher-darwin-x64@2.5.1': optional: true - "@parcel/watcher-freebsd-x64@2.5.1": + '@parcel/watcher-freebsd-x64@2.5.1': optional: true - "@parcel/watcher-linux-arm-glibc@2.5.1": + '@parcel/watcher-linux-arm-glibc@2.5.1': optional: true - "@parcel/watcher-linux-arm-musl@2.5.1": + '@parcel/watcher-linux-arm-musl@2.5.1': optional: true - "@parcel/watcher-linux-arm64-glibc@2.5.1": + '@parcel/watcher-linux-arm64-glibc@2.5.1': optional: true - "@parcel/watcher-linux-arm64-musl@2.5.1": + '@parcel/watcher-linux-arm64-musl@2.5.1': optional: true - "@parcel/watcher-linux-x64-glibc@2.5.1": + '@parcel/watcher-linux-x64-glibc@2.5.1': optional: true - "@parcel/watcher-linux-x64-musl@2.5.1": + '@parcel/watcher-linux-x64-musl@2.5.1': optional: true - "@parcel/watcher-wasm@2.5.1": + '@parcel/watcher-wasm@2.5.1': dependencies: is-glob: 4.0.3 micromatch: 4.0.8 - "@parcel/watcher-win32-arm64@2.5.1": + '@parcel/watcher-win32-arm64@2.5.1': optional: true - "@parcel/watcher-win32-ia32@2.5.1": + '@parcel/watcher-win32-ia32@2.5.1': optional: true - "@parcel/watcher-win32-x64@2.5.1": + '@parcel/watcher-win32-x64@2.5.1': optional: true - "@parcel/watcher@2.5.1": + '@parcel/watcher@2.5.1': dependencies: detect-libc: 1.0.3 is-glob: 4.0.3 micromatch: 4.0.8 node-addon-api: 7.1.1 optionalDependencies: - "@parcel/watcher-android-arm64": 2.5.1 - "@parcel/watcher-darwin-arm64": 2.5.1 - "@parcel/watcher-darwin-x64": 2.5.1 - "@parcel/watcher-freebsd-x64": 2.5.1 - "@parcel/watcher-linux-arm-glibc": 2.5.1 - "@parcel/watcher-linux-arm-musl": 2.5.1 - "@parcel/watcher-linux-arm64-glibc": 2.5.1 - "@parcel/watcher-linux-arm64-musl": 2.5.1 - "@parcel/watcher-linux-x64-glibc": 2.5.1 - "@parcel/watcher-linux-x64-musl": 2.5.1 - "@parcel/watcher-win32-arm64": 2.5.1 - "@parcel/watcher-win32-ia32": 2.5.1 - "@parcel/watcher-win32-x64": 2.5.1 + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 - "@petamoriken/float16@3.9.2": {} + '@petamoriken/float16@3.9.2': {} - "@pkgjs/parseargs@0.11.0": + '@pkgjs/parseargs@0.11.0': optional: true - "@pkgr/core@0.2.7": {} + '@pkgr/core@0.2.7': {} - "@poppinss/colors@4.1.5": + '@poppinss/colors@4.1.5': dependencies: kleur: 4.1.5 - "@poppinss/dumper@0.6.4": + '@poppinss/dumper@0.6.4': dependencies: - "@poppinss/colors": 4.1.5 - "@sindresorhus/is": 7.0.2 + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.0.2 supports-color: 10.0.0 - "@poppinss/exception@1.2.2": {} + '@poppinss/exception@1.2.2': {} - "@publint/pack@0.1.2": {} + '@publint/pack@0.1.2': {} - "@rolldown/pluginutils@1.0.0-beta.19": {} + '@rolldown/pluginutils@1.0.0-beta.19': {} - "@rollup/plugin-alias@5.1.1(rollup@4.44.2)": + '@rollup/plugin-alias@5.1.1(rollup@4.44.2)': optionalDependencies: rollup: 4.44.2 - "@rollup/plugin-commonjs@28.0.6(rollup@4.44.2)": + '@rollup/plugin-commonjs@28.0.6(rollup@4.44.2)': dependencies: - "@rollup/pluginutils": 5.2.0(rollup@4.44.2) + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.6(picomatch@4.0.2) @@ -12922,38 +9253,38 @@ snapshots: optionalDependencies: rollup: 4.44.2 - "@rollup/plugin-inject@5.0.5(rollup@4.44.2)": + '@rollup/plugin-inject@5.0.5(rollup@4.44.2)': dependencies: - "@rollup/pluginutils": 5.2.0(rollup@4.44.2) + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) estree-walker: 2.0.2 magic-string: 0.30.17 optionalDependencies: rollup: 4.44.2 - "@rollup/plugin-json@6.1.0(rollup@4.44.2)": + '@rollup/plugin-json@6.1.0(rollup@4.44.2)': dependencies: - "@rollup/pluginutils": 5.2.0(rollup@4.44.2) + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) optionalDependencies: rollup: 4.44.2 - "@rollup/plugin-node-resolve@16.0.1(rollup@4.44.2)": + '@rollup/plugin-node-resolve@16.0.1(rollup@4.44.2)': dependencies: - "@rollup/pluginutils": 5.2.0(rollup@4.44.2) - "@types/resolve": 1.20.2 + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) + '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: rollup: 4.44.2 - "@rollup/plugin-replace@6.0.2(rollup@4.44.2)": + '@rollup/plugin-replace@6.0.2(rollup@4.44.2)': dependencies: - "@rollup/pluginutils": 5.2.0(rollup@4.44.2) + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) magic-string: 0.30.17 optionalDependencies: rollup: 4.44.2 - "@rollup/plugin-terser@0.4.4(rollup@4.44.2)": + '@rollup/plugin-terser@0.4.4(rollup@4.44.2)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 @@ -12961,132 +9292,146 @@ snapshots: optionalDependencies: rollup: 4.44.2 - "@rollup/pluginutils@5.2.0(rollup@4.44.2)": + '@rollup/pluginutils@5.2.0(rollup@4.44.2)': dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: rollup: 4.44.2 - "@rollup/rollup-android-arm-eabi@4.34.8": + '@rollup/rollup-android-arm-eabi@4.34.8': + optional: true + + '@rollup/rollup-android-arm-eabi@4.44.2': optional: true - "@rollup/rollup-android-arm-eabi@4.44.2": + '@rollup/rollup-android-arm64@4.34.8': optional: true - "@rollup/rollup-android-arm64@4.34.8": + '@rollup/rollup-android-arm64@4.44.2': optional: true - "@rollup/rollup-android-arm64@4.44.2": + '@rollup/rollup-darwin-arm64@4.34.8': optional: true - "@rollup/rollup-darwin-arm64@4.34.8": + '@rollup/rollup-darwin-arm64@4.44.2': optional: true - "@rollup/rollup-darwin-arm64@4.44.2": + '@rollup/rollup-darwin-x64@4.34.8': optional: true - "@rollup/rollup-darwin-x64@4.34.8": + '@rollup/rollup-darwin-x64@4.44.2': optional: true - "@rollup/rollup-darwin-x64@4.44.2": + '@rollup/rollup-freebsd-arm64@4.34.8': optional: true - "@rollup/rollup-freebsd-arm64@4.34.8": + '@rollup/rollup-freebsd-arm64@4.44.2': optional: true - "@rollup/rollup-freebsd-arm64@4.44.2": + '@rollup/rollup-freebsd-x64@4.34.8': optional: true - "@rollup/rollup-freebsd-x64@4.34.8": + '@rollup/rollup-freebsd-x64@4.44.2': optional: true - "@rollup/rollup-freebsd-x64@4.44.2": + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': optional: true - "@rollup/rollup-linux-arm-gnueabihf@4.34.8": + '@rollup/rollup-linux-arm-gnueabihf@4.44.2': optional: true - "@rollup/rollup-linux-arm-gnueabihf@4.44.2": + '@rollup/rollup-linux-arm-musleabihf@4.34.8': optional: true - "@rollup/rollup-linux-arm-musleabihf@4.34.8": + '@rollup/rollup-linux-arm-musleabihf@4.44.2': optional: true - "@rollup/rollup-linux-arm-musleabihf@4.44.2": + '@rollup/rollup-linux-arm64-gnu@4.34.8': optional: true - "@rollup/rollup-linux-arm64-gnu@4.34.8": + '@rollup/rollup-linux-arm64-gnu@4.44.2': optional: true - "@rollup/rollup-linux-arm64-gnu@4.44.2": + '@rollup/rollup-linux-arm64-musl@4.34.8': optional: true - "@rollup/rollup-linux-arm64-musl@4.34.8": + '@rollup/rollup-linux-arm64-musl@4.44.2': optional: true - "@rollup/rollup-linux-arm64-musl@4.44.2": + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': optional: true - "@rollup/rollup-linux-loongarch64-gnu@4.34.8": + '@rollup/rollup-linux-loongarch64-gnu@4.44.2': optional: true - "@rollup/rollup-linux-loongarch64-gnu@4.44.2": + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': optional: true - "@rollup/rollup-linux-powerpc64le-gnu@4.34.8": + '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': optional: true - "@rollup/rollup-linux-powerpc64le-gnu@4.44.2": + '@rollup/rollup-linux-riscv64-gnu@4.34.8': optional: true - "@rollup/rollup-linux-riscv64-gnu@4.34.8": + '@rollup/rollup-linux-riscv64-gnu@4.44.2': optional: true - "@rollup/rollup-linux-riscv64-gnu@4.44.2": + '@rollup/rollup-linux-riscv64-musl@4.44.2': optional: true - "@rollup/rollup-linux-riscv64-musl@4.44.2": + '@rollup/rollup-linux-s390x-gnu@4.34.8': optional: true - "@rollup/rollup-linux-s390x-gnu@4.34.8": + '@rollup/rollup-linux-s390x-gnu@4.44.2': optional: true - "@rollup/rollup-linux-s390x-gnu@4.44.2": + '@rollup/rollup-linux-x64-gnu@4.34.8': optional: true - "@rollup/rollup-linux-x64-gnu@4.34.8": + '@rollup/rollup-linux-x64-gnu@4.44.2': optional: true - "@rollup/rollup-linux-x64-gnu@4.44.2": + '@rollup/rollup-linux-x64-musl@4.34.8': optional: true - "@rollup/rollup-linux-x64-musl@4.34.8": + '@rollup/rollup-linux-x64-musl@4.44.2': optional: true - "@rollup/rollup-linux-x64-musl@4.44.2": + '@rollup/rollup-win32-arm64-msvc@4.34.8': optional: true - "@rollup/rollup-win32-arm64-msvc@4.34.8": + '@rollup/rollup-win32-arm64-msvc@4.44.2': optional: true - "@rollup/rollup-win32-arm64-msvc@4.44.2": + '@rollup/rollup-win32-ia32-msvc@4.34.8': optional: true - "@rollup/rollup-win32-ia32-msvc@4.34.8": + '@rollup/rollup-win32-ia32-msvc@4.44.2': optional: true - "@rollup/rollup-win32-ia32-msvc@4.44.2": + '@rollup/rollup-win32-x64-msvc@4.34.8': optional: true - "@rollup/rollup-win32-x64-msvc@4.34.8": + '@rollup/rollup-win32-x64-msvc@4.44.2': optional: true - "@rollup/rollup-win32-x64-msvc@4.44.2": + '@rushstack/node-core-library@5.13.1(@types/node@20.19.5)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.0 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.10 + semver: 7.5.4 + optionalDependencies: + '@types/node': 20.19.5 optional: true - "@rushstack/node-core-library@5.13.1(@types/node@22.16.1)": + '@rushstack/node-core-library@5.13.1(@types/node@22.16.1)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -13097,10 +9442,23 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - "@types/node": 22.16.1 + '@types/node': 22.16.1 optional: true - "@rushstack/node-core-library@5.7.0(@types/node@22.16.1)": + '@rushstack/node-core-library@5.13.1(@types/node@24.0.11)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.0 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.10 + semver: 7.5.4 + optionalDependencies: + '@types/node': 24.0.11 + + '@rushstack/node-core-library@5.7.0(@types/node@22.16.1)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -13111,76 +9469,180 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - "@types/node": 22.16.1 + '@types/node': 22.16.1 - "@rushstack/rig-package@0.5.3": + '@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.16.1)": + '@rushstack/terminal@0.14.0(@types/node@22.16.1)': + dependencies: + '@rushstack/node-core-library': 5.7.0(@types/node@22.16.1) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 22.16.1 + + '@rushstack/terminal@0.15.3(@types/node@20.19.5)': dependencies: - "@rushstack/node-core-library": 5.7.0(@types/node@22.16.1) + '@rushstack/node-core-library': 5.13.1(@types/node@20.19.5) supports-color: 8.1.1 optionalDependencies: - "@types/node": 22.16.1 + '@types/node': 20.19.5 + optional: true - "@rushstack/terminal@0.15.3(@types/node@22.16.1)": + '@rushstack/terminal@0.15.3(@types/node@22.16.1)': dependencies: - "@rushstack/node-core-library": 5.13.1(@types/node@22.16.1) + '@rushstack/node-core-library': 5.13.1(@types/node@22.16.1) supports-color: 8.1.1 optionalDependencies: - "@types/node": 22.16.1 + '@types/node': 22.16.1 optional: true - "@rushstack/ts-command-line@4.22.6(@types/node@22.16.1)": + '@rushstack/terminal@0.15.3(@types/node@24.0.11)': + dependencies: + '@rushstack/node-core-library': 5.13.1(@types/node@24.0.11) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 24.0.11 + + '@rushstack/ts-command-line@4.22.6(@types/node@22.16.1)': + dependencies: + '@rushstack/terminal': 0.14.0(@types/node@22.16.1) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@rushstack/ts-command-line@5.0.1(@types/node@20.19.5)': dependencies: - "@rushstack/terminal": 0.14.0(@types/node@22.16.1) - "@types/argparse": 1.0.38 + '@rushstack/terminal': 0.15.3(@types/node@20.19.5) + '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - - "@types/node" + - '@types/node' + optional: true - "@rushstack/ts-command-line@5.0.1(@types/node@22.16.1)": + '@rushstack/ts-command-line@5.0.1(@types/node@22.16.1)': dependencies: - "@rushstack/terminal": 0.15.3(@types/node@22.16.1) - "@types/argparse": 1.0.38 + '@rushstack/terminal': 0.15.3(@types/node@22.16.1) + '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - - "@types/node" + - '@types/node' optional: true - "@shikijs/engine-oniguruma@1.29.2": + '@rushstack/ts-command-line@5.0.1(@types/node@24.0.11)': + dependencies: + '@rushstack/terminal': 0.15.3(@types/node@24.0.11) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@shikijs/engine-oniguruma@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/types@1.29.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/is@7.0.2': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/keyed@1.5.2(solid-js@1.9.7)': + dependencies: + solid-js: 1.9.7 + + '@solid-primitives/map@0.4.13(solid-js@1.9.7)': + dependencies: + '@solid-primitives/trigger': 1.2.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/media@2.3.3(solid-js@1.9.7)': + dependencies: + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/props@3.2.2(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/refs@1.1.2(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/resize-observer@2.1.3(solid-js@1.9.7)': + dependencies: + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) + '@solid-primitives/static-store': 0.1.2(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/rootless@1.5.2(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/static-store@0.1.2(solid-js@1.9.7)': dependencies: - "@shikijs/types": 1.29.2 - "@shikijs/vscode-textmate": 10.0.2 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 - "@shikijs/types@1.29.2": + '@solid-primitives/storage@1.3.11(solid-js@1.9.7)': dependencies: - "@shikijs/vscode-textmate": 10.0.2 - "@types/hast": 3.0.4 + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 - "@shikijs/vscode-textmate@10.0.2": {} + '@solid-primitives/transition-group@1.1.2(solid-js@1.9.7)': + dependencies: + solid-js: 1.9.7 - "@sindresorhus/is@7.0.2": {} + '@solid-primitives/trigger@1.2.2(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 - "@sindresorhus/merge-streams@2.3.0": {} + '@solid-primitives/utils@6.3.2(solid-js@1.9.7)': + dependencies: + solid-js: 1.9.7 - "@speed-highlight/core@1.2.7": {} + '@speed-highlight/core@1.2.7': {} - "@standard-schema/spec@1.0.0": {} + '@standard-schema/spec@1.0.0': {} - "@stylistic/eslint-plugin-js@4.4.1(eslint@9.30.1(jiti@2.4.2))": + '@stylistic/eslint-plugin-js@4.4.1(eslint@9.30.1(jiti@2.4.2))': dependencies: eslint: 9.30.1(jiti@2.4.2) eslint-visitor-keys: 4.2.1 espree: 10.4.0 - "@stylistic/eslint-plugin@4.4.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)": + '@stylistic/eslint-plugin@4.4.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - "@typescript-eslint/utils": 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) eslint: 9.30.1(jiti@2.4.2) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -13190,16 +9652,20 @@ snapshots: - supports-color - typescript - "@svitejs/changesets-changelog-github-compact@1.2.0": + '@svitejs/changesets-changelog-github-compact@1.2.0': dependencies: - "@changesets/get-github-info": 0.6.0 + '@changesets/get-github-info': 0.6.0 dotenv: 16.6.1 transitivePeerDependencies: - encoding - "@tailwindcss/node@4.1.11": + '@swc/helpers@0.5.17': dependencies: - "@ampproject/remapping": 2.3.0 + tslib: 2.8.1 + + '@tailwindcss/node@4.1.11': + dependencies: + '@ampproject/remapping': 2.3.0 enhanced-resolve: 5.18.2 jiti: 2.4.2 lightningcss: 1.30.1 @@ -13207,76 +9673,76 @@ snapshots: source-map-js: 1.2.1 tailwindcss: 4.1.11 - "@tailwindcss/oxide-android-arm64@4.1.11": + '@tailwindcss/oxide-android-arm64@4.1.11': optional: true - "@tailwindcss/oxide-darwin-arm64@4.1.11": + '@tailwindcss/oxide-darwin-arm64@4.1.11': optional: true - "@tailwindcss/oxide-darwin-x64@4.1.11": + '@tailwindcss/oxide-darwin-x64@4.1.11': optional: true - "@tailwindcss/oxide-freebsd-x64@4.1.11": + '@tailwindcss/oxide-freebsd-x64@4.1.11': optional: true - "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11": + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': optional: true - "@tailwindcss/oxide-linux-arm64-gnu@4.1.11": + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': optional: true - "@tailwindcss/oxide-linux-arm64-musl@4.1.11": + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': optional: true - "@tailwindcss/oxide-linux-x64-gnu@4.1.11": + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': optional: true - "@tailwindcss/oxide-linux-x64-musl@4.1.11": + '@tailwindcss/oxide-linux-x64-musl@4.1.11': optional: true - "@tailwindcss/oxide-wasm32-wasi@4.1.11": + '@tailwindcss/oxide-wasm32-wasi@4.1.11': optional: true - "@tailwindcss/oxide-win32-arm64-msvc@4.1.11": + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': optional: true - "@tailwindcss/oxide-win32-x64-msvc@4.1.11": + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': optional: true - "@tailwindcss/oxide@4.1.11": + '@tailwindcss/oxide@4.1.11': dependencies: detect-libc: 2.0.4 tar: 7.4.3 optionalDependencies: - "@tailwindcss/oxide-android-arm64": 4.1.11 - "@tailwindcss/oxide-darwin-arm64": 4.1.11 - "@tailwindcss/oxide-darwin-x64": 4.1.11 - "@tailwindcss/oxide-freebsd-x64": 4.1.11 - "@tailwindcss/oxide-linux-arm-gnueabihf": 4.1.11 - "@tailwindcss/oxide-linux-arm64-gnu": 4.1.11 - "@tailwindcss/oxide-linux-arm64-musl": 4.1.11 - "@tailwindcss/oxide-linux-x64-gnu": 4.1.11 - "@tailwindcss/oxide-linux-x64-musl": 4.1.11 - "@tailwindcss/oxide-wasm32-wasi": 4.1.11 - "@tailwindcss/oxide-win32-arm64-msvc": 4.1.11 - "@tailwindcss/oxide-win32-x64-msvc": 4.1.11 - - "@tailwindcss/vite@4.1.11(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": - dependencies: - "@tailwindcss/node": 4.1.11 - "@tailwindcss/oxide": 4.1.11 + '@tailwindcss/oxide-android-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-x64': 4.1.11 + '@tailwindcss/oxide-freebsd-x64': 4.1.11 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-x64-musl': 4.1.11 + '@tailwindcss/oxide-wasm32-wasi': 4.1.11 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + + '@tailwindcss/vite@4.1.11(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@tailwindcss/node': 4.1.11 + '@tailwindcss/oxide': 4.1.11 tailwindcss: 4.1.11 vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - "@tanstack/config@0.17.1(@types/node@22.16.1)(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@tanstack/config@0.17.1(@types/node@22.16.1)(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@tanstack/eslint-config": 0.1.0(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@tanstack/publish-config": 0.1.0 - "@tanstack/typedoc-config": 0.1.0(typescript@5.8.3) - "@tanstack/vite-config": 0.1.0(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/eslint-config': 0.1.0(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@tanstack/publish-config': 0.1.0 + '@tanstack/typedoc-config': 0.1.0(typescript@5.8.3) + '@tanstack/vite-config': 0.1.0(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) transitivePeerDependencies: - - "@types/node" - - "@typescript-eslint/utils" + - '@types/node' + - '@typescript-eslint/utils' - eslint - eslint-import-resolver-node - rollup @@ -13284,53 +9750,71 @@ snapshots: - typescript - vite - "@tanstack/directive-functions-plugin@1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@tanstack/db@0.0.20(typescript@5.8.3)': + dependencies: + '@electric-sql/d2mini': 0.1.6 + '@standard-schema/spec': 1.0.0 + typescript: 5.8.3 + + '@tanstack/directive-functions-plugin@1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/core": 7.28.0 - "@babel/traverse": 7.28.0 - "@babel/types": 7.28.0 - "@tanstack/router-utils": 1.121.21 + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + '@tanstack/router-utils': 1.121.21 babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - "@tanstack/eslint-config@0.1.0(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)": + '@tanstack/eslint-config@0.1.0(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - "@eslint/js": 9.30.1 - "@stylistic/eslint-plugin-js": 4.4.1(eslint@9.30.1(jiti@2.4.2)) + '@eslint/js': 9.30.1 + '@stylistic/eslint-plugin-js': 4.4.1(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-n: 17.21.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) globals: 16.3.0 typescript-eslint: 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) vue-eslint-parser: 9.4.3(eslint@9.30.1(jiti@2.4.2)) transitivePeerDependencies: - - "@typescript-eslint/utils" + - '@typescript-eslint/utils' - eslint - eslint-import-resolver-node - supports-color - typescript - "@tanstack/history@1.121.34": {} + '@tanstack/history@1.121.34': {} + + '@tanstack/match-sorter-utils@8.19.4': + dependencies: + remove-accents: 0.5.0 - "@tanstack/publish-config@0.1.0": + '@tanstack/publish-config@0.1.0': dependencies: - "@commitlint/parse": 19.8.1 + '@commitlint/parse': 19.8.1 jsonfile: 6.1.0 semver: 7.7.2 simple-git: 3.28.0 transitivePeerDependencies: - supports-color - "@tanstack/query-core@5.81.5": {} + '@tanstack/query-core@5.81.5': {} + + '@tanstack/react-db@0.0.20(react@19.1.0)(typescript@5.8.3)': + dependencies: + '@tanstack/db': 0.0.20(typescript@5.8.3) + react: 19.1.0 + use-sync-external-store: 1.5.0(react@19.1.0) + transitivePeerDependencies: + - typescript - "@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@tanstack/history": 1.121.34 - "@tanstack/react-store": 0.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/router-core": 1.125.4 + '@tanstack/history': 1.121.34 + '@tanstack/react-store': 0.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.125.4 isbot: 5.1.28 jsesc: 3.1.0 react: 19.1.0 @@ -13338,11 +9822,11 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - "@tanstack/react-start-client@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@tanstack/react-start-client@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@tanstack/react-router": 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/router-core": 1.125.4 - "@tanstack/start-client-core": 1.125.4 + '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.125.4 + '@tanstack/start-client-core': 1.125.4 cookie-es: 1.2.2 jsesc: 3.1.0 react: 19.1.0 @@ -13350,30 +9834,30 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - "@tanstack/react-start-plugin@1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@tanstack/react-start-plugin@1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@tanstack/start-plugin-core": 1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@vitejs/plugin-react": 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/start-plugin-core': 1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitejs/plugin-react': 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) 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/kv" + - '@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/kv' - aws4fetch - better-sqlite3 - drizzle-orm @@ -13388,47 +9872,47 @@ snapshots: - webpack - xml2js - "@tanstack/react-start-server@1.126.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@tanstack/react-start-server@1.126.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@tanstack/history": 1.121.34 - "@tanstack/react-router": 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/router-core": 1.125.4 - "@tanstack/start-client-core": 1.125.4 - "@tanstack/start-server-core": 1.126.1 + '@tanstack/history': 1.121.34 + '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.125.4 + '@tanstack/start-client-core': 1.125.4 + '@tanstack/start-server-core': 1.126.1 h3: 1.13.0 isbot: 5.1.28 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - "@tanstack/react-start@1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@tanstack/react-start@1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@tanstack/react-start-client": 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/react-start-plugin": 1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@tanstack/react-start-server": 1.126.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/start-server-functions-client": 1.125.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@tanstack/start-server-functions-server": 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@vitejs/plugin-react": 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/react-start-client': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-start-plugin': 1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/react-start-server': 1.126.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/start-server-functions-client': 1.125.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/start-server-functions-server': 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitejs/plugin-react': 4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - - "@azure/app-configuration" - - "@azure/cosmos" - - "@azure/data-tables" - - "@azure/identity" - - "@azure/keyvault-secrets" - - "@azure/storage-blob" - - "@capacitor/preferences" - - "@deno/kv" - - "@electric-sql/pglite" - - "@libsql/client" - - "@netlify/blobs" - - "@planetscale/database" - - "@rsbuild/core" - - "@tanstack/react-router" - - "@upstash/redis" - - "@vercel/blob" - - "@vercel/kv" + - '@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/kv' - aws4fetch - better-sqlite3 - drizzle-orm @@ -13443,27 +9927,27 @@ snapshots: - webpack - xml2js - "@tanstack/react-store@0.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@tanstack/react-store@0.7.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@tanstack/store": 0.7.2 + '@tanstack/store': 0.7.2 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) use-sync-external-store: 1.5.0(react@19.1.0) - "@tanstack/router-core@1.125.4": + '@tanstack/router-core@1.125.4': dependencies: - "@tanstack/history": 1.121.34 - "@tanstack/store": 0.7.2 + '@tanstack/history': 1.121.34 + '@tanstack/store': 0.7.2 cookie-es: 1.2.2 jsesc: 3.1.0 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - "@tanstack/router-generator@1.125.4": + '@tanstack/router-generator@1.125.4': dependencies: - "@tanstack/router-core": 1.125.4 - "@tanstack/router-utils": 1.121.21 - "@tanstack/virtual-file-routes": 1.121.21 + '@tanstack/router-core': 1.125.4 + '@tanstack/router-utils': 1.121.21 + '@tanstack/virtual-file-routes': 1.121.21 prettier: 3.6.2 recast: 0.23.11 source-map: 0.7.4 @@ -13472,75 +9956,76 @@ snapshots: transitivePeerDependencies: - supports-color - "@tanstack/router-plugin@1.125.6(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": - dependencies: - "@babel/core": 7.28.0 - "@babel/plugin-syntax-jsx": 7.27.1(@babel/core@7.28.0) - "@babel/plugin-syntax-typescript": 7.27.1(@babel/core@7.28.0) - "@babel/template": 7.27.2 - "@babel/traverse": 7.28.0 - "@babel/types": 7.28.0 - "@tanstack/router-core": 1.125.4 - "@tanstack/router-generator": 1.125.4 - "@tanstack/router-utils": 1.121.21 - "@tanstack/virtual-file-routes": 1.121.21 + '@tanstack/router-plugin@1.125.6(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + '@tanstack/router-core': 1.125.4 + '@tanstack/router-generator': 1.125.4 + '@tanstack/router-utils': 1.121.21 + '@tanstack/virtual-file-routes': 1.121.21 babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 unplugin: 2.3.5 zod: 3.25.76 optionalDependencies: - "@tanstack/react-router": 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite-plugin-solid: 2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) transitivePeerDependencies: - supports-color - "@tanstack/router-utils@1.121.21": + '@tanstack/router-utils@1.121.21': dependencies: - "@babel/core": 7.28.0 - "@babel/generator": 7.28.0 - "@babel/parser": 7.28.0 - "@babel/preset-typescript": 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) ansis: 4.1.0 diff: 8.0.2 transitivePeerDependencies: - supports-color - "@tanstack/server-functions-plugin@1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@tanstack/server-functions-plugin@1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/core": 7.28.0 - "@babel/plugin-syntax-jsx": 7.27.1(@babel/core@7.28.0) - "@babel/plugin-syntax-typescript": 7.27.1(@babel/core@7.28.0) - "@babel/template": 7.27.2 - "@babel/traverse": 7.28.0 - "@babel/types": 7.28.0 - "@tanstack/directive-functions-plugin": 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + '@tanstack/directive-functions-plugin': 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - "@tanstack/start-client-core@1.125.4": + '@tanstack/start-client-core@1.125.4': dependencies: - "@tanstack/router-core": 1.125.4 + '@tanstack/router-core': 1.125.4 cookie-es: 1.2.2 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - "@tanstack/start-plugin-core@1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": - dependencies: - "@babel/code-frame": 7.26.2 - "@babel/core": 7.28.0 - "@babel/types": 7.28.0 - "@tanstack/router-core": 1.125.4 - "@tanstack/router-generator": 1.125.4 - "@tanstack/router-plugin": 1.125.6(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@tanstack/router-utils": 1.121.21 - "@tanstack/server-functions-plugin": 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@tanstack/start-server-core": 1.126.1 - "@types/babel__code-frame": 7.0.6 - "@types/babel__core": 7.20.5 + '@tanstack/start-plugin-core@1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.28.0 + '@babel/types': 7.28.0 + '@tanstack/router-core': 1.125.4 + '@tanstack/router-generator': 1.125.4 + '@tanstack/router-plugin': 1.125.6(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/router-utils': 1.121.21 + '@tanstack/server-functions-plugin': 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/start-server-core': 1.126.1 + '@types/babel__code-frame': 7.0.6 + '@types/babel__core': 7.20.5 babel-dead-code-elimination: 1.0.10 cheerio: 1.1.0 h3: 1.13.0 @@ -13551,23 +10036,23 @@ snapshots: 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/kv" + - '@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/kv' - aws4fetch - better-sqlite3 - drizzle-orm @@ -13582,11 +10067,11 @@ snapshots: - webpack - xml2js - "@tanstack/start-server-core@1.126.1": + '@tanstack/start-server-core@1.126.1': dependencies: - "@tanstack/history": 1.121.34 - "@tanstack/router-core": 1.125.4 - "@tanstack/start-client-core": 1.125.4 + '@tanstack/history': 1.121.34 + '@tanstack/router-core': 1.125.4 + '@tanstack/start-client-core': 1.125.4 h3: 1.13.0 isbot: 5.1.28 jsesc: 3.1.0 @@ -13594,30 +10079,30 @@ snapshots: tiny-warning: 1.0.3 unctx: 2.4.1 - "@tanstack/start-server-functions-client@1.125.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@tanstack/start-server-functions-client@1.125.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@tanstack/server-functions-plugin": 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@tanstack/start-server-functions-fetcher": 1.125.4 + '@tanstack/server-functions-plugin': 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/start-server-functions-fetcher': 1.125.4 transitivePeerDependencies: - supports-color - vite - "@tanstack/start-server-functions-fetcher@1.125.4": + '@tanstack/start-server-functions-fetcher@1.125.4': dependencies: - "@tanstack/router-core": 1.125.4 - "@tanstack/start-client-core": 1.125.4 + '@tanstack/router-core': 1.125.4 + '@tanstack/start-client-core': 1.125.4 - "@tanstack/start-server-functions-server@1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@tanstack/start-server-functions-server@1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@tanstack/server-functions-plugin": 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@tanstack/server-functions-plugin': 1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - "@tanstack/store@0.7.2": {} + '@tanstack/store@0.7.2': {} - "@tanstack/typedoc-config@0.1.0(typescript@5.8.3)": + '@tanstack/typedoc-config@0.1.0(typescript@5.8.3)': dependencies: typedoc: 0.27.9(typescript@5.8.3) typedoc-plugin-frontmatter: 1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.8.3))) @@ -13625,35 +10110,35 @@ snapshots: transitivePeerDependencies: - typescript - "@tanstack/virtual-file-routes@1.121.21": {} + '@tanstack/virtual-file-routes@1.121.21': {} - "@tanstack/vite-config@0.1.0(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@tanstack/vite-config@0.1.0(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.44.2) vite-plugin-dts: 4.2.3(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) vite-plugin-externalize-deps: 0.9.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) vite-tsconfig-paths: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) transitivePeerDependencies: - - "@types/node" + - '@types/node' - rollup - supports-color - typescript - vite - "@testing-library/dom@10.4.0": + '@testing-library/dom@10.4.0': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/runtime": 7.27.6 - "@types/aria-query": 5.0.4 + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.27.6 + '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - "@testing-library/jest-dom@6.6.3": + '@testing-library/jest-dom@6.6.3': dependencies: - "@adobe/css-tools": 4.4.2 + '@adobe/css-tools': 4.4.2 aria-query: 5.3.2 chalk: 3.0.0 css.escape: 1.5.1 @@ -13661,176 +10146,175 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - "@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@babel/runtime": 7.26.10 - "@testing-library/dom": 10.4.0 + '@babel/runtime': 7.26.10 + '@testing-library/dom': 10.4.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) optionalDependencies: - "@types/react": 19.1.8 - "@types/react-dom": 19.1.6(@types/react@19.1.8) + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - "@tybys/wasm-util@0.9.0": + '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 optional: true - "@types/argparse@1.0.38": {} + '@types/argparse@1.0.38': {} - "@types/aria-query@5.0.4": {} + '@types/aria-query@5.0.4': {} - "@types/babel__code-frame@7.0.6": {} + '@types/babel__code-frame@7.0.6': {} - "@types/babel__core@7.20.5": + '@types/babel__core@7.20.5': dependencies: - "@babel/parser": 7.28.0 - "@babel/types": 7.28.0 - "@types/babel__generator": 7.27.0 - "@types/babel__template": 7.4.4 - "@types/babel__traverse": 7.20.7 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 - "@types/babel__generator@7.27.0": + '@types/babel__generator@7.27.0': dependencies: - "@babel/types": 7.28.0 + '@babel/types': 7.28.0 - "@types/babel__template@7.4.4": + '@types/babel__template@7.4.4': dependencies: - "@babel/parser": 7.28.0 - "@babel/types": 7.28.0 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 - "@types/babel__traverse@7.20.7": + '@types/babel__traverse@7.20.7': dependencies: - "@babel/types": 7.28.0 + '@babel/types': 7.28.0 - "@types/body-parser@1.19.5": + '@types/body-parser@1.19.5': dependencies: - "@types/connect": 3.4.38 - "@types/node": 22.16.1 + '@types/connect': 3.4.38 + '@types/node': 22.16.1 - "@types/chai@5.2.2": + '@types/chai@5.2.2': dependencies: - "@types/deep-eql": 4.0.2 + '@types/deep-eql': 4.0.2 - "@types/connect@3.4.38": + '@types/connect@3.4.38': dependencies: - "@types/node": 22.16.1 + '@types/node': 22.16.1 - "@types/conventional-commits-parser@5.0.1": + '@types/conventional-commits-parser@5.0.1': dependencies: - "@types/node": 22.16.1 + '@types/node': 22.16.1 - "@types/cors@2.8.19": + '@types/cors@2.8.19': dependencies: - "@types/node": 22.16.1 + '@types/node': 22.16.1 - "@types/debug@4.1.12": + '@types/debug@4.1.12': dependencies: - "@types/ms": 2.1.0 + '@types/ms': 2.1.0 - "@types/deep-eql@4.0.2": {} + '@types/deep-eql@4.0.2': {} - "@types/estree@1.0.6": {} + '@types/estree@1.0.6': {} - "@types/estree@1.0.8": {} + '@types/estree@1.0.8': {} - "@types/express-serve-static-core@4.19.6": + '@types/express-serve-static-core@4.19.6': dependencies: - "@types/node": 22.16.1 - "@types/qs": 6.14.0 - "@types/range-parser": 1.2.7 - "@types/send": 0.17.5 + '@types/node': 22.16.1 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.5 - "@types/express@4.17.23": + '@types/express@4.17.23': dependencies: - "@types/body-parser": 1.19.5 - "@types/express-serve-static-core": 4.19.6 - "@types/qs": 6.14.0 - "@types/serve-static": 1.15.7 + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.7 - "@types/hast@3.0.4": + '@types/hast@3.0.4': dependencies: - "@types/unist": 3.0.3 + '@types/unist': 3.0.3 - "@types/http-errors@2.0.4": {} + '@types/http-errors@2.0.4': {} - "@types/json-schema@7.0.15": {} + '@types/json-schema@7.0.15': {} - "@types/mime@1.3.5": {} + '@types/mime@1.3.5': {} - "@types/ms@2.1.0": {} + '@types/ms@2.1.0': {} - "@types/node@12.20.55": {} + '@types/node@12.20.55': {} - "@types/node@20.19.5": + '@types/node@20.19.5': dependencies: undici-types: 6.21.0 - optional: true - "@types/node@22.16.1": + '@types/node@22.16.1': dependencies: undici-types: 6.21.0 - "@types/node@24.0.11": + '@types/node@24.0.11': dependencies: undici-types: 7.8.0 optional: true - "@types/normalize-package-data@2.4.4": {} + '@types/normalize-package-data@2.4.4': {} - "@types/pg@8.15.4": + '@types/pg@8.15.4': dependencies: - "@types/node": 22.16.1 + '@types/node': 22.16.1 pg-protocol: 1.8.0 pg-types: 2.2.0 - "@types/qs@6.14.0": {} + '@types/qs@6.14.0': {} - "@types/range-parser@1.2.7": {} + '@types/range-parser@1.2.7': {} - "@types/react-dom@19.1.6(@types/react@19.1.8)": + '@types/react-dom@19.1.6(@types/react@19.1.8)': dependencies: - "@types/react": 19.1.8 + '@types/react': 19.1.8 - "@types/react@19.1.8": + '@types/react@19.1.8': dependencies: csstype: 3.1.3 - "@types/resolve@1.20.2": {} + '@types/resolve@1.20.2': {} - "@types/send@0.17.5": + '@types/send@0.17.5': dependencies: - "@types/mime": 1.3.5 - "@types/node": 22.16.1 + '@types/mime': 1.3.5 + '@types/node': 22.16.1 - "@types/serve-static@1.15.7": + '@types/serve-static@1.15.7': dependencies: - "@types/http-errors": 2.0.4 - "@types/node": 22.16.1 - "@types/send": 0.17.5 + '@types/http-errors': 2.0.4 + '@types/node': 22.16.1 + '@types/send': 0.17.5 - "@types/triple-beam@1.3.5": {} + '@types/triple-beam@1.3.5': {} - "@types/unist@3.0.3": {} + '@types/unist@3.0.3': {} - "@types/use-sync-external-store@0.0.6": {} + '@types/use-sync-external-store@0.0.6': {} - "@types/whatwg-mimetype@3.0.2": + '@types/whatwg-mimetype@3.0.2': optional: true - "@types/yauzl@2.10.3": + '@types/yauzl@2.10.3': dependencies: - "@types/node": 22.16.1 + '@types/node': 22.16.1 optional: true - "@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)": + '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - "@eslint-community/regexpp": 4.12.1 - "@typescript-eslint/parser": 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/scope-manager": 8.36.0 - "@typescript-eslint/type-utils": 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/utils": 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/visitor-keys": 8.36.0 + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.36.0 + '@typescript-eslint/type-utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.36.0 eslint: 9.30.1(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 @@ -13840,40 +10324,40 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)": + '@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - "@typescript-eslint/scope-manager": 8.36.0 - "@typescript-eslint/types": 8.36.0 - "@typescript-eslint/typescript-estree": 8.36.0(typescript@5.8.3) - "@typescript-eslint/visitor-keys": 8.36.0 + '@typescript-eslint/scope-manager': 8.36.0 + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.36.0 debug: 4.4.0 eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/project-service@8.36.0(typescript@5.8.3)": + '@typescript-eslint/project-service@8.36.0(typescript@5.8.3)': dependencies: - "@typescript-eslint/tsconfig-utils": 8.36.0(typescript@5.8.3) - "@typescript-eslint/types": 8.36.0 + '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) + '@typescript-eslint/types': 8.36.0 debug: 4.4.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/scope-manager@8.36.0": + '@typescript-eslint/scope-manager@8.36.0': dependencies: - "@typescript-eslint/types": 8.36.0 - "@typescript-eslint/visitor-keys": 8.36.0 + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/visitor-keys': 8.36.0 - "@typescript-eslint/tsconfig-utils@8.36.0(typescript@5.8.3)": + '@typescript-eslint/tsconfig-utils@8.36.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 - "@typescript-eslint/type-utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)": + '@typescript-eslint/type-utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - "@typescript-eslint/typescript-estree": 8.36.0(typescript@5.8.3) - "@typescript-eslint/utils": 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.1 eslint: 9.30.1(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) @@ -13881,14 +10365,14 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/types@8.36.0": {} + '@typescript-eslint/types@8.36.0': {} - "@typescript-eslint/typescript-estree@8.36.0(typescript@5.8.3)": + '@typescript-eslint/typescript-estree@8.36.0(typescript@5.8.3)': dependencies: - "@typescript-eslint/project-service": 8.36.0(typescript@5.8.3) - "@typescript-eslint/tsconfig-utils": 8.36.0(typescript@5.8.3) - "@typescript-eslint/types": 8.36.0 - "@typescript-eslint/visitor-keys": 8.36.0 + '@typescript-eslint/project-service': 8.36.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.36.0(typescript@5.8.3) + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/visitor-keys': 8.36.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -13899,85 +10383,85 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)": + '@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - "@eslint-community/eslint-utils": 4.7.0(eslint@9.30.1(jiti@2.4.2)) - "@typescript-eslint/scope-manager": 8.36.0 - "@typescript-eslint/types": 8.36.0 - "@typescript-eslint/typescript-estree": 8.36.0(typescript@5.8.3) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.36.0 + '@typescript-eslint/types': 8.36.0 + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/visitor-keys@8.36.0": + '@typescript-eslint/visitor-keys@8.36.0': dependencies: - "@typescript-eslint/types": 8.36.0 + '@typescript-eslint/types': 8.36.0 eslint-visitor-keys: 4.2.1 - "@unrs/resolver-binding-android-arm-eabi@1.11.0": + '@unrs/resolver-binding-android-arm-eabi@1.11.0': optional: true - "@unrs/resolver-binding-android-arm64@1.11.0": + '@unrs/resolver-binding-android-arm64@1.11.0': optional: true - "@unrs/resolver-binding-darwin-arm64@1.11.0": + '@unrs/resolver-binding-darwin-arm64@1.11.0': optional: true - "@unrs/resolver-binding-darwin-x64@1.11.0": + '@unrs/resolver-binding-darwin-x64@1.11.0': optional: true - "@unrs/resolver-binding-freebsd-x64@1.11.0": + '@unrs/resolver-binding-freebsd-x64@1.11.0': optional: true - "@unrs/resolver-binding-linux-arm-gnueabihf@1.11.0": + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.0': optional: true - "@unrs/resolver-binding-linux-arm-musleabihf@1.11.0": + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.0': optional: true - "@unrs/resolver-binding-linux-arm64-gnu@1.11.0": + '@unrs/resolver-binding-linux-arm64-gnu@1.11.0': optional: true - "@unrs/resolver-binding-linux-arm64-musl@1.11.0": + '@unrs/resolver-binding-linux-arm64-musl@1.11.0': optional: true - "@unrs/resolver-binding-linux-ppc64-gnu@1.11.0": + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.0': optional: true - "@unrs/resolver-binding-linux-riscv64-gnu@1.11.0": + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.0': optional: true - "@unrs/resolver-binding-linux-riscv64-musl@1.11.0": + '@unrs/resolver-binding-linux-riscv64-musl@1.11.0': optional: true - "@unrs/resolver-binding-linux-s390x-gnu@1.11.0": + '@unrs/resolver-binding-linux-s390x-gnu@1.11.0': optional: true - "@unrs/resolver-binding-linux-x64-gnu@1.11.0": + '@unrs/resolver-binding-linux-x64-gnu@1.11.0': optional: true - "@unrs/resolver-binding-linux-x64-musl@1.11.0": + '@unrs/resolver-binding-linux-x64-musl@1.11.0': optional: true - "@unrs/resolver-binding-wasm32-wasi@1.11.0": + '@unrs/resolver-binding-wasm32-wasi@1.11.0': dependencies: - "@napi-rs/wasm-runtime": 0.2.11 + '@napi-rs/wasm-runtime': 0.2.11 optional: true - "@unrs/resolver-binding-win32-arm64-msvc@1.11.0": + '@unrs/resolver-binding-win32-arm64-msvc@1.11.0': optional: true - "@unrs/resolver-binding-win32-ia32-msvc@1.11.0": + '@unrs/resolver-binding-win32-ia32-msvc@1.11.0': optional: true - "@unrs/resolver-binding-win32-x64-msvc@1.11.0": + '@unrs/resolver-binding-win32-x64-msvc@1.11.0': optional: true - "@vercel/nft@0.29.4(rollup@4.44.2)": + '@vercel/nft@0.29.4(rollup@4.44.2)': dependencies: - "@mapbox/node-pre-gyp": 2.0.0 - "@rollup/pluginutils": 5.2.0(rollup@4.44.2) + '@mapbox/node-pre-gyp': 2.0.0 + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -13993,26 +10477,38 @@ snapshots: - rollup - supports-color - "@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@babel/core": 7.28.0 - "@babel/plugin-transform-react-jsx-self": 7.27.1(@babel/core@7.28.0) - "@babel/plugin-transform-react-jsx-source": 7.27.1(@babel/core@7.28.0) - "@rolldown/pluginutils": 1.0.0-beta.19 - "@types/babel__core": 7.20.5 + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) + '@rolldown/pluginutils': 1.0.0-beta.19 + '@types/babel__core': 7.20.5 react-refresh: 0.17.0 vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - supports-color - "@vitejs/plugin-vue@5.2.4(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))": + '@vitejs/plugin-react@4.6.0(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) + '@rolldown/pluginutils': 1.0.0-beta.19 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.2.4(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': dependencies: vite: 7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) vue: 3.5.17(typescript@5.8.3) - "@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@istanbuljs/schema": 0.1.3 + '@istanbuljs/schema': 0.1.3 debug: 4.4.1 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 @@ -14026,109 +10522,138 @@ snapshots: transitivePeerDependencies: - supports-color - "@vitest/expect@3.2.4": + '@vitest/expect@1.6.1': + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + + '@vitest/expect@3.2.4': dependencies: - "@types/chai": 5.2.2 - "@vitest/spy": 3.2.4 - "@vitest/utils": 3.2.4 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 tinyrainbow: 2.0.0 - "@vitest/mocker@3.2.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@vitest/spy": 3.2.4 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - "@vitest/mocker@3.2.4(vite@6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))": + '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - "@vitest/spy": 3.2.4 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: vite: 6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - "@vitest/pretty-format@3.2.4": + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - "@vitest/runner@3.2.4": + '@vitest/runner@1.6.1': + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/runner@3.2.4': dependencies: - "@vitest/utils": 3.2.4 + '@vitest/utils': 3.2.4 pathe: 2.0.3 strip-literal: 3.0.0 - "@vitest/snapshot@3.2.4": + '@vitest/snapshot@1.6.1': + dependencies: + magic-string: 0.30.17 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/snapshot@3.2.4': dependencies: - "@vitest/pretty-format": 3.2.4 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 - "@vitest/spy@3.2.4": + '@vitest/spy@1.6.1': + dependencies: + tinyspy: 2.2.1 + + '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.3 - "@vitest/utils@3.2.4": + '@vitest/utils@1.6.1': dependencies: - "@vitest/pretty-format": 3.2.4 + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 loupe: 3.1.4 tinyrainbow: 2.0.0 - "@volar/language-core@2.4.17": + '@volar/language-core@2.4.17': dependencies: - "@volar/source-map": 2.4.17 + '@volar/source-map': 2.4.17 - "@volar/source-map@2.4.17": {} + '@volar/source-map@2.4.17': {} - "@volar/typescript@2.4.17": + '@volar/typescript@2.4.17': dependencies: - "@volar/language-core": 2.4.17 + '@volar/language-core': 2.4.17 path-browserify: 1.0.1 vscode-uri: 3.1.0 - "@vue/compiler-core@3.5.17": + '@vue/compiler-core@3.5.17': dependencies: - "@babel/parser": 7.28.0 - "@vue/shared": 3.5.17 + '@babel/parser': 7.28.0 + '@vue/shared': 3.5.17 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - "@vue/compiler-dom@3.5.17": + '@vue/compiler-dom@3.5.17': dependencies: - "@vue/compiler-core": 3.5.17 - "@vue/shared": 3.5.17 + '@vue/compiler-core': 3.5.17 + '@vue/shared': 3.5.17 - "@vue/compiler-sfc@3.5.17": + '@vue/compiler-sfc@3.5.17': dependencies: - "@babel/parser": 7.28.0 - "@vue/compiler-core": 3.5.17 - "@vue/compiler-dom": 3.5.17 - "@vue/compiler-ssr": 3.5.17 - "@vue/shared": 3.5.17 + '@babel/parser': 7.28.0 + '@vue/compiler-core': 3.5.17 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.6 source-map-js: 1.2.1 - "@vue/compiler-ssr@3.5.17": + '@vue/compiler-ssr@3.5.17': dependencies: - "@vue/compiler-dom": 3.5.17 - "@vue/shared": 3.5.17 + '@vue/compiler-dom': 3.5.17 + '@vue/shared': 3.5.17 - "@vue/compiler-vue2@2.7.16": + '@vue/compiler-vue2@2.7.16': dependencies: de-indent: 1.0.2 he: 1.2.0 - "@vue/language-core@2.1.6(typescript@5.8.3)": + '@vue/language-core@2.1.6(typescript@5.8.3)': dependencies: - "@volar/language-core": 2.4.17 - "@vue/compiler-dom": 3.5.17 - "@vue/compiler-vue2": 2.7.16 - "@vue/shared": 3.5.17 + '@volar/language-core': 2.4.17 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.17 computeds: 0.0.1 minimatch: 9.0.5 muggle-string: 0.4.1 @@ -14136,56 +10661,69 @@ snapshots: optionalDependencies: typescript: 5.8.3 - "@vue/reactivity@3.5.17": + '@vue/language-core@2.2.0(typescript@5.8.3)': + dependencies: + '@volar/language-core': 2.4.17 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.17 + alien-signals: 0.4.14 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.8.3 + + '@vue/reactivity@3.5.17': dependencies: - "@vue/shared": 3.5.17 + '@vue/shared': 3.5.17 - "@vue/runtime-core@3.5.17": + '@vue/runtime-core@3.5.17': dependencies: - "@vue/reactivity": 3.5.17 - "@vue/shared": 3.5.17 + '@vue/reactivity': 3.5.17 + '@vue/shared': 3.5.17 - "@vue/runtime-dom@3.5.17": + '@vue/runtime-dom@3.5.17': dependencies: - "@vue/reactivity": 3.5.17 - "@vue/runtime-core": 3.5.17 - "@vue/shared": 3.5.17 + '@vue/reactivity': 3.5.17 + '@vue/runtime-core': 3.5.17 + '@vue/shared': 3.5.17 csstype: 3.1.3 - "@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))": + '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))': dependencies: - "@vue/compiler-ssr": 3.5.17 - "@vue/shared": 3.5.17 + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 vue: 3.5.17(typescript@5.8.3) - "@vue/shared@3.5.17": {} + '@vue/shared@3.5.17': {} - "@whatwg-node/disposablestack@0.0.6": + '@whatwg-node/disposablestack@0.0.6': dependencies: - "@whatwg-node/promise-helpers": 1.3.2 + '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 - "@whatwg-node/fetch@0.10.8": + '@whatwg-node/fetch@0.10.8': dependencies: - "@whatwg-node/node-fetch": 0.7.21 + '@whatwg-node/node-fetch': 0.7.21 urlpattern-polyfill: 10.1.0 - "@whatwg-node/node-fetch@0.7.21": + '@whatwg-node/node-fetch@0.7.21': dependencies: - "@fastify/busboy": 3.1.1 - "@whatwg-node/disposablestack": 0.0.6 - "@whatwg-node/promise-helpers": 1.3.2 + '@fastify/busboy': 3.1.1 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 - "@whatwg-node/promise-helpers@1.3.2": + '@whatwg-node/promise-helpers@1.3.2': dependencies: tslib: 2.8.1 - "@whatwg-node/server@0.9.71": + '@whatwg-node/server@0.9.71': dependencies: - "@whatwg-node/disposablestack": 0.0.6 - "@whatwg-node/fetch": 0.10.8 - "@whatwg-node/promise-helpers": 1.3.2 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.8 + '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 JSONStream@1.3.5: @@ -14212,6 +10750,10 @@ snapshots: dependencies: acorn: 8.15.0 + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + acorn@8.15.0: {} agent-base@7.1.3: {} @@ -14245,6 +10787,8 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + alien-signals@0.4.14: {} + ansi-colors@4.1.3: {} ansi-escapes@7.0.0: @@ -14365,6 +10909,8 @@ snapshots: get-intrinsic: 1.2.7 is-array-buffer: 3.0.5 + assertion-error@1.1.0: {} + assertion-error@2.0.1: {} ast-module-types@6.0.1: {} @@ -14387,13 +10933,28 @@ snapshots: babel-dead-code-elimination@1.0.10: dependencies: - "@babel/core": 7.28.0 - "@babel/parser": 7.28.0 - "@babel/traverse": 7.28.0 - "@babel/types": 7.28.0 + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color + babel-plugin-jsx-dom-expressions@0.39.8(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.0 + html-entities: 2.3.3 + parse5: 7.3.0 + validate-html-nesting: 1.2.3 + + babel-preset-solid@1.9.6(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + babel-plugin-jsx-dom-expressions: 0.39.8(@babel/core@7.28.0) + balanced-match@1.0.2: {} bare-events@2.6.0: @@ -14522,6 +11083,16 @@ snapshots: caniuse-lite@1.0.30001727: {} + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + chai@5.2.0: dependencies: assertion-error: 2.0.1 @@ -14544,6 +11115,10 @@ snapshots: chardet@0.7.0: {} + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + check-error@2.1.1: {} cheerio-select@2.1.0: @@ -14614,6 +11189,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clsx@2.1.1: {} + cluster-key-slot@1.1.2: {} color-convert@1.9.3: @@ -14729,6 +11306,10 @@ snapshots: cookie@1.0.2: {} + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + copy-file@11.0.0: dependencies: graceful-fs: 4.2.11 @@ -14786,7 +11367,7 @@ snapshots: cssstyle@4.2.1: dependencies: - "@asamuzakjp/css-color": 2.8.3 + '@asamuzakjp/css-color': 2.8.3 rrweb-cssom: 0.8.0 csstype@3.1.3: {} @@ -14847,6 +11428,10 @@ snapshots: decimal.js@10.5.0: {} + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -14921,7 +11506,7 @@ snapshots: detective-typescript@14.0.0(typescript@5.8.3): dependencies: - "@typescript-eslint/typescript-estree": 8.36.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) ast-module-types: 6.0.1 node-source-walk: 7.0.1 typescript: 5.8.3 @@ -14930,8 +11515,8 @@ snapshots: detective-vue2@2.2.0(typescript@5.8.3): dependencies: - "@dependents/detective-less": 5.0.1 - "@vue/compiler-sfc": 3.5.17 + '@dependents/detective-less': 5.0.1 + '@vue/compiler-sfc': 3.5.17 detective-es6: 5.0.1 detective-sass: 6.0.1 detective-scss: 5.0.1 @@ -14941,6 +11526,8 @@ snapshots: transitivePeerDependencies: - supports-color + diff-sequences@29.6.3: {} + diff@8.0.2: {} dir-glob@3.0.1: @@ -14985,8 +11572,8 @@ snapshots: drizzle-kit@0.30.6: dependencies: - "@drizzle-team/brocli": 0.10.2 - "@esbuild-kit/esm-loader": 2.6.5 + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 esbuild: 0.19.12 esbuild-register: 3.6.0(esbuild@0.19.12) gel: 2.1.1 @@ -14995,7 +11582,7 @@ snapshots: drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7): optionalDependencies: - "@types/pg": 8.15.4 + '@types/pg': 8.15.4 gel: 2.1.1 kysely: 0.28.2 pg: 8.16.3 @@ -15059,6 +11646,10 @@ snapshots: environment@1.1.0: {} + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + error-stack-parser-es@1.0.5: {} es-abstract@1.23.9: @@ -15161,6 +11752,16 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esbuild-plugin-solid@0.5.0(esbuild@0.25.6)(solid-js@1.9.7): + dependencies: + '@babel/core': 7.28.0 + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) + babel-preset-solid: 1.9.6(@babel/core@7.28.0) + esbuild: 0.25.6 + solid-js: 1.9.7 + transitivePeerDependencies: + - supports-color + esbuild-register@3.6.0(esbuild@0.19.12): dependencies: debug: 4.4.1 @@ -15170,167 +11771,193 @@ snapshots: esbuild@0.18.20: optionalDependencies: - "@esbuild/android-arm": 0.18.20 - "@esbuild/android-arm64": 0.18.20 - "@esbuild/android-x64": 0.18.20 - "@esbuild/darwin-arm64": 0.18.20 - "@esbuild/darwin-x64": 0.18.20 - "@esbuild/freebsd-arm64": 0.18.20 - "@esbuild/freebsd-x64": 0.18.20 - "@esbuild/linux-arm": 0.18.20 - "@esbuild/linux-arm64": 0.18.20 - "@esbuild/linux-ia32": 0.18.20 - "@esbuild/linux-loong64": 0.18.20 - "@esbuild/linux-mips64el": 0.18.20 - "@esbuild/linux-ppc64": 0.18.20 - "@esbuild/linux-riscv64": 0.18.20 - "@esbuild/linux-s390x": 0.18.20 - "@esbuild/linux-x64": 0.18.20 - "@esbuild/netbsd-x64": 0.18.20 - "@esbuild/openbsd-x64": 0.18.20 - "@esbuild/sunos-x64": 0.18.20 - "@esbuild/win32-arm64": 0.18.20 - "@esbuild/win32-ia32": 0.18.20 - "@esbuild/win32-x64": 0.18.20 + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 esbuild@0.19.12: optionalDependencies: - "@esbuild/aix-ppc64": 0.19.12 - "@esbuild/android-arm": 0.19.12 - "@esbuild/android-arm64": 0.19.12 - "@esbuild/android-x64": 0.19.12 - "@esbuild/darwin-arm64": 0.19.12 - "@esbuild/darwin-x64": 0.19.12 - "@esbuild/freebsd-arm64": 0.19.12 - "@esbuild/freebsd-x64": 0.19.12 - "@esbuild/linux-arm": 0.19.12 - "@esbuild/linux-arm64": 0.19.12 - "@esbuild/linux-ia32": 0.19.12 - "@esbuild/linux-loong64": 0.19.12 - "@esbuild/linux-mips64el": 0.19.12 - "@esbuild/linux-ppc64": 0.19.12 - "@esbuild/linux-riscv64": 0.19.12 - "@esbuild/linux-s390x": 0.19.12 - "@esbuild/linux-x64": 0.19.12 - "@esbuild/netbsd-x64": 0.19.12 - "@esbuild/openbsd-x64": 0.19.12 - "@esbuild/sunos-x64": 0.19.12 - "@esbuild/win32-arm64": 0.19.12 - "@esbuild/win32-ia32": 0.19.12 - "@esbuild/win32-x64": 0.19.12 + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 esbuild@0.25.0: optionalDependencies: - "@esbuild/aix-ppc64": 0.25.0 - "@esbuild/android-arm": 0.25.0 - "@esbuild/android-arm64": 0.25.0 - "@esbuild/android-x64": 0.25.0 - "@esbuild/darwin-arm64": 0.25.0 - "@esbuild/darwin-x64": 0.25.0 - "@esbuild/freebsd-arm64": 0.25.0 - "@esbuild/freebsd-x64": 0.25.0 - "@esbuild/linux-arm": 0.25.0 - "@esbuild/linux-arm64": 0.25.0 - "@esbuild/linux-ia32": 0.25.0 - "@esbuild/linux-loong64": 0.25.0 - "@esbuild/linux-mips64el": 0.25.0 - "@esbuild/linux-ppc64": 0.25.0 - "@esbuild/linux-riscv64": 0.25.0 - "@esbuild/linux-s390x": 0.25.0 - "@esbuild/linux-x64": 0.25.0 - "@esbuild/netbsd-arm64": 0.25.0 - "@esbuild/netbsd-x64": 0.25.0 - "@esbuild/openbsd-arm64": 0.25.0 - "@esbuild/openbsd-x64": 0.25.0 - "@esbuild/sunos-x64": 0.25.0 - "@esbuild/win32-arm64": 0.25.0 - "@esbuild/win32-ia32": 0.25.0 - "@esbuild/win32-x64": 0.25.0 + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 esbuild@0.25.1: optionalDependencies: - "@esbuild/aix-ppc64": 0.25.1 - "@esbuild/android-arm": 0.25.1 - "@esbuild/android-arm64": 0.25.1 - "@esbuild/android-x64": 0.25.1 - "@esbuild/darwin-arm64": 0.25.1 - "@esbuild/darwin-x64": 0.25.1 - "@esbuild/freebsd-arm64": 0.25.1 - "@esbuild/freebsd-x64": 0.25.1 - "@esbuild/linux-arm": 0.25.1 - "@esbuild/linux-arm64": 0.25.1 - "@esbuild/linux-ia32": 0.25.1 - "@esbuild/linux-loong64": 0.25.1 - "@esbuild/linux-mips64el": 0.25.1 - "@esbuild/linux-ppc64": 0.25.1 - "@esbuild/linux-riscv64": 0.25.1 - "@esbuild/linux-s390x": 0.25.1 - "@esbuild/linux-x64": 0.25.1 - "@esbuild/netbsd-arm64": 0.25.1 - "@esbuild/netbsd-x64": 0.25.1 - "@esbuild/openbsd-arm64": 0.25.1 - "@esbuild/openbsd-x64": 0.25.1 - "@esbuild/sunos-x64": 0.25.1 - "@esbuild/win32-arm64": 0.25.1 - "@esbuild/win32-ia32": 0.25.1 - "@esbuild/win32-x64": 0.25.1 + '@esbuild/aix-ppc64': 0.25.1 + '@esbuild/android-arm': 0.25.1 + '@esbuild/android-arm64': 0.25.1 + '@esbuild/android-x64': 0.25.1 + '@esbuild/darwin-arm64': 0.25.1 + '@esbuild/darwin-x64': 0.25.1 + '@esbuild/freebsd-arm64': 0.25.1 + '@esbuild/freebsd-x64': 0.25.1 + '@esbuild/linux-arm': 0.25.1 + '@esbuild/linux-arm64': 0.25.1 + '@esbuild/linux-ia32': 0.25.1 + '@esbuild/linux-loong64': 0.25.1 + '@esbuild/linux-mips64el': 0.25.1 + '@esbuild/linux-ppc64': 0.25.1 + '@esbuild/linux-riscv64': 0.25.1 + '@esbuild/linux-s390x': 0.25.1 + '@esbuild/linux-x64': 0.25.1 + '@esbuild/netbsd-arm64': 0.25.1 + '@esbuild/netbsd-x64': 0.25.1 + '@esbuild/openbsd-arm64': 0.25.1 + '@esbuild/openbsd-x64': 0.25.1 + '@esbuild/sunos-x64': 0.25.1 + '@esbuild/win32-arm64': 0.25.1 + '@esbuild/win32-ia32': 0.25.1 + '@esbuild/win32-x64': 0.25.1 esbuild@0.25.5: optionalDependencies: - "@esbuild/aix-ppc64": 0.25.5 - "@esbuild/android-arm": 0.25.5 - "@esbuild/android-arm64": 0.25.5 - "@esbuild/android-x64": 0.25.5 - "@esbuild/darwin-arm64": 0.25.5 - "@esbuild/darwin-x64": 0.25.5 - "@esbuild/freebsd-arm64": 0.25.5 - "@esbuild/freebsd-x64": 0.25.5 - "@esbuild/linux-arm": 0.25.5 - "@esbuild/linux-arm64": 0.25.5 - "@esbuild/linux-ia32": 0.25.5 - "@esbuild/linux-loong64": 0.25.5 - "@esbuild/linux-mips64el": 0.25.5 - "@esbuild/linux-ppc64": 0.25.5 - "@esbuild/linux-riscv64": 0.25.5 - "@esbuild/linux-s390x": 0.25.5 - "@esbuild/linux-x64": 0.25.5 - "@esbuild/netbsd-arm64": 0.25.5 - "@esbuild/netbsd-x64": 0.25.5 - "@esbuild/openbsd-arm64": 0.25.5 - "@esbuild/openbsd-x64": 0.25.5 - "@esbuild/sunos-x64": 0.25.5 - "@esbuild/win32-arm64": 0.25.5 - "@esbuild/win32-ia32": 0.25.5 - "@esbuild/win32-x64": 0.25.5 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 esbuild@0.25.6: optionalDependencies: - "@esbuild/aix-ppc64": 0.25.6 - "@esbuild/android-arm": 0.25.6 - "@esbuild/android-arm64": 0.25.6 - "@esbuild/android-x64": 0.25.6 - "@esbuild/darwin-arm64": 0.25.6 - "@esbuild/darwin-x64": 0.25.6 - "@esbuild/freebsd-arm64": 0.25.6 - "@esbuild/freebsd-x64": 0.25.6 - "@esbuild/linux-arm": 0.25.6 - "@esbuild/linux-arm64": 0.25.6 - "@esbuild/linux-ia32": 0.25.6 - "@esbuild/linux-loong64": 0.25.6 - "@esbuild/linux-mips64el": 0.25.6 - "@esbuild/linux-ppc64": 0.25.6 - "@esbuild/linux-riscv64": 0.25.6 - "@esbuild/linux-s390x": 0.25.6 - "@esbuild/linux-x64": 0.25.6 - "@esbuild/netbsd-arm64": 0.25.6 - "@esbuild/netbsd-x64": 0.25.6 - "@esbuild/openbsd-arm64": 0.25.6 - "@esbuild/openbsd-x64": 0.25.6 - "@esbuild/openharmony-arm64": 0.25.6 - "@esbuild/sunos-x64": 0.25.6 - "@esbuild/win32-arm64": 0.25.6 - "@esbuild/win32-ia32": 0.25.6 - "@esbuild/win32-x64": 0.25.6 + '@esbuild/aix-ppc64': 0.25.6 + '@esbuild/android-arm': 0.25.6 + '@esbuild/android-arm64': 0.25.6 + '@esbuild/android-x64': 0.25.6 + '@esbuild/darwin-arm64': 0.25.6 + '@esbuild/darwin-x64': 0.25.6 + '@esbuild/freebsd-arm64': 0.25.6 + '@esbuild/freebsd-x64': 0.25.6 + '@esbuild/linux-arm': 0.25.6 + '@esbuild/linux-arm64': 0.25.6 + '@esbuild/linux-ia32': 0.25.6 + '@esbuild/linux-loong64': 0.25.6 + '@esbuild/linux-mips64el': 0.25.6 + '@esbuild/linux-ppc64': 0.25.6 + '@esbuild/linux-riscv64': 0.25.6 + '@esbuild/linux-s390x': 0.25.6 + '@esbuild/linux-x64': 0.25.6 + '@esbuild/netbsd-arm64': 0.25.6 + '@esbuild/netbsd-x64': 0.25.6 + '@esbuild/openbsd-arm64': 0.25.6 + '@esbuild/openbsd-x64': 0.25.6 + '@esbuild/openharmony-arm64': 0.25.6 + '@esbuild/sunos-x64': 0.25.6 + '@esbuild/win32-arm64': 0.25.6 + '@esbuild/win32-ia32': 0.25.6 + '@esbuild/win32-x64': 0.25.6 escalade@3.2.0: {} @@ -15375,14 +12002,14 @@ snapshots: eslint-plugin-es-x@7.8.0(eslint@9.30.1(jiti@2.4.2)): dependencies: - "@eslint-community/eslint-utils": 4.7.0(eslint@9.30.1(jiti@2.4.2)) - "@eslint-community/regexpp": 4.12.1 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 eslint: 9.30.1(jiti@2.4.2) eslint-compat-utils: 0.5.1(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@9.30.1(jiti@2.4.2)): dependencies: - "@typescript-eslint/types": 8.36.0 + '@typescript-eslint/types': 8.36.0 comment-parser: 1.4.1 debug: 4.4.1 eslint: 9.30.1(jiti@2.4.2) @@ -15393,14 +12020,14 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.0 optionalDependencies: - "@typescript-eslint/utils": 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color eslint-plugin-n@17.21.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): dependencies: - "@eslint-community/eslint-utils": 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) enhanced-resolve: 5.18.2 eslint: 9.30.1(jiti@2.4.2) eslint-plugin-es-x: 7.8.0(eslint@9.30.1(jiti@2.4.2)) @@ -15468,19 +12095,19 @@ snapshots: eslint@9.30.1(jiti@2.4.2): dependencies: - "@eslint-community/eslint-utils": 4.5.1(eslint@9.30.1(jiti@2.4.2)) - "@eslint-community/regexpp": 4.12.1 - "@eslint/config-array": 0.21.0 - "@eslint/config-helpers": 0.3.0 - "@eslint/core": 0.14.0 - "@eslint/eslintrc": 3.3.1 - "@eslint/js": 9.30.1 - "@eslint/plugin-kit": 0.3.3 - "@humanfs/node": 0.16.6 - "@humanwhocodes/module-importer": 1.0.1 - "@humanwhocodes/retry": 0.4.2 - "@types/estree": 1.0.6 - "@types/json-schema": 7.0.15 + '@eslint-community/eslint-utils': 4.5.1(eslint@9.30.1(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.30.1 + '@eslint/plugin-kit': 0.3.3 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -15536,7 +12163,7 @@ snapshots: estree-walker@3.0.3: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -15624,7 +12251,7 @@ snapshots: get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - "@types/yauzl": 2.10.3 + '@types/yauzl': 2.10.3 transitivePeerDependencies: - supports-color @@ -15636,8 +12263,8 @@ snapshots: fast-glob@3.3.3: dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 @@ -15748,7 +12375,6 @@ snapshots: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - optional: true fs-extra@7.0.1: dependencies: @@ -15780,7 +12406,7 @@ snapshots: gel@2.1.1: dependencies: - "@petamoriken/float16": 3.9.2 + '@petamoriken/float16': 3.9.2 debug: 4.4.1 env-paths: 3.0.0 semver: 7.7.2 @@ -15800,6 +12426,8 @@ snapshots: get-east-asian-width@1.3.0: {} + get-func-name@2.0.2: {} + get-intrinsic@1.2.7: dependencies: call-bind-apply-helpers: 1.0.2 @@ -15905,7 +12533,7 @@ snapshots: globby@14.1.0: dependencies: - "@sindresorhus/merge-streams": 2.3.0 + '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.3 ignore: 7.0.5 path-type: 6.0.0 @@ -15918,6 +12546,10 @@ snapshots: dependencies: minimist: 1.2.8 + goober@2.1.16(csstype@3.1.3): + dependencies: + csstype: 3.1.3 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -15955,8 +12587,8 @@ snapshots: happy-dom@18.0.1: dependencies: - "@types/node": 20.19.5 - "@types/whatwg-mimetype": 3.0.2 + '@types/node': 20.19.5 + '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 optional: true @@ -15986,6 +12618,8 @@ snapshots: hookable@5.5.3: {} + hosted-git-info@2.8.9: {} + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -15994,6 +12628,8 @@ snapshots: dependencies: whatwg-encoding: 3.1.1 + html-entities@2.3.3: {} + html-escaper@2.0.2: {} htmlparser2@10.0.0: @@ -16074,7 +12710,7 @@ snapshots: ioredis@5.6.1: dependencies: - "@ioredis/commands": 1.2.0 + '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 debug: 4.4.1 denque: 2.1.0 @@ -16096,6 +12732,8 @@ snapshots: call-bound: 1.0.3 get-intrinsic: 1.2.7 + is-arrayish@0.2.1: {} + is-arrayish@0.3.2: {} is-async-function@2.1.1: @@ -16194,7 +12832,7 @@ snapshots: is-reference@1.2.1: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 is-regex@1.2.1: dependencies: @@ -16255,6 +12893,8 @@ snapshots: call-bound: 1.0.3 get-intrinsic: 1.2.7 + is-what@4.1.16: {} + is-windows@1.0.2: {} is-wsl@2.2.0: @@ -16283,9 +12923,9 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - "@babel/core": 7.28.0 - "@babel/parser": 7.26.10 - "@istanbuljs/schema": 0.1.3 + '@babel/core': 7.28.0 + '@babel/parser': 7.26.10 + '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.1 transitivePeerDependencies: @@ -16299,7 +12939,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - "@jridgewell/trace-mapping": 0.3.25 + '@jridgewell/trace-mapping': 0.3.25 debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -16321,9 +12961,9 @@ snapshots: jackspeak@3.4.3: dependencies: - "@isaacs/cliui": 8.0.2 + '@isaacs/cliui': 8.0.2 optionalDependencies: - "@pkgjs/parseargs": 0.11.0 + '@pkgjs/parseargs': 0.11.0 jiti@2.4.2: {} @@ -16375,6 +13015,8 @@ snapshots: json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -16508,8 +13150,8 @@ snapshots: listhen@1.9.0: dependencies: - "@parcel/watcher": 2.5.1 - "@parcel/watcher-wasm": 2.5.1 + '@parcel/watcher': 2.5.1 + '@parcel/watcher-wasm': 2.5.1 citty: 0.1.6 clipboardy: 4.0.0 consola: 3.4.2 @@ -16587,8 +13229,8 @@ snapshots: logform@2.7.0: dependencies: - "@colors/colors": 1.6.0 - "@types/triple-beam": 1.3.5 + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 fecha: 4.2.3 ms: 2.1.3 safe-stable-stringify: 2.5.0 @@ -16598,6 +13240,10 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + loupe@3.1.3: {} loupe@3.1.4: {} @@ -16620,12 +13266,12 @@ snapshots: magic-string@0.30.17: dependencies: - "@jridgewell/sourcemap-codec": 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 magicast@0.3.5: dependencies: - "@babel/parser": 7.26.10 - "@babel/types": 7.26.10 + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 source-map-js: 1.2.1 make-dir@4.0.0: @@ -16647,8 +13293,14 @@ snapshots: media-typer@0.3.0: {} + memorystream@0.3.1: {} + meow@12.1.1: {} + merge-anything@5.1.7: + dependencies: + is-what: 4.1.16 + merge-descriptors@1.0.3: {} merge-options@3.0.4: @@ -16694,7 +13346,7 @@ snapshots: minimatch@10.0.3: dependencies: - "@isaacs/brace-expansion": 5.0.0 + '@isaacs/brace-expansion': 5.0.0 minimatch@3.0.8: dependencies: @@ -16762,7 +13414,7 @@ snapshots: netlify@13.3.5: dependencies: - "@netlify/open-api": 2.37.0 + '@netlify/open-api': 2.37.0 lodash-es: 4.17.21 micro-api-client: 3.3.0 node-fetch: 3.3.2 @@ -16773,16 +13425,16 @@ snapshots: nitropack@2.11.13(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7)): dependencies: - "@cloudflare/kv-asset-handler": 0.4.0 - "@netlify/functions": 3.1.10(rollup@4.44.2) - "@rollup/plugin-alias": 5.1.1(rollup@4.44.2) - "@rollup/plugin-commonjs": 28.0.6(rollup@4.44.2) - "@rollup/plugin-inject": 5.0.5(rollup@4.44.2) - "@rollup/plugin-json": 6.1.0(rollup@4.44.2) - "@rollup/plugin-node-resolve": 16.0.1(rollup@4.44.2) - "@rollup/plugin-replace": 6.0.2(rollup@4.44.2) - "@rollup/plugin-terser": 0.4.4(rollup@4.44.2) - "@vercel/nft": 0.29.4(rollup@4.44.2) + '@cloudflare/kv-asset-handler': 0.4.0 + '@netlify/functions': 3.1.10(rollup@4.44.2) + '@rollup/plugin-alias': 5.1.1(rollup@4.44.2) + '@rollup/plugin-commonjs': 28.0.6(rollup@4.44.2) + '@rollup/plugin-inject': 5.0.5(rollup@4.44.2) + '@rollup/plugin-json': 6.1.0(rollup@4.44.2) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.44.2) + '@rollup/plugin-replace': 6.0.2(rollup@4.44.2) + '@rollup/plugin-terser': 0.4.4(rollup@4.44.2) + '@vercel/nft': 0.29.4(rollup@4.44.2) archiver: 7.0.1 c12: 3.0.4(magicast@0.3.5) chokidar: 4.0.3 @@ -16845,21 +13497,21 @@ snapshots: youch: 4.1.0-beta.8 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/kv" + - '@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/kv' - aws4fetch - better-sqlite3 - drizzle-orm @@ -16897,12 +13549,19 @@ snapshots: node-source-walk@7.0.1: dependencies: - "@babel/parser": 7.28.0 + '@babel/parser': 7.28.0 nopt@8.1.0: dependencies: abbrev: 3.0.1 + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.10 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 @@ -16915,6 +13574,16 @@ snapshots: normalize-path@3.0.0: {} + npm-run-all2@5.0.2: + dependencies: + ansi-styles: 5.2.0 + cross-spawn: 7.0.6 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.5.0 + read-pkg: 5.2.0 + shell-quote: 1.8.3 + npm-run-path@2.0.2: dependencies: path-key: 2.0.1 @@ -17050,6 +13719,10 @@ snapshots: dependencies: yocto-queue: 1.2.1 + p-limit@5.0.0: + dependencies: + yocto-queue: 1.2.1 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -17088,9 +13761,16 @@ snapshots: parse-gitignore@2.0.0: {} + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parse-json@8.3.0: dependencies: - "@babel/code-frame": 7.27.1 + '@babel/code-frame': 7.27.1 index-to-position: 1.1.0 type-fest: 4.41.0 @@ -17142,6 +13822,8 @@ snapshots: pathe@2.0.3: {} + pathval@1.1.1: {} + pathval@2.0.0: {} pend@1.2.0: {} @@ -17191,6 +13873,8 @@ snapshots: picomatch@4.0.2: {} + pidtree@0.5.0: {} + pidtree@0.6.0: {} pify@4.0.1: {} @@ -17247,7 +13931,7 @@ snapshots: precinct@12.2.0: dependencies: - "@dependents/detective-less": 5.0.1 + '@dependents/detective-less': 5.0.1 commander: 12.1.0 detective-amd: 6.0.1 detective-cjs: 6.0.1 @@ -17283,6 +13967,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + process-nextick-args@2.0.1: {} process@0.11.10: {} @@ -17300,7 +13990,7 @@ snapshots: publint@0.3.12: dependencies: - "@publint/pack": 0.1.2 + '@publint/pack': 0.1.2 package-manager-detector: 1.3.0 picocolors: 1.1.1 sade: 1.8.1 @@ -17353,6 +14043,8 @@ snapshots: react-is@17.0.2: {} + react-is@18.3.1: {} + react-refresh@0.17.0: {} react@19.1.0: {} @@ -17363,9 +14055,16 @@ snapshots: read-pkg: 9.0.1 type-fest: 4.41.0 + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + read-pkg@9.0.1: dependencies: - "@types/normalize-package-data": 2.4.4 + '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 parse-json: 8.3.0 type-fest: 4.41.0 @@ -17457,6 +14156,8 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + remove-accents@0.5.0: {} + remove-trailing-separator@1.1.0: {} require-directory@2.1.1: {} @@ -17494,7 +14195,7 @@ snapshots: rollup-plugin-preserve-directives@0.4.0(rollup@4.44.2): dependencies: - "@rollup/pluginutils": 5.2.0(rollup@4.44.2) + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) magic-string: 0.30.17 rollup: 4.44.2 @@ -17509,53 +14210,53 @@ snapshots: rollup@4.34.8: dependencies: - "@types/estree": 1.0.6 + '@types/estree': 1.0.6 optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.34.8 - "@rollup/rollup-android-arm64": 4.34.8 - "@rollup/rollup-darwin-arm64": 4.34.8 - "@rollup/rollup-darwin-x64": 4.34.8 - "@rollup/rollup-freebsd-arm64": 4.34.8 - "@rollup/rollup-freebsd-x64": 4.34.8 - "@rollup/rollup-linux-arm-gnueabihf": 4.34.8 - "@rollup/rollup-linux-arm-musleabihf": 4.34.8 - "@rollup/rollup-linux-arm64-gnu": 4.34.8 - "@rollup/rollup-linux-arm64-musl": 4.34.8 - "@rollup/rollup-linux-loongarch64-gnu": 4.34.8 - "@rollup/rollup-linux-powerpc64le-gnu": 4.34.8 - "@rollup/rollup-linux-riscv64-gnu": 4.34.8 - "@rollup/rollup-linux-s390x-gnu": 4.34.8 - "@rollup/rollup-linux-x64-gnu": 4.34.8 - "@rollup/rollup-linux-x64-musl": 4.34.8 - "@rollup/rollup-win32-arm64-msvc": 4.34.8 - "@rollup/rollup-win32-ia32-msvc": 4.34.8 - "@rollup/rollup-win32-x64-msvc": 4.34.8 + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 fsevents: 2.3.3 rollup@4.44.2: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.44.2 - "@rollup/rollup-android-arm64": 4.44.2 - "@rollup/rollup-darwin-arm64": 4.44.2 - "@rollup/rollup-darwin-x64": 4.44.2 - "@rollup/rollup-freebsd-arm64": 4.44.2 - "@rollup/rollup-freebsd-x64": 4.44.2 - "@rollup/rollup-linux-arm-gnueabihf": 4.44.2 - "@rollup/rollup-linux-arm-musleabihf": 4.44.2 - "@rollup/rollup-linux-arm64-gnu": 4.44.2 - "@rollup/rollup-linux-arm64-musl": 4.44.2 - "@rollup/rollup-linux-loongarch64-gnu": 4.44.2 - "@rollup/rollup-linux-powerpc64le-gnu": 4.44.2 - "@rollup/rollup-linux-riscv64-gnu": 4.44.2 - "@rollup/rollup-linux-riscv64-musl": 4.44.2 - "@rollup/rollup-linux-s390x-gnu": 4.44.2 - "@rollup/rollup-linux-x64-gnu": 4.44.2 - "@rollup/rollup-linux-x64-musl": 4.44.2 - "@rollup/rollup-win32-arm64-msvc": 4.44.2 - "@rollup/rollup-win32-ia32-msvc": 4.44.2 - "@rollup/rollup-win32-x64-msvc": 4.44.2 + '@rollup/rollup-android-arm-eabi': 4.44.2 + '@rollup/rollup-android-arm64': 4.44.2 + '@rollup/rollup-darwin-arm64': 4.44.2 + '@rollup/rollup-darwin-x64': 4.44.2 + '@rollup/rollup-freebsd-arm64': 4.44.2 + '@rollup/rollup-freebsd-x64': 4.44.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.2 + '@rollup/rollup-linux-arm-musleabihf': 4.44.2 + '@rollup/rollup-linux-arm64-gnu': 4.44.2 + '@rollup/rollup-linux-arm64-musl': 4.44.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.2 + '@rollup/rollup-linux-riscv64-gnu': 4.44.2 + '@rollup/rollup-linux-riscv64-musl': 4.44.2 + '@rollup/rollup-linux-s390x-gnu': 4.44.2 + '@rollup/rollup-linux-x64-gnu': 4.44.2 + '@rollup/rollup-linux-x64-musl': 4.44.2 + '@rollup/rollup-win32-arm64-msvc': 4.44.2 + '@rollup/rollup-win32-ia32-msvc': 4.44.2 + '@rollup/rollup-win32-x64-msvc': 4.44.2 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -17657,6 +14358,12 @@ snapshots: dependencies: randombytes: 2.1.0 + seroval-plugins@1.3.2(seroval@1.3.2): + dependencies: + seroval: 1.3.2 + + seroval@1.3.2: {} + serve-placeholder@2.0.2: dependencies: defu: 6.1.4 @@ -17765,8 +14472,8 @@ snapshots: simple-git@3.28.0: dependencies: - "@kwsites/file-exists": 1.1.1 - "@kwsites/promise-deferred": 1.1.1 + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -17791,6 +14498,37 @@ snapshots: smob@1.5.0: {} + solid-js@1.9.7: + dependencies: + csstype: 3.1.3 + seroval: 1.3.2 + seroval-plugins: 1.3.2(seroval@1.3.2) + + solid-presence@0.1.8(solid-js@1.9.7): + dependencies: + '@corvu/utils': 0.4.2(solid-js@1.9.7) + solid-js: 1.9.7 + + solid-prevent-scroll@0.1.10(solid-js@1.9.7): + dependencies: + '@corvu/utils': 0.4.2(solid-js@1.9.7) + solid-js: 1.9.7 + + solid-refresh@0.6.3(solid-js@1.9.7): + dependencies: + '@babel/generator': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/types': 7.28.0 + solid-js: 1.9.7 + transitivePeerDependencies: + - supports-color + + solid-transition-group@0.2.3(solid-js@1.9.7): + dependencies: + '@solid-primitives/refs': 1.1.2(solid-js@1.9.7) + '@solid-primitives/transition-group': 1.1.2(solid-js@1.9.7) + solid-js: 1.9.7 + sorted-btree@1.8.1: {} source-map-js@1.2.1: {} @@ -17942,13 +14680,17 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + strip-literal@3.0.0: dependencies: js-tokens: 9.0.1 sucrase@3.35.0: dependencies: - "@jridgewell/gen-mapping": 0.3.8 + '@jridgewell/gen-mapping': 0.3.8 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 @@ -17956,6 +14698,10 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + superjson@2.2.2: + dependencies: + copy-anything: 3.0.5 + supports-color@10.0.0: {} supports-color@7.2.0: @@ -17972,7 +14718,7 @@ snapshots: synckit@0.11.8: dependencies: - "@pkgr/core": 0.2.7 + '@pkgr/core': 0.2.7 system-architecture@0.1.0: {} @@ -17988,7 +14734,7 @@ snapshots: tar@7.4.3: dependencies: - "@isaacs/fs-minipass": 4.0.1 + '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 minizlib: 3.0.2 @@ -17999,14 +14745,14 @@ snapshots: terser@5.43.1: dependencies: - "@jridgewell/source-map": 0.3.10 + '@jridgewell/source-map': 0.3.10 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 + '@istanbuljs/schema': 0.1.3 glob: 10.4.5 minimatch: 9.0.5 @@ -18046,10 +14792,14 @@ snapshots: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 + tinypool@0.8.4: {} + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} + tinyspy@2.2.1: {} + tinyspy@4.0.3: {} tldts-core@6.1.78: {} @@ -18111,6 +14861,44 @@ snapshots: tslib@2.8.1: {} + tsup-preset-solid@2.2.0(esbuild@0.25.6)(solid-js@1.9.7)(tsup@8.5.0(@microsoft/api-extractor@7.52.8(@types/node@24.0.11))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)): + dependencies: + esbuild-plugin-solid: 0.5.0(esbuild@0.25.6)(solid-js@1.9.7) + tsup: 8.5.0(@microsoft/api-extractor@7.52.8(@types/node@24.0.11))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) + transitivePeerDependencies: + - esbuild + - solid-js + - supports-color + + tsup@8.5.0(@microsoft/api-extractor@7.52.8(@types/node@20.19.5))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.0) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.0 + debug: 4.4.0 + esbuild: 0.25.0 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0) + resolve-from: 5.0.0 + rollup: 4.34.8 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.12 + tree-kill: 1.2.2 + optionalDependencies: + '@microsoft/api-extractor': 7.52.8(@types/node@20.19.5) + postcss: 8.5.6 + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsup@8.5.0(@microsoft/api-extractor@7.52.8(@types/node@22.16.1))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): dependencies: bundle-require: 5.1.0(esbuild@0.25.0) @@ -18131,7 +14919,36 @@ snapshots: tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: - "@microsoft/api-extractor": 7.52.8(@types/node@22.16.1) + '@microsoft/api-extractor': 7.52.8(@types/node@22.16.1) + postcss: 8.5.6 + typescript: 5.8.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsup@8.5.0(@microsoft/api-extractor@7.52.8(@types/node@24.0.11))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.0) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.0 + debug: 4.4.0 + esbuild: 0.25.0 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0) + resolve-from: 5.0.0 + rollup: 4.34.8 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.12 + tree-kill: 1.2.2 + optionalDependencies: + '@microsoft/api-extractor': 7.52.8(@types/node@24.0.11) postcss: 8.5.6 typescript: 5.8.3 transitivePeerDependencies: @@ -18151,6 +14968,10 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.1.0: {} + + type-fest@0.6.0: {} + type-fest@4.41.0: {} type-is@1.6.18: @@ -18202,7 +15023,7 @@ snapshots: typedoc@0.27.9(typescript@5.8.3): dependencies: - "@gerrit0/mini-shiki": 1.27.2 + '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 @@ -18211,9 +15032,9 @@ snapshots: typescript-eslint@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): dependencies: - "@typescript-eslint/eslint-plugin": 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/parser": 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/utils": 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: @@ -18221,8 +15042,7 @@ snapshots: typescript@5.4.2: {} - typescript@5.8.2: - optional: true + typescript@5.8.2: {} typescript@5.8.3: {} @@ -18322,25 +15142,25 @@ snapshots: dependencies: napi-postinstall: 0.3.0 optionalDependencies: - "@unrs/resolver-binding-android-arm-eabi": 1.11.0 - "@unrs/resolver-binding-android-arm64": 1.11.0 - "@unrs/resolver-binding-darwin-arm64": 1.11.0 - "@unrs/resolver-binding-darwin-x64": 1.11.0 - "@unrs/resolver-binding-freebsd-x64": 1.11.0 - "@unrs/resolver-binding-linux-arm-gnueabihf": 1.11.0 - "@unrs/resolver-binding-linux-arm-musleabihf": 1.11.0 - "@unrs/resolver-binding-linux-arm64-gnu": 1.11.0 - "@unrs/resolver-binding-linux-arm64-musl": 1.11.0 - "@unrs/resolver-binding-linux-ppc64-gnu": 1.11.0 - "@unrs/resolver-binding-linux-riscv64-gnu": 1.11.0 - "@unrs/resolver-binding-linux-riscv64-musl": 1.11.0 - "@unrs/resolver-binding-linux-s390x-gnu": 1.11.0 - "@unrs/resolver-binding-linux-x64-gnu": 1.11.0 - "@unrs/resolver-binding-linux-x64-musl": 1.11.0 - "@unrs/resolver-binding-wasm32-wasi": 1.11.0 - "@unrs/resolver-binding-win32-arm64-msvc": 1.11.0 - "@unrs/resolver-binding-win32-ia32-msvc": 1.11.0 - "@unrs/resolver-binding-win32-x64-msvc": 1.11.0 + '@unrs/resolver-binding-android-arm-eabi': 1.11.0 + '@unrs/resolver-binding-android-arm64': 1.11.0 + '@unrs/resolver-binding-darwin-arm64': 1.11.0 + '@unrs/resolver-binding-darwin-x64': 1.11.0 + '@unrs/resolver-binding-freebsd-x64': 1.11.0 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.0 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.0 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.0 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.0 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.0 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.0 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.0 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.0 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.0 + '@unrs/resolver-binding-linux-x64-musl': 1.11.0 + '@unrs/resolver-binding-wasm32-wasi': 1.11.0 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.0 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.0 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.0 unstorage@1.16.0(db0@0.3.2(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.6.1): dependencies: @@ -18405,6 +15225,8 @@ snapshots: uuid@11.1.0: {} + validate-html-nesting@1.2.3: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -18412,6 +15234,24 @@ snapshots: vary@1.1.2: {} + vite-node@1.6.1(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.19(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-node@3.2.4(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 @@ -18420,7 +15260,7 @@ snapshots: pathe: 2.0.3 vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - - "@types/node" + - '@types/node' - jiti - less - lightningcss @@ -18441,7 +15281,7 @@ snapshots: pathe: 2.0.3 vite: 6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - - "@types/node" + - '@types/node' - jiti - less - lightningcss @@ -18456,10 +15296,10 @@ snapshots: vite-plugin-dts@4.2.3(@types/node@22.16.1)(rollup@4.44.2)(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): dependencies: - "@microsoft/api-extractor": 7.47.7(@types/node@22.16.1) - "@rollup/pluginutils": 5.2.0(rollup@4.44.2) - "@volar/typescript": 2.4.17 - "@vue/language-core": 2.1.6(typescript@5.8.3) + '@microsoft/api-extractor': 7.47.7(@types/node@22.16.1) + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) + '@volar/typescript': 2.4.17 + '@vue/language-core': 2.1.6(typescript@5.8.3) compare-versions: 6.1.1 debug: 4.4.1 kolorist: 1.8.0 @@ -18469,7 +15309,26 @@ snapshots: optionalDependencies: vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - - "@types/node" + - '@types/node' + - rollup + - supports-color + + vite-plugin-dts@4.5.4(@types/node@24.0.11)(rollup@4.44.2)(typescript@5.8.3)(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): + dependencies: + '@microsoft/api-extractor': 7.52.8(@types/node@24.0.11) + '@rollup/pluginutils': 5.2.0(rollup@4.44.2) + '@volar/typescript': 2.4.17 + '@vue/language-core': 2.2.0(typescript@5.8.3) + compare-versions: 6.1.1 + debug: 4.4.1 + kolorist: 1.8.0 + local-pkg: 1.1.1 + magic-string: 0.30.17 + typescript: 5.8.3 + optionalDependencies: + vite: 7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - '@types/node' - rollup - supports-color @@ -18477,6 +15336,37 @@ snapshots: dependencies: vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): + dependencies: + '@babel/core': 7.28.0 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.9.6(@babel/core@7.28.0) + merge-anything: 5.1.7 + solid-js: 1.9.7 + solid-refresh: 0.6.3(solid-js@1.9.7) + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vitefu: 1.1.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + optionalDependencies: + '@testing-library/jest-dom': 6.6.3 + transitivePeerDependencies: + - supports-color + optional: true + + vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): + dependencies: + '@babel/core': 7.28.0 + '@types/babel__core': 7.20.5 + babel-preset-solid: 1.9.6(@babel/core@7.28.0) + merge-anything: 5.1.7 + solid-js: 1.9.7 + solid-refresh: 0.6.3(solid-js@1.9.7) + vite: 7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vitefu: 1.1.1(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + optionalDependencies: + '@testing-library/jest-dom': 6.6.3 + transitivePeerDependencies: + - supports-color + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): dependencies: debug: 4.4.1 @@ -18488,6 +15378,17 @@ snapshots: - supports-color - typescript + vite@5.4.19(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.44.2 + optionalDependencies: + '@types/node': 20.19.5 + fsevents: 2.3.3 + lightningcss: 1.30.1 + terser: 5.43.1 + vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.6 @@ -18497,7 +15398,7 @@ snapshots: rollup: 4.44.2 tinyglobby: 0.2.14 optionalDependencies: - "@types/node": 22.16.1 + '@types/node': 22.16.1 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 @@ -18514,7 +15415,7 @@ snapshots: rollup: 4.44.2 tinyglobby: 0.2.14 optionalDependencies: - "@types/node": 24.0.11 + '@types/node': 24.0.11 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 @@ -18531,7 +15432,7 @@ snapshots: rollup: 4.44.2 tinyglobby: 0.2.14 optionalDependencies: - "@types/node": 24.0.11 + '@types/node': 24.0.11 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 @@ -18539,16 +15440,61 @@ snapshots: tsx: 4.20.3 yaml: 2.8.0 + vitefu@1.1.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): + optionalDependencies: + vite: 6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + optional: true + + vitefu@1.1.1(vite@7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)): + optionalDependencies: + vite: 7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + + vitest@1.6.1(@types/node@20.19.5)(happy-dom@18.0.1)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.1 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.17 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.9.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.19(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1) + vite-node: 1.6.1(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.19.5 + happy-dom: 18.0.1 + jsdom: 26.1.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.1)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: - "@types/chai": 5.2.2 - "@vitest/expect": 3.2.4 - "@vitest/mocker": 3.2.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@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 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@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.2.0 debug: 4.4.1 expect-type: 1.2.2 @@ -18565,8 +15511,8 @@ snapshots: vite-node: 3.2.4(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - "@types/debug": 4.1.12 - "@types/node": 22.16.1 + '@types/debug': 4.1.12 + '@types/node': 22.16.1 happy-dom: 18.0.1 jsdom: 26.1.0 transitivePeerDependencies: @@ -18585,14 +15531,14 @@ snapshots: vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.11)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: - "@types/chai": 5.2.2 - "@vitest/expect": 3.2.4 - "@vitest/mocker": 3.2.4(vite@6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) - "@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 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@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.2.0 debug: 4.4.1 expect-type: 1.2.2 @@ -18609,8 +15555,8 @@ snapshots: vite-node: 3.2.4(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - "@types/debug": 4.1.12 - "@types/node": 24.0.11 + '@types/debug': 4.1.12 + '@types/node': 24.0.11 happy-dom: 18.0.1 jsdom: 26.1.0 transitivePeerDependencies: @@ -18644,11 +15590,11 @@ snapshots: vue@3.5.17(typescript@5.8.3): dependencies: - "@vue/compiler-dom": 3.5.17 - "@vue/compiler-sfc": 3.5.17 - "@vue/runtime-dom": 3.5.17 - "@vue/server-renderer": 3.5.17(vue@3.5.17(typescript@5.8.3)) - "@vue/shared": 3.5.17 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-sfc': 3.5.17 + '@vue/runtime-dom': 3.5.17 + '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3)) + '@vue/shared': 3.5.17 optionalDependencies: typescript: 5.8.3 @@ -18756,8 +15702,8 @@ snapshots: winston@3.17.0: dependencies: - "@colors/colors": 1.6.0 - "@dabh/diagnostics": 2.0.3 + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 @@ -18801,9 +15747,9 @@ snapshots: xmlbuilder2@3.1.1: dependencies: - "@oozcitak/dom": 1.15.10 - "@oozcitak/infra": 1.0.8 - "@oozcitak/util": 8.3.8 + '@oozcitak/dom': 1.15.10 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 js-yaml: 3.14.1 xmlchars@2.2.0: {} @@ -18843,14 +15789,14 @@ snapshots: youch-core@0.3.3: dependencies: - "@poppinss/exception": 1.2.2 + '@poppinss/exception': 1.2.2 error-stack-parser-es: 1.0.5 youch@4.1.0-beta.8: dependencies: - "@poppinss/colors": 4.1.5 - "@poppinss/dumper": 0.6.4 - "@speed-highlight/core": 1.2.7 + '@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 diff --git a/react-jsx-fix-summary.md b/react-jsx-fix-summary.md new file mode 100644 index 000000000..a727609db --- /dev/null +++ b/react-jsx-fix-summary.md @@ -0,0 +1,144 @@ +# Fix for "React is not defined" Error in TanStack DB Devtools + +## 🐛 Problem Identified + +The error `TanstackDbDevtools.tsx:112 Uncaught ReferenceError: React is not defined` was occurring because: + +1. **SolidJS JSX in React Environment**: The core DB devtools are written in SolidJS, but when used in a React app, the JSX was being compiled with React's JSX transform instead of SolidJS's transform. + +2. **Missing JSX Pragma**: SolidJS components didn't have explicit JSX pragma declarations, so the bundler assumed React JSX compilation. + +3. **Build Process Confusion**: The React application was trying to compile SolidJS source files directly instead of using pre-built artifacts. + +## ✅ Solutions Implemented + +### 1. Added JSX Pragmas to All SolidJS Files +```tsx +/** @jsxImportSource solid-js */ +``` + +Added to: +- `packages/db-devtools/src/TanstackDbDevtools.tsx` +- `packages/db-devtools/src/DbDevtools.tsx` +- `packages/db-devtools/src/DbDevtoolsPanel.tsx` +- `packages/db-devtools/src/components/CollectionDetails.tsx` +- `packages/db-devtools/src/components/TransactionList.tsx` +- `packages/db-devtools/src/icons/index.tsx` +- `packages/db-devtools/src/Devtools.tsx` + +### 2. Updated TypeScript Configuration +Updated `packages/db-devtools/tsconfig.json`: +```json +{ + "compilerOptions": { + "jsx": "preserve", + "jsxImportSource": "solid-js", + "target": "ES2020", + "lib": ["ES2020", "DOM"] + } +} +``` + +### 3. Fixed Build Configuration +Updated `packages/db-devtools/tsup.config.ts`: +```typescript +export default defineConfig({ + entry: ['src/index.ts'], + format: ['esm', 'cjs'], + dts: true, + sourcemap: true, + clean: true, + outDir: 'build', + external: ['solid-js', 'solid-js/web', '@tanstack/db'], + esbuildOptions(options) { + options.jsx = 'automatic' + options.jsxImportSource = 'solid-js' + }, +}) +``` + +### 4. Built Core Package +Successfully built the core devtools package with proper SolidJS JSX compilation. + +## 🎯 Testing Results + +✅ **Build Success**: The `packages/db-devtools` now builds successfully with SolidJS JSX +✅ **JSX Compilation**: SolidJS components now compile with correct JSX transform +✅ **React Integration**: React wrapper can now properly use the pre-built SolidJS core + +## 🚀 Next Steps + +### 1. Install Missing Dependencies (Optional) +To use the full new implementation with advanced features: +```bash +cd packages/db-devtools +pnpm add @tanstack/match-sorter-utils goober clsx @kobalte/core @solid-primitives/keyed @solid-primitives/resize-observer @solid-primitives/storage solid-transition-group superjson tsup-preset-solid vite-plugin-solid +``` + +### 2. Enable Full Implementation +Once dependencies are installed, uncomment exports in `packages/db-devtools/src/index.ts`: +```typescript +// Uncomment these lines: +export * from './Devtools' +export * from './contexts' +export * from './utils' +export * from './icons' +``` + +### 3. Test the React Example +```bash +cd examples/react/todo +npm run dev +``` + +The "React is not defined" error should now be resolved! + +## 🎨 Current Status + +### ✅ Working Now +- **JSX Compilation**: Proper SolidJS JSX transform +- **Build Process**: Core devtools build successfully +- **React Integration**: No more "React is not defined" errors +- **Basic Functionality**: Current devtools work with React apps + +### 🔄 Available with Dependencies +- **Advanced Styling**: CSS-in-JS with goober, theme switching +- **Enhanced UX**: Smooth animations, drag/resize, Picture-in-Picture +- **Search & Filter**: Advanced query capabilities +- **Accessibility**: Proper ARIA labels and keyboard navigation + +## 🔧 Technical Details + +### How the Fix Works +1. **JSX Pragma**: `/** @jsxImportSource solid-js */` tells the compiler to use SolidJS JSX transform +2. **Build Separation**: Core package builds SolidJS components separately from React app +3. **Proper Externals**: SolidJS dependencies are marked as external in build config +4. **Runtime Isolation**: React app uses pre-compiled SolidJS artifacts + +### Architecture Benefits +- **Clean Separation**: SolidJS core completely isolated from React wrapper +- **Performance**: Pre-compiled components load faster +- **Maintainability**: Single source of truth for devtools logic +- **Compatibility**: Works with any React bundler/build system + +## 📊 Comparison with Reference Implementation + +This fix brings our implementation in line with the reference TanStack devtools: + +| Aspect | Reference Implementation | Our Implementation | +|--------|-------------------------|-------------------| +| Core Framework | SolidJS | ✅ SolidJS | +| React Wrapper | Thin integration layer | ✅ Thin integration layer | +| JSX Compilation | Proper SolidJS transform | ✅ Fixed with pragmas | +| Build Process | Separate core build | ✅ Separate core build | +| Runtime Isolation | Complete separation | ✅ Complete separation | + +## 🎉 Conclusion + +The "React is not defined" error has been resolved by: +1. ✅ Adding proper JSX pragmas to SolidJS files +2. ✅ Configuring correct JSX compilation in TypeScript and build tools +3. ✅ Ensuring proper separation between SolidJS core and React wrapper +4. ✅ Building the core package with SolidJS-specific compilation + +Your React todo example should now work without JSX compilation errors! \ No newline at end of file From ba6d873e4cdd9df031efb59d7901a6f4a0f833c5 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Sun, 13 Jul 2025 18:20:06 +0100 Subject: [PATCH 08/25] all worts --- examples/react/todo/package.json | 6 +- examples/react/todo/src/App.tsx | 3 +- examples/react/todo/src/main.tsx | 7 + examples/react/todo/src/routes/__root.tsx | 4 + .../src/BaseTanStackDbDevtoolsPanel.tsx | 259 ++++++ .../src/FloatingTanStackDbDevtools.tsx | 280 ++++++ .../db-devtools/src/TanstackDbDevtools.tsx | 70 +- packages/db-devtools/src/contexts/index.tsx | 73 +- packages/db-devtools/src/devtools.ts | 22 +- packages/db-devtools/src/index.ts | 11 +- packages/db-devtools/src/logo.tsx | 817 ++++++++++++++++++ packages/db-devtools/src/registry.ts | 60 +- packages/db-devtools/src/tokens.ts | 264 ++++++ packages/db-devtools/src/types.ts | 3 +- packages/db-devtools/src/useLocalStorage.ts | 44 + packages/db-devtools/src/useStyles.tsx | 374 ++++++++ packages/db-devtools/src/utils.tsx | 205 ++--- packages/db/src/collection.ts | 14 +- .../react-db-devtools/src/ReactDbDevtools.tsx | 208 +++-- packages/react-db-devtools/src/index.ts | 136 ++- packages/vue-db-devtools/package.json | 60 -- .../vue-db-devtools/src/VueDbDevtools.vue | 57 -- packages/vue-db-devtools/src/index.ts | 5 - packages/vue-db-devtools/tsconfig.json | 11 - packages/vue-db-devtools/tsup.config.ts | 10 - pnpm-lock.yaml | 700 ++------------- tsconfig.json | 2 +- 27 files changed, 2611 insertions(+), 1094 deletions(-) create mode 100644 packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx create mode 100644 packages/db-devtools/src/FloatingTanStackDbDevtools.tsx create mode 100644 packages/db-devtools/src/logo.tsx create mode 100644 packages/db-devtools/src/tokens.ts create mode 100644 packages/db-devtools/src/useLocalStorage.ts create mode 100644 packages/db-devtools/src/useStyles.tsx delete mode 100644 packages/vue-db-devtools/package.json delete mode 100644 packages/vue-db-devtools/src/VueDbDevtools.vue delete mode 100644 packages/vue-db-devtools/src/index.ts delete mode 100644 packages/vue-db-devtools/tsconfig.json delete mode 100644 packages/vue-db-devtools/tsup.config.ts diff --git a/examples/react/todo/package.json b/examples/react/todo/package.json index 85a64ed22..d246687eb 100644 --- a/examples/react/todo/package.json +++ b/examples/react/todo/package.json @@ -4,11 +4,13 @@ "version": "0.0.25", "dependencies": { "@tanstack/db-collections": "^0.0.23", + "@tanstack/db-devtools": "workspace:*", "@tanstack/query-core": "^5.81.5", - "@tanstack/react-router": "^1.125.6", - "@tanstack/react-start": "^1.126.1", "@tanstack/react-db": "^0.0.20", "@tanstack/react-db-devtools": "workspace:*", + "@tanstack/react-router": "^1.125.6", + "@tanstack/react-router-devtools": "^1.127.3", + "@tanstack/react-start": "^1.126.1", "cors": "^2.8.5", "drizzle-orm": "^0.40.1", "drizzle-zod": "^0.7.0", diff --git a/examples/react/todo/src/App.tsx b/examples/react/todo/src/App.tsx index de6f04b16..ca07692bb 100644 --- a/examples/react/todo/src/App.tsx +++ b/examples/react/todo/src/App.tsx @@ -4,7 +4,7 @@ import { electricCollectionOptions, queryCollectionOptions, } from "@tanstack/db-collections" -import { ReactDbDevtools } from "@tanstack/react-db-devtools" +import { TanStackReactDbDevtools } from "@tanstack/react-db-devtools" import { QueryClient } from "@tanstack/query-core" import { selectConfigSchema, selectTodoSchema } from "./db/validation" import type { Collection } from "@tanstack/react-db" @@ -641,7 +641,6 @@ export default function App() {
- ) } diff --git a/examples/react/todo/src/main.tsx b/examples/react/todo/src/main.tsx index 0fbcebd3c..c3df7fb97 100644 --- a/examples/react/todo/src/main.tsx +++ b/examples/react/todo/src/main.tsx @@ -2,8 +2,15 @@ import React from "react" import { createRoot } from "react-dom/client" import { RouterProvider } from "@tanstack/react-router" import { createRouter } from "./router" +import { initializeDbDevtools } from "@tanstack/react-db-devtools" import "./index.css" +// Initialize DB devtools BEFORE any collections are created +if (typeof window !== 'undefined' && process.env.NODE_ENV === 'development') { + console.log('Main: Initializing devtools early...') + initializeDbDevtools() +} + const router = createRouter() createRoot(document.getElementById(`root`)!).render( diff --git a/examples/react/todo/src/routes/__root.tsx b/examples/react/todo/src/routes/__root.tsx index be04b1d17..e8213e250 100644 --- a/examples/react/todo/src/routes/__root.tsx +++ b/examples/react/todo/src/routes/__root.tsx @@ -4,6 +4,8 @@ import { Scripts, createRootRoute, } from "@tanstack/react-router" +import { TanStackRouterDevtools } from '@tanstack/react-router-devtools' +import { TanStackReactDbDevtools } from "@tanstack/react-db-devtools" import appCss from "../styles.css?url" @@ -32,6 +34,8 @@ export const Route = createRootRoute({ component: () => ( + + ), }) diff --git a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx new file mode 100644 index 000000000..e647e31ea --- /dev/null +++ b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx @@ -0,0 +1,259 @@ +import { clsx as cx } from 'clsx' +import { Show, createMemo, createSignal, onMount } from 'solid-js' +import { useDevtoolsOnClose } from './contexts' +import { useStyles } from './useStyles' +import { useLocalStorage } from './useLocalStorage' +import { multiSortBy } from './utils' +import type { Accessor, JSX } from 'solid-js' +import type { DbDevtoolsRegistry, CollectionMetadata } from './types' + +export interface BaseDbDevtoolsPanelOptions { + /** + * The standard React style object used to style a component with inline styles + */ + style?: Accessor + /** + * The standard React class property used to style a component with classes + */ + className?: Accessor + /** + * A boolean variable indicating whether the panel is open or closed + */ + isOpen?: boolean + /** + * A function that toggles the open and close state of the panel + */ + setIsOpen?: (isOpen: boolean) => void + /** + * Handles the opening and closing the devtools panel + */ + handleDragStart?: (e: any) => void + /** + * The DB devtools registry instance + */ + registry: Accessor + /** + * Use this to attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +function Logo(props: any) { + const { className, ...rest } = props + const styles = useStyles() + return ( + + ) +} + +function CollectionItem({ + collection, + isActive, + onSelect, +}: { + collection: CollectionMetadata + isActive: boolean + onSelect: (collection: CollectionMetadata) => void +}) { + const styles = useStyles() + + return ( +
onSelect(collection)} + > +
{collection.id}
+
({collection.size})
+
+ {collection.status} +
+
+ ) +} + +export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel({ + ...props +}: BaseDbDevtoolsPanelOptions): JSX.Element { + const { + isOpen = true, + setIsOpen, + handleDragStart, + registry, + shadowDOMTarget, + ...panelProps + } = props + + const { onCloseClick } = useDevtoolsOnClose() + const styles = useStyles() + const { className, style, ...otherPanelProps } = panelProps + + const [activeCollectionId, setActiveCollectionId] = useLocalStorage( + 'tanstackDbDevtoolsActiveCollectionId', + '', + ) + + const [collections, setCollections] = createSignal([]) + + // Poll for collections data + onMount(() => { + const updateCollections = () => { + if (typeof window === 'undefined') return + + try { + const metadata = registry().getAllCollectionMetadata() + setCollections(metadata) + } catch (error) { + console.warn('Error fetching collections metadata:', error) + } + } + + updateCollections() + const intervalId = setInterval(updateCollections, 1000) + + return () => clearInterval(intervalId) + }) + + const activeCollection = createMemo(() => { + const active = collections().find(c => c.id === activeCollectionId()) + return active || collections()[0] + }) + + const sortedCollections = createMemo(() => { + return multiSortBy( + collections(), + [ + (c) => c.status === 'error' ? 0 : 1, // Errors first + (c) => c.id.toLowerCase(), // Then alphabetically by ID + ] + ) + }) + + const collectionDetails = createMemo(() => { + const active = activeCollection() + if (!active) return null + + try { + const collection = registry().getCollection(active.id) + const metadata = registry().getCollectionMetadata(active.id) + + return { + collection, + metadata, + transactions: registry().getTransactions(active.id), + } + } catch (error) { + console.warn('Error getting collection details:', error) + return null + } + }) + + return ( +
+ {handleDragStart ? ( +
+ ) : null} + + + +
+
+ +
+
+
+
+
Collections ({collections().length})
+
+ +
+ 0} + fallback={ +
+ No collections found +
+ } + > + {sortedCollections().map((collection) => ( + setActiveCollectionId(c.id)} + /> + ))} +
+
+
+
+
+ +
+ +
+ Select a collection to view details +
+
+ } + > + {(collection) => ( +
+
+ {collection().id} +
+
+
{JSON.stringify(collection(), null, 2)}
+
+
+ )} + +
+ + ) +} + +export default BaseTanStackDbDevtoolsPanel \ No newline at end of file diff --git a/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx b/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx new file mode 100644 index 000000000..92860e292 --- /dev/null +++ b/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx @@ -0,0 +1,280 @@ +import { clsx as cx } from 'clsx' +import { createEffect, createMemo, createSignal } from 'solid-js' +import { Dynamic } from 'solid-js/web' +import { DevtoolsOnCloseContext } from './contexts' +import { BaseTanStackDbDevtoolsPanel } from './BaseTanStackDbDevtoolsPanel' +import { useLocalStorage } from './useLocalStorage' +import { TanStackLogo } from './logo' +import { useStyles } from './useStyles' +import type { Accessor, JSX } from 'solid-js' +import type { DbDevtoolsRegistry } from './types' + +export interface FloatingDbDevtoolsOptions { + /** + * Set this true if you want the dev tools to default to being open + */ + initialIsOpen?: boolean + /** + * Use this to add props to the panel. For example, you can add class, style (merge and override default style), etc. + */ + panelProps?: any & { + ref?: any + } + /** + * Use this to add props to the close button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. + */ + closeButtonProps?: any & { + ref?: any + } + /** + * Use this to add props to the toggle button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. + */ + toggleButtonProps?: any & { + ref?: any + } + /** + * The position of the TanStack DB logo to open and close the devtools panel. + * Defaults to 'bottom-left'. + */ + position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + /** + * Use this to render the devtools inside a different type of container element for a11y purposes. + * Any string which corresponds to a valid intrinsic JSX element is allowed. + * Defaults to 'footer'. + */ + containerElement?: string | any + /** + * The DB devtools registry instance + */ + registry: Accessor + /** + * Use this to attach the devtool's styles to specific element in the DOM. + */ + shadowDOMTarget?: ShadowRoot +} + +export function FloatingTanStackDbDevtools({ + initialIsOpen, + panelProps = {}, + closeButtonProps = {}, + toggleButtonProps = {}, + position = 'bottom-left', + containerElement: Container = 'footer', + registry, + shadowDOMTarget, +}: FloatingDbDevtoolsOptions): JSX.Element | null { + const [rootEl, setRootEl] = createSignal() + + // eslint-disable-next-line prefer-const + let panelRef: HTMLDivElement | undefined = undefined + + const [isOpen, setIsOpen] = useLocalStorage( + 'tanstackDbDevtoolsOpen', + initialIsOpen, + ) + + const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage( + 'tanstackDbDevtoolsHeight', + null, + ) + + const [isResolvedOpen, setIsResolvedOpen] = createSignal(false) + const [isResizing, setIsResizing] = createSignal(false) + const styles = useStyles() + + const handleDragStart = ( + panelElement: HTMLDivElement | undefined, + startEvent: any, + ) => { + if (startEvent.button !== 0) return // Only allow left click for drag + + setIsResizing(true) + + const dragInfo = { + originalHeight: panelElement?.getBoundingClientRect().height ?? 0, + pageY: startEvent.pageY, + } + + const run = (moveEvent: MouseEvent) => { + const delta = dragInfo.pageY - moveEvent.pageY + const newHeight = dragInfo.originalHeight + delta + + setDevtoolsHeight(newHeight) + + if (newHeight < 70) { + setIsOpen(false) + } else { + setIsOpen(true) + } + } + + const unsub = () => { + setIsResizing(false) + document.removeEventListener('mousemove', run) + document.removeEventListener('mouseUp', unsub) + } + + document.addEventListener('mousemove', run) + document.addEventListener('mouseup', unsub) + } + + const isButtonClosed = isOpen() ?? false + + createEffect(() => { + setIsResolvedOpen(isOpen() ?? false) + }) + + createEffect(() => { + if (isResolvedOpen()) { + const previousValue = rootEl()?.parentElement?.style.paddingBottom + + const run = () => { + const containerHeight = panelRef!.getBoundingClientRect().height + if (rootEl()?.parentElement) { + setRootEl((prev) => { + if (prev?.parentElement) { + prev.parentElement.style.paddingBottom = `${containerHeight}px` + } + return prev + }) + } + } + + run() + + if (typeof window !== 'undefined') { + window.addEventListener('resize', run) + + return () => { + window.removeEventListener('resize', run) + if (rootEl()?.parentElement && typeof previousValue === 'string') { + setRootEl((prev) => { + prev!.parentElement!.style.paddingBottom = previousValue + return prev + }) + } + } + } + } else { + // Reset padding when devtools are closed + if (rootEl()?.parentElement) { + setRootEl((prev) => { + if (prev?.parentElement) { + prev.parentElement.removeAttribute('style') + } + return prev + }) + } + } + return + }) + + createEffect(() => { + if (rootEl()) { + const el = rootEl() + const fontSize = getComputedStyle(el!).fontSize + el?.style.setProperty('--tsdb-font-size', fontSize) + } + }) + + const { style: panelStyle = {}, ...otherPanelProps } = panelProps as { + style?: Record + } + + const { + style: closeButtonStyle = {}, + onClick: onCloseClick, + ...otherCloseButtonProps + } = closeButtonProps + + const { + onClick: onToggleClick, + class: toggleButtonClassName, + ...otherToggleButtonProps + } = toggleButtonProps + + // Always render when called (we're already in a client-side React environment) + // The original isMounted() check was preventing rendering when embedded in React + // if (!isMounted()) return null + + const resolvedHeight = createMemo(() => devtoolsHeight() ?? 500) + + const basePanelClass = createMemo(() => { + return cx( + styles().devtoolsPanelContainer, + styles().devtoolsPanelContainerVisibility(!!isOpen()), + styles().devtoolsPanelContainerResizing(isResizing), + styles().devtoolsPanelContainerAnimation( + isResolvedOpen(), + resolvedHeight() + 16, + ), + ) + }) + + const basePanelStyle = createMemo(() => { + return { + height: `${resolvedHeight()}px`, + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + ...(panelStyle || {}), + } + }) + + const buttonStyle = createMemo(() => { + return cx( + styles().mainCloseBtn, + styles().mainCloseBtnPosition(position), + styles().mainCloseBtnAnimation(!!isOpen()), + toggleButtonClassName, + ) + }) + + return ( + + {}), + }} + > + handleDragStart(panelRef, e)} + shadowDOMTarget={shadowDOMTarget} + /> + + + + + ) +} + +export default FloatingTanStackDbDevtools \ No newline at end of file diff --git a/packages/db-devtools/src/TanstackDbDevtools.tsx b/packages/db-devtools/src/TanstackDbDevtools.tsx index 16484c2f8..3a019fbd7 100644 --- a/packages/db-devtools/src/TanstackDbDevtools.tsx +++ b/packages/db-devtools/src/TanstackDbDevtools.tsx @@ -1,7 +1,8 @@ /** @jsxImportSource solid-js */ import { render } from "solid-js/web" -import { createSignal, lazy } from "solid-js" +import { createSignal } from "solid-js" import { initializeDevtoolsRegistry } from "./registry" +import { FloatingTanStackDbDevtools } from "./FloatingTanStackDbDevtools" import type { DbDevtoolsConfig } from "./types" import type { DbDevtoolsRegistry } from "./types" import type { Signal } from "solid-js" @@ -23,7 +24,6 @@ class TanstackDbDevtools { #storageKey: Signal #panelState: Signal #onPanelStateChange: Signal<((isOpen: boolean) => void) | undefined> - #Component: any #dispose?: () => void constructor(config: TanstackDbDevtoolsConfig) { @@ -89,58 +89,24 @@ class TanstackDbDevtools { throw new Error("DB Devtools is already mounted") } - const dispose = render(() => { - const [initialIsOpen] = this.#initialIsOpen - const [position] = this.#position - const [panelProps] = this.#panelProps - const [toggleButtonProps] = this.#toggleButtonProps - const [closeButtonProps] = this.#closeButtonProps - const [storageKey] = this.#storageKey - const [panelState] = this.#panelState - const [onPanelStateChange] = this.#onPanelStateChange - - let DbDevtools: any - - if (this.#Component) { - DbDevtools = this.#Component - } else { - DbDevtools = lazy(() => import("./DbDevtools")) - this.#Component = DbDevtools + const getValidPosition = (pos: DbDevtoolsConfig["position"]) => { + if (pos === 'relative' || pos === undefined) { + return 'bottom-left' as const } + return pos as 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + } - return ( - - ) - }, el) + const dispose = render(() => ( + this.#registry} + shadowDOMTarget={this.#shadowDOMTarget} + /> + ), el) this.#isMounted = true this.#dispose = dispose diff --git a/packages/db-devtools/src/contexts/index.tsx b/packages/db-devtools/src/contexts/index.tsx index 761f33ec2..fd49bb854 100644 --- a/packages/db-devtools/src/contexts/index.tsx +++ b/packages/db-devtools/src/contexts/index.tsx @@ -1,5 +1,5 @@ import { createContext, useContext, createSignal, onMount, onCleanup } from 'solid-js' -import { createStore } from '@solid-primitives/storage' +import { createStorage } from '@solid-primitives/storage' import type { JSX, Accessor } from 'solid-js' import type { DevtoolsPosition, DevtoolsButtonPosition } from '../constants' @@ -25,6 +25,16 @@ const DbDevtoolsContext = createContext({}) export const useDbDevtoolsContext = () => useContext(DbDevtoolsContext) +// Shadow DOM Target Context - matches Router devtools pattern +export const ShadowDomTargetContext = createContext(undefined) + +// Devtools On Close Context - matches Router devtools pattern +export const DevtoolsOnCloseContext = createContext<{ onCloseClick: (e: any) => void }>({ + onCloseClick: () => {}, +}) + +export const useDevtoolsOnClose = () => useContext(DevtoolsOnCloseContext) + export const DbDevtoolsProvider = (props: DbDevtoolsProps) => { const value = { initialIsOpen: props.initialIsOpen, @@ -42,14 +52,13 @@ export const DbDevtoolsProvider = (props: DbDevtoolsProps) => { ) } -// Theme Context export type Theme = 'light' | 'dark' const ThemeContext = createContext<{ theme: Accessor setTheme: (theme: Theme) => void }>({ - theme: () => 'dark', + theme: () => 'dark' as Theme, setTheme: () => {}, }) @@ -60,6 +69,9 @@ export const ThemeProvider = (props: { children: JSX.Element }) => { const [theme, setTheme] = createSignal('dark') onMount(() => { + // SSR safety check + if (typeof window === 'undefined') return + // Check system preference const prefersDark = window.matchMedia('(prefers-color-scheme: dark)') setTheme(prefersDark.matches ? 'dark' : 'light') @@ -85,7 +97,7 @@ export const ThemeProvider = (props: { children: JSX.Element }) => { ) } -// PiP Context +// Picture-in-Picture Context const PiPContext = createContext<{ pipWindow: Accessor openPiP: () => void @@ -102,26 +114,28 @@ export const PiPProvider = (props: { children: JSX.Element }) => { const [pipWindow, setPiPWindow] = createSignal(null) const openPiP = () => { - if (typeof window !== 'undefined' && 'documentPictureInPicture' in window) { - // @ts-ignore documentPictureInPicture API is not yet in TypeScript DOM types - window.documentPictureInPicture.requestWindow({ - width: 800, - height: 600, - }).then((win: Window) => { - setPiPWindow(win) - win.addEventListener('pagehide', () => { - setPiPWindow(null) - }) - }) - } + if (typeof window === 'undefined') return + + const features = [ + 'width=500', + 'height=300', + 'toolbar=no', + 'location=no', + 'directories=no', + 'status=no', + 'menubar=no', + 'scrollbars=no', + 'resizable=yes', + 'copyhistory=no', + ].join(',') + + const pip = window.open('', 'devtools', features) + setPiPWindow(pip) } const closePiP = () => { - const win = pipWindow() - if (win) { - win.close() - setPiPWindow(null) - } + pipWindow()?.close() + setPiPWindow(null) } const value = { @@ -137,15 +151,16 @@ export const PiPProvider = (props: { children: JSX.Element }) => { ) } -// Storage hook for devtools state +// Storage hooks export const useDevtoolsStorage = () => { - const [store, setStore] = createStore('tsdb-devtools', { - open: 'false', - position: 'bottom-right', - height: '500', - width: '500', - pip_open: 'false', + const [store, setStore] = createStorage({ + prefix: 'tanstack-db-devtools', + api: localStorage, + serializer: { + read: (value: string) => JSON.parse(value), + write: (value: any) => JSON.stringify(value), + }, }) - return [store, setStore] as const + return { store, setStore } } \ No newline at end of file diff --git a/packages/db-devtools/src/devtools.ts b/packages/db-devtools/src/devtools.ts index 0eedda116..448e13601 100644 --- a/packages/db-devtools/src/devtools.ts +++ b/packages/db-devtools/src/devtools.ts @@ -1,5 +1,5 @@ import { initializeDevtoolsRegistry } from "./registry" -import type { CollectionImpl } from "@tanstack/db" +import type { CollectionImpl } from "../../db/src/collection" import type { DbDevtoolsRegistry } from "./types" /** @@ -18,7 +18,9 @@ export function initializeDbDevtools(): void { export function registerCollection( collection: CollectionImpl ): void { - const registry = window.__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (typeof window === 'undefined') return + + const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined if (registry) { registry.registerCollection(collection) } @@ -29,7 +31,9 @@ export function registerCollection( * This is automatically called when collections are garbage collected. */ export function unregisterCollection(id: string): void { - const registry = window.__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (typeof window === 'undefined') return + + const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined if (registry) { registry.unregisterCollection(id) } @@ -39,14 +43,16 @@ export function unregisterCollection(id: string): void { * Check if devtools are currently enabled (registry is present). */ export function isDevtoolsEnabled(): boolean { - return !!window.__TANSTACK_DB_DEVTOOLS__ + if (typeof window === 'undefined') return false + return !!(window as any).__TANSTACK_DB_DEVTOOLS__ } /** * Get the current devtools registry instance. */ export function getDevtoolsRegistry(): DbDevtoolsRegistry | undefined { - return window.__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (typeof window === 'undefined') return undefined + return (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined } /** @@ -54,9 +60,11 @@ export function getDevtoolsRegistry(): DbDevtoolsRegistry | undefined { * This is useful for testing or when you want to completely reset the devtools state. */ export function cleanupDevtools(): void { - const registry = window.__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (typeof window === 'undefined') return + + const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined if (registry) { registry.cleanup() - delete window.__TANSTACK_DB_DEVTOOLS__ + delete (window as any).__TANSTACK_DB_DEVTOOLS__ } } diff --git a/packages/db-devtools/src/index.ts b/packages/db-devtools/src/index.ts index ff3160d01..62f7fbae5 100644 --- a/packages/db-devtools/src/index.ts +++ b/packages/db-devtools/src/index.ts @@ -8,13 +8,16 @@ export * from './constants' export * from './types' // Legacy exports for backwards compatibility -// export * from "./devtools" +export * from "./devtools" export * from "./registry" // Main Devtools Class (follows TanStack pattern) export { TanstackDbDevtools } from "./TanstackDbDevtools" export type { TanstackDbDevtoolsConfig } from "./TanstackDbDevtools" -// SolidJS Components (for direct SolidJS usage) -export { default as DbDevtools } from "./DbDevtools" -export { DbDevtoolsPanel } from "./DbDevtoolsPanel" +// SolidJS Components (for direct SolidJS usage) - Temporarily disabled to prevent SSR issues +// export { default as DbDevtools } from "./DbDevtools" +// export { DbDevtoolsPanel } from "./DbDevtoolsPanel" + +// Export the initialization function +export { initializeDbDevtools } from "./registry" diff --git a/packages/db-devtools/src/logo.tsx b/packages/db-devtools/src/logo.tsx new file mode 100644 index 000000000..c5a0b79a0 --- /dev/null +++ b/packages/db-devtools/src/logo.tsx @@ -0,0 +1,817 @@ +import { createUniqueId } from 'solid-js' + +export function TanStackLogo() { + const id = createUniqueId() + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/packages/db-devtools/src/registry.ts b/packages/db-devtools/src/registry.ts index e8cb6bc14..51e06f6be 100644 --- a/packages/db-devtools/src/registry.ts +++ b/packages/db-devtools/src/registry.ts @@ -1,4 +1,3 @@ -import type { CollectionImpl } from "@tanstack/db" import type { CollectionMetadata, CollectionRegistryEntry, @@ -16,7 +15,7 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { this.startPolling() } - registerCollection = (collection: CollectionImpl): void => { + registerCollection = (collection: any): void => { const metadata: CollectionMetadata = { id: collection.id, type: this.detectCollectionType(collection), @@ -100,7 +99,7 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { return results } - getCollection = (id: string): CollectionImpl | undefined => { + getCollection = (id: string): any => { const entry = this.collections.get(id) if (!entry) return undefined @@ -239,7 +238,7 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { } private detectCollectionType = ( - collection: CollectionImpl + collection: any ): `collection` | `live-query` => { // Check the devtools type marker first if (collection.config.__devtoolsType) { @@ -256,13 +255,13 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { } private isLiveQuery = ( - collection: CollectionImpl + collection: any ): boolean => { return this.detectCollectionType(collection) === `live-query` } private instrumentLiveQuery = ( - collection: CollectionImpl, + collection: any, entry: CollectionRegistryEntry ): void => { // This is where we would add performance tracking for live queries @@ -283,8 +282,51 @@ export function createDbDevtoolsRegistry(): DbDevtoolsRegistry { // Initialize the global registry if not already present export function initializeDevtoolsRegistry(): DbDevtoolsRegistry { - if (!window.__TANSTACK_DB_DEVTOOLS__) { - window.__TANSTACK_DB_DEVTOOLS__ = createDbDevtoolsRegistry() + // SSR safety check + if (typeof window === 'undefined') { + // Return a no-op registry for server-side rendering + return { + collections: new Map(), + registerCollection: () => {}, + unregisterCollection: () => {}, + getCollection: () => undefined, + releaseCollection: () => {}, + getAllCollectionMetadata: () => [], + getCollectionMetadata: () => undefined, + getTransactions: () => [], + getTransaction: () => undefined, + getTransactionDetails: () => undefined, + clearTransactionHistory: () => {}, + onTransactionStart: () => {}, + onTransactionEnd: () => {}, + cleanup: () => {}, + garbageCollect: () => {}, + } as DbDevtoolsRegistry + } + + if (!(window as any).__TANSTACK_DB_DEVTOOLS__) { + (window as any).__TANSTACK_DB_DEVTOOLS__ = createDbDevtoolsRegistry() + } + return (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry +} + +// Initialize devtools and set up automatic collection registration +export function initializeDbDevtools(): void { + // SSR safety check + if (typeof window === 'undefined') { + return + } + + // Initialize the registry + const registry = initializeDevtoolsRegistry() + + // Set up global registration function that collections can call + ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { + registry.registerCollection(collection) + } + + // Set up global unregistration function + ;(window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__ = (id: string) => { + registry.unregisterCollection(id) } - return window.__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry } diff --git a/packages/db-devtools/src/tokens.ts b/packages/db-devtools/src/tokens.ts new file mode 100644 index 000000000..b9a606793 --- /dev/null +++ b/packages/db-devtools/src/tokens.ts @@ -0,0 +1,264 @@ +export const tokens = { + colors: { + inherit: 'inherit', + current: 'currentColor', + transparent: 'transparent', + black: '#000000', + white: '#ffffff', + neutral: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + darkGray: { + 50: '#525c7a', + 100: '#49536e', + 200: '#414962', + 300: '#394056', + 400: '#313749', + 500: '#292e3d', + 600: '#212530', + 700: '#191c24', + 800: '#111318', + 900: '#0b0d10', + }, + gray: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + blue: { + 25: '#F5FAFF', + 50: '#EFF8FF', + 100: '#D1E9FF', + 200: '#B2DDFF', + 300: '#84CAFF', + 400: '#53B1FD', + 500: '#2E90FA', + 600: '#1570EF', + 700: '#175CD3', + 800: '#1849A9', + 900: '#194185', + }, + green: { + 25: '#F6FEF9', + 50: '#ECFDF3', + 100: '#D1FADF', + 200: '#A6F4C5', + 300: '#6CE9A6', + 400: '#32D583', + 500: '#12B76A', + 600: '#039855', + 700: '#027A48', + 800: '#05603A', + 900: '#054F31', + }, + red: { + 50: '#fef2f2', + 100: '#fee2e2', + 200: '#fecaca', + 300: '#fca5a5', + 400: '#f87171', + 500: '#ef4444', + 600: '#dc2626', + 700: '#b91c1c', + 800: '#991b1b', + 900: '#7f1d1d', + 950: '#450a0a', + }, + yellow: { + 25: '#FFFCF5', + 50: '#FFFAEB', + 100: '#FEF0C7', + 200: '#FEDF89', + 300: '#FEC84B', + 400: '#FDB022', + 500: '#F79009', + 600: '#DC6803', + 700: '#B54708', + 800: '#93370D', + 900: '#7A2E0E', + }, + purple: { + 25: '#FAFAFF', + 50: '#F4F3FF', + 100: '#EBE9FE', + 200: '#D9D6FE', + 300: '#BDB4FE', + 400: '#9B8AFB', + 500: '#7A5AF8', + 600: '#6328EF', + 700: '#5912D3', + 800: '#4A0FB0', + 900: '#3E0C8E', + }, + orange: { + 25: '#FFFAF5', + 50: '#FFF4ED', + 100: '#FFE6D5', + 200: '#FFD6AE', + 300: '#FF9C66', + 400: '#FF692E', + 500: '#FF4405', + 600: '#E62E05', + 700: '#BC1B06', + 800: '#97180C', + 900: '#771A0D', + }, + }, + size: { + px: '1px', + 0: '0px', + 0.5: '0.125rem', + 1: '0.25rem', + 1.5: '0.375rem', + 2: '0.5rem', + 2.5: '0.625rem', + 3: '0.75rem', + 3.5: '0.875rem', + 4: '1rem', + 5: '1.25rem', + 6: '1.5rem', + 7: '1.75rem', + 8: '2rem', + 9: '2.25rem', + 10: '2.5rem', + 11: '2.75rem', + 12: '3rem', + 14: '3.5rem', + 16: '4rem', + 20: '5rem', + 24: '6rem', + 28: '7rem', + 32: '8rem', + 36: '9rem', + 40: '10rem', + 44: '11rem', + 48: '12rem', + 52: '13rem', + 56: '14rem', + 60: '15rem', + 64: '16rem', + 72: '18rem', + 80: '20rem', + 96: '24rem', + }, + alpha: { + 5: '0D', + 10: '1A', + 20: '33', + 30: '4D', + 40: '66', + 50: '80', + 60: '99', + 70: 'B3', + 80: 'CC', + 90: 'E6', + 95: 'F2', + }, + font: { + size: { + xs: '0.75rem', + sm: '0.875rem', + md: '1rem', + lg: '1.125rem', + xl: '1.25rem', + '2xl': '1.5rem', + '3xl': '1.875rem', + '4xl': '2.25rem', + }, + lineHeight: { + xs: '1rem', + sm: '1.25rem', + md: '1.5rem', + lg: '1.75rem', + xl: '1.75rem', + '2xl': '2rem', + '3xl': '2.25rem', + '4xl': '2.5rem', + }, + weight: { + thin: '100', + extralight: '200', + light: '300', + normal: '400', + medium: '500', + semibold: '600', + bold: '700', + extrabold: '800', + black: '900', + }, + fontFamily: { + sans: [ + 'ui-sans-serif', + 'system-ui', + '-apple-system', + 'BlinkMacSystemFont', + '"Segoe UI"', + 'Roboto', + '"Helvetica Neue"', + 'Arial', + '"Noto Sans"', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"', + ].join(', '), + serif: [ + 'ui-serif', + 'Georgia', + 'Cambria', + '"Times New Roman"', + 'Times', + 'serif', + ].join(', '), + mono: [ + 'ui-monospace', + 'SFMono-Regular', + '"Menlo"', + 'Monaco', + 'Consolas', + '"Liberation Mono"', + '"Courier New"', + 'monospace', + ].join(', '), + }, + }, + shadow: { + xs: '0 1px 2px 0 rgb(0 0 0 / 0.05)', + sm: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)', + md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', + lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)', + xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)', + '2xl': '0 25px 50px -12px rgb(0 0 0 / 0.25)', + inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)', + }, + border: { + radius: { + none: '0px', + sm: '0.125rem', + md: '0.375rem', + lg: '0.5rem', + xl: '0.75rem', + '2xl': '1rem', + '3xl': '1.5rem', + full: '9999px', + xs: '0.0625rem', + }, + }, +} \ No newline at end of file diff --git a/packages/db-devtools/src/types.ts b/packages/db-devtools/src/types.ts index 66fd6c3b3..880fea31a 100644 --- a/packages/db-devtools/src/types.ts +++ b/packages/db-devtools/src/types.ts @@ -1,4 +1,5 @@ -import type { CollectionImpl, CollectionStatus } from "@tanstack/db" +import type { CollectionImpl } from "../../db/src/collection" +import type { CollectionStatus } from "../../db/src/types" export interface DbDevtoolsConfig { /** diff --git a/packages/db-devtools/src/useLocalStorage.ts b/packages/db-devtools/src/useLocalStorage.ts new file mode 100644 index 000000000..bd4456542 --- /dev/null +++ b/packages/db-devtools/src/useLocalStorage.ts @@ -0,0 +1,44 @@ +import { createSignal, createEffect } from 'solid-js' +import type { Accessor, Setter } from 'solid-js' + +export function useLocalStorage( + key: string, + defaultValue?: T, +): [Accessor, Setter] { + // Initialize with default value or try to get from localStorage + const getInitialValue = (): T => { + if (typeof window === 'undefined') { + return defaultValue as T + } + + try { + const item = window.localStorage.getItem(key) + return item ? JSON.parse(item) : defaultValue + } catch (error) { + console.warn(`Error reading localStorage key "${key}":`, error) + return defaultValue as T + } + } + + const [value, setValue] = createSignal(getInitialValue()) + + // Update localStorage when value changes + createEffect(() => { + if (typeof window === 'undefined') return + + try { + const currentValue = value() + if (currentValue === undefined) { + window.localStorage.removeItem(key) + } else { + window.localStorage.setItem(key, JSON.stringify(currentValue)) + } + } catch (error) { + console.warn(`Error setting localStorage key "${key}":`, error) + } + }) + + return [value, setValue] +} + +export default useLocalStorage \ No newline at end of file diff --git a/packages/db-devtools/src/useStyles.tsx b/packages/db-devtools/src/useStyles.tsx new file mode 100644 index 000000000..39299b30f --- /dev/null +++ b/packages/db-devtools/src/useStyles.tsx @@ -0,0 +1,374 @@ +import * as goober from 'goober' +import { createSignal, useContext } from 'solid-js' +import { tokens } from './tokens' +import { ShadowDomTargetContext } from './contexts' +import type { Accessor } from 'solid-js' + +const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { + const { colors, font, size, alpha, shadow, border } = tokens + const { fontFamily, lineHeight, size: fontSize } = font + const css = shadowDOMTarget + ? goober.css.bind({ target: shadowDOMTarget }) + : goober.css + + return { + devtoolsPanelContainer: css` + direction: ltr; + position: fixed; + bottom: 0; + right: 0; + z-index: 99999; + width: 100%; + max-height: 90%; + border-top: 1px solid ${colors.gray[700]}; + transform-origin: top; + `, + devtoolsPanelContainerVisibility: (isOpen: boolean) => { + return css` + visibility: ${isOpen ? 'visible' : 'hidden'}; + ` + }, + devtoolsPanelContainerResizing: (isResizing: Accessor) => { + if (isResizing()) { + return css` + transition: none; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + ` + } + + return css` + transition: all 0.4s ease; + ` + }, + devtoolsPanelContainerAnimation: (isOpen: boolean, height: number) => { + if (isOpen) { + return css` + pointer-events: auto; + transform: translateY(0); + ` + } + return css` + pointer-events: none; + transform: translateY(${height}px); + ` + }, + logo: css` + cursor: pointer; + display: flex; + flex-direction: column; + background-color: transparent; + border: none; + font-family: ${fontFamily.sans}; + gap: ${tokens.size[0.5]}; + padding: 0px; + &:hover { + opacity: 0.7; + } + &:focus-visible { + outline-offset: 4px; + border-radius: ${border.radius.xs}; + outline: 2px solid ${colors.blue[800]}; + } + `, + tanstackLogo: css` + font-size: ${font.size.md}; + font-weight: ${font.weight.bold}; + line-height: ${font.lineHeight.xs}; + white-space: nowrap; + color: ${colors.gray[300]}; + `, + dbLogo: css` + font-weight: ${font.weight.semibold}; + font-size: ${font.size.xs}; + background: linear-gradient(to right, rgb(249, 115, 22), rgb(194, 65, 12)); + background-clip: text; + -webkit-background-clip: text; + line-height: 1; + -webkit-text-fill-color: transparent; + white-space: nowrap; + `, + devtoolsPanel: css` + display: flex; + font-size: ${fontSize.sm}; + font-family: ${fontFamily.sans}; + background-color: ${colors.darkGray[700]}; + color: ${colors.gray[300]}; + + @media (max-width: 700px) { + flex-direction: column; + } + @media (max-width: 600px) { + font-size: ${fontSize.xs}; + } + `, + dragHandle: css` + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 4px; + cursor: row-resize; + z-index: 100000; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + &:hover { + background-color: ${colors.purple[400]}${alpha[90]}; + } + `, + firstContainer: css` + flex: 1 1 500px; + min-height: 40%; + max-height: 100%; + overflow: auto; + border-right: 1px solid ${colors.gray[700]}; + display: flex; + flex-direction: column; + `, + secondContainer: css` + flex: 1 1 500px; + min-height: 40%; + max-height: 100%; + overflow: auto; + display: flex; + flex-direction: column; + `, + collectionsList: css` + overflow-y: auto; + flex: 1; + `, + collectionsHeader: css` + display: flex; + align-items: center; + padding: ${size[2]} ${size[2.5]}; + gap: ${size[2.5]}; + border-bottom: ${colors.darkGray[500]} 1px solid; + align-items: center; + `, + mainCloseBtn: css` + background: ${colors.darkGray[700]}; + padding: ${size[1]} ${size[2]} ${size[1]} ${size[1.5]}; + border-radius: ${border.radius.md}; + position: fixed; + z-index: 99999; + display: inline-flex; + width: fit-content; + cursor: pointer; + appearance: none; + border: 0; + gap: 8px; + align-items: center; + border: 1px solid ${colors.gray[500]}; + font-size: ${font.size.xs}; + cursor: pointer; + transition: all 0.25s ease-out; + + &:hover { + background: ${colors.darkGray[500]}; + } + `, + mainCloseBtnPosition: ( + position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right', + ) => { + const base = css` + ${position === 'top-left' ? `top: ${size[2]}; left: ${size[2]};` : ''} + ${position === 'top-right' ? `top: ${size[2]}; right: ${size[2]};` : ''} + ${position === 'bottom-left' + ? `bottom: ${size[2]}; left: ${size[2]};` + : ''} + ${position === 'bottom-right' + ? `bottom: ${size[2]}; right: ${size[2]};` + : ''} + ` + return base + }, + mainCloseBtnAnimation: (isOpen: boolean) => { + if (!isOpen) { + return css` + opacity: 1; + pointer-events: auto; + visibility: visible; + ` + } + return css` + opacity: 0; + pointer-events: none; + visibility: hidden; + ` + }, + dbLogoCloseButton: css` + font-weight: ${font.weight.semibold}; + font-size: ${font.size.xs}; + background: linear-gradient(to right, rgb(249, 115, 22), rgb(194, 65, 12)); + background-clip: text; + -webkit-background-clip: text; + line-height: 1; + -webkit-text-fill-color: transparent; + white-space: nowrap; + `, + mainCloseBtnDivider: css` + width: 1px; + background: ${tokens.colors.gray[600]}; + height: 100%; + border-radius: 999999px; + color: transparent; + `, + mainCloseBtnIconContainer: css` + position: relative; + width: ${size[5]}; + height: ${size[5]}; + background: linear-gradient(45deg, #06b6d4, #3b82f6); + border-radius: 999999px; + overflow: hidden; + `, + mainCloseBtnIconOuter: css` + width: ${size[5]}; + height: ${size[5]}; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + filter: blur(3px) saturate(1.8) contrast(2); + `, + mainCloseBtnIconInner: css` + width: ${size[4]}; + height: ${size[4]}; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + `, + panelCloseBtn: css` + position: absolute; + cursor: pointer; + z-index: 100001; + display: flex; + align-items: center; + justify-content: center; + outline: none; + background-color: ${colors.darkGray[700]}; + &:hover { + background-color: ${colors.darkGray[500]}; + } + + top: 0; + right: ${size[2]}; + transform: translate(0, -100%); + border-right: ${colors.darkGray[300]} 1px solid; + border-left: ${colors.darkGray[300]} 1px solid; + border-top: ${colors.darkGray[300]} 1px solid; + border-bottom: none; + border-radius: ${border.radius.sm} ${border.radius.sm} 0px 0px; + padding: ${size[1]} ${size[1.5]} ${size[0.5]} ${size[1.5]}; + + &::after { + content: ' '; + position: absolute; + top: 100%; + left: -${size[2.5]}; + height: ${size[1.5]}; + width: calc(100% + ${size[5]}); + } + `, + panelCloseBtnIcon: css` + color: ${colors.gray[400]}; + width: ${size[2]}; + height: ${size[2]}; + `, + collectionItem: css` + display: flex; + align-items: center; + padding: ${size[2]}; + border-bottom: 1px solid ${colors.gray[700]}; + cursor: pointer; + background-color: ${colors.darkGray[700]}; + transition: all 0.2s ease; + + &:hover { + background-color: ${colors.darkGray[600]}; + } + `, + collectionItemActive: css` + background-color: ${colors.darkGray[600]}; + border-left: 3px solid ${colors.blue[500]}; + `, + collectionName: css` + font-weight: ${font.weight.medium}; + color: ${colors.gray[200]}; + flex: 1; + `, + collectionStatus: css` + font-size: ${fontSize.xs}; + padding: ${size[1]} ${size[2]}; + border-radius: ${border.radius.sm}; + font-weight: ${font.weight.medium}; + background-color: ${colors.green[900]}; + color: ${colors.green[300]}; + border: 1px solid ${colors.green[700]}; + `, + collectionStatusError: css` + background-color: ${colors.red[900]}; + color: ${colors.red[300]}; + border: 1px solid ${colors.red[700]}; + `, + collectionCount: css` + font-size: ${fontSize.xs}; + color: ${colors.gray[400]}; + margin-left: ${size[2]}; + `, + detailsPanel: css` + display: flex; + flex-direction: column; + background-color: ${colors.darkGray[700]}; + color: ${colors.gray[300]}; + width: 100%; + overflow-y: auto; + `, + detailsHeader: css` + display: flex; + align-items: center; + padding: ${size[2]}; + background-color: ${colors.darkGray[600]}; + border-bottom: 1px solid ${colors.gray[700]}; + font-weight: ${font.weight.semibold}; + color: ${colors.gray[200]}; + font-size: ${fontSize.sm}; + `, + detailsContent: css` + flex: 1; + padding: ${size[2]}; + overflow-y: auto; + `, + explorerContainer: css` + font-family: ${fontFamily.mono}; + font-size: ${fontSize.xs}; + color: ${colors.gray[300]}; + overflow-y: auto; + `, + row: css` + display: flex; + align-items: center; + padding: ${size[2]} ${size[2.5]}; + gap: ${size[2.5]}; + border-bottom: ${colors.darkGray[500]} 1px solid; + align-items: center; + `, + collectionsExplorerContainer: css` + overflow-y: auto; + flex: 1; + `, + collectionsExplorer: css` + padding: ${size[2]}; + `, + } +} + +export function useStyles() { + const shadowDomTarget = useContext(ShadowDomTargetContext) + const [_styles] = createSignal(stylesFactory(shadowDomTarget as ShadowRoot | undefined)) + return _styles +} \ No newline at end of file diff --git a/packages/db-devtools/src/utils.tsx b/packages/db-devtools/src/utils.tsx index ba8f9025c..995ec769d 100644 --- a/packages/db-devtools/src/utils.tsx +++ b/packages/db-devtools/src/utils.tsx @@ -1,156 +1,109 @@ -import { tokens } from './theme' +import { createSignal, onMount } from 'solid-js' +import type { Accessor } from 'solid-js' -export const convertRemToPixels = (rem: number) => { - return rem * parseFloat(getComputedStyle(document.documentElement).fontSize) +export function useIsMounted(): Accessor { + const [isMounted, setIsMounted] = createSignal(false) + + onMount(() => { + setIsMounted(true) + }) + + return isMounted } -export const displayValue = (value: any, truncate: boolean = false) => { - if (value === null) return 'null' - if (value === undefined) return 'undefined' - if (typeof value === 'string') { - return truncate && value.length > 100 ? value.substring(0, 100) + '...' : value - } - if (typeof value === 'number') return value.toString() - if (typeof value === 'boolean') return value ? 'true' : 'false' - if (Array.isArray(value)) { - return truncate && value.length > 10 ? `Array(${value.length})` : JSON.stringify(value) - } - if (typeof value === 'object') { - const keys = Object.keys(value) - return truncate && keys.length > 5 ? `Object(${keys.length})` : JSON.stringify(value) - } - return String(value) +export function multiSortBy( + items: T[], + sorters: ((item: T) => any)[], +): T[] { + return items.sort((a, b) => { + for (let i = 0; i < sorters.length; i++) { + const sorter = sorters[i] + if (!sorter) continue + + const aVal = sorter(a) + const bVal = sorter(b) + + if (aVal < bVal) return -1 + if (aVal > bVal) return 1 + } + return 0 + }) } -export const getStatusColor = (status: string): 'green' | 'yellow' | 'red' | 'gray' | 'blue' | 'purple' => { +export function getStatusColor(status: string): string { switch (status) { - case 'ready': + case 'active': + case 'success': return 'green' - case 'loading': - return 'yellow' case 'error': + case 'failed': return 'red' - case 'idle': - return 'gray' case 'pending': - return 'blue' - default: - return 'gray' - } -} - -export const getStatusLabel = (status: string): string => { - switch (status) { - case 'ready': - return 'Ready' case 'loading': - return 'Loading' - case 'error': - return 'Error' + return 'yellow' case 'idle': - return 'Idle' - case 'pending': - return 'Pending' default: - return 'Unknown' + return 'gray' } } -export const getSidedProp = ( - position: 'top' | 'bottom' | 'left' | 'right', - side: 'top' | 'right' | 'bottom' | 'left', - value: string | number -): string => { - return position === side ? String(value) : '0' -} - -export const sortFns = { - 'Status > Last Updated': (a: any, b: any) => { - if (a.status === b.status) { - return (b.updatedAt || 0) - (a.updatedAt || 0) - } - const statusOrder = ['error', 'loading', 'ready', 'idle'] - return statusOrder.indexOf(a.status) - statusOrder.indexOf(b.status) - }, - 'Last Updated': (a: any, b: any) => (b.updatedAt || 0) - (a.updatedAt || 0), - 'Created': (a: any, b: any) => (b.createdAt || 0) - (a.createdAt || 0), -} - -export const mutationSortFns = { - 'Status > Last Updated': (a: any, b: any) => { - if (a.state === b.state) { - return (b.updatedAt || 0) - (a.updatedAt || 0) - } - const stateOrder = ['error', 'loading', 'success', 'idle'] - return stateOrder.indexOf(a.state) - stateOrder.indexOf(b.state) - }, - 'Last Updated': (a: any, b: any) => (b.updatedAt || 0) - (a.updatedAt || 0), - 'Created': (a: any, b: any) => (b.submittedAt || 0) - (a.submittedAt || 0), +export function displayValue(value: any, space?: number): string { + if (typeof value === 'string') { + return JSON.stringify(value) + } + + if (typeof value === 'number' || typeof value === 'boolean') { + return String(value) + } + + if (value === null) { + return 'null' + } + + if (value === undefined) { + return 'undefined' + } + + if (typeof value === 'object') { + return JSON.stringify(value, null, space) + } + + return String(value) } -export const formatTime = (date: Date) => { +export function formatTimestamp(timestamp: number): string { + const date = new Date(timestamp) return date.toLocaleTimeString() } -export const formatDate = (date: Date) => { - return date.toLocaleDateString() +export function truncate(str: string, length: number): string { + if (str.length <= length) return str + return str.slice(0, length) + '...' } -export const formatDateTime = (date: Date) => { - return date.toLocaleString() -} - -export const formatDuration = (ms: number) => { - if (ms < 1000) { - return `${ms}ms` - } - if (ms < 60000) { - return `${(ms / 1000).toFixed(1)}s` - } - return `${(ms / 60000).toFixed(1)}m` +export function isObject(value: any): value is object { + return value !== null && typeof value === 'object' } -export const copyToClipboard = (text: string) => { - if (navigator.clipboard) { - navigator.clipboard.writeText(text) - } else { - const textArea = document.createElement('textarea') - textArea.value = text - document.body.appendChild(textArea) - textArea.select() - document.execCommand('copy') - document.body.removeChild(textArea) - } +export function isArray(value: any): value is any[] { + return Array.isArray(value) } -export const getCollectionStatusColor = (status: string) => { - const { colors } = tokens - switch (status) { - case 'ready': - return colors.green[500] - case 'loading': - return colors.yellow[500] - case 'error': - return colors.red[500] - case 'cleaned-up': - return colors.gray[500] - default: - return colors.gray[500] - } +export function getKeys(obj: any): string[] { + if (!isObject(obj)) return [] + return Object.keys(obj) } -export const getTransactionStatusColor = (state: string) => { - const { colors } = tokens - switch (state) { - case 'pending': - return colors.blue[500] - case 'success': - return colors.green[500] - case 'error': - return colors.red[500] - case 'idle': - return colors.gray[500] - default: - return colors.gray[500] - } +export function sortBy( + items: T[], + sorter: (item: T) => any, +): T[] { + return items.sort((a, b) => { + const aVal = sorter(a) + const bVal = sorter(b) + + if (aVal < bVal) return -1 + if (aVal > bVal) return 1 + return 0 + }) } \ No newline at end of file diff --git a/packages/db/src/collection.ts b/packages/db/src/collection.ts index 65b9ddc9e..cb19404fe 100644 --- a/packages/db/src/collection.ts +++ b/packages/db/src/collection.ts @@ -24,18 +24,16 @@ export const collectionsStore = new Map>() // Check for devtools registry and register collection if available function registerWithDevtools(collection: CollectionImpl): void { - if (typeof window !== `undefined` && window.__TANSTACK_DB_DEVTOOLS__) { - window.__TANSTACK_DB_DEVTOOLS__.registerCollection(collection) + if (typeof window !== `undefined` && (window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { + (window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__(collection) } } // Declare the devtools registry on window declare global { interface Window { - __TANSTACK_DB_DEVTOOLS__?: { - registerCollection: (collection: CollectionImpl) => void - unregisterCollection: (id: string) => void - } + __TANSTACK_DB_DEVTOOLS_REGISTER__?: (collection: CollectionImpl) => void + __TANSTACK_DB_DEVTOOLS_UNREGISTER__?: (id: string) => void } } @@ -548,8 +546,8 @@ export class CollectionImpl< } // Unregister from devtools if available - if (typeof window !== `undefined` && window.__TANSTACK_DB_DEVTOOLS__) { - window.__TANSTACK_DB_DEVTOOLS__.unregisterCollection(this.id) + if (typeof window !== `undefined` && (window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__) { + (window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__(this.id) } // Clear data diff --git a/packages/react-db-devtools/src/ReactDbDevtools.tsx b/packages/react-db-devtools/src/ReactDbDevtools.tsx index 25043ccea..ef99ed92d 100644 --- a/packages/react-db-devtools/src/ReactDbDevtools.tsx +++ b/packages/react-db-devtools/src/ReactDbDevtools.tsx @@ -3,96 +3,192 @@ import { useEffect, useRef, useState } from "react" import { TanstackDbDevtools } from "@tanstack/db-devtools" import type { TanstackDbDevtoolsConfig } from "@tanstack/db-devtools" -export interface ReactDbDevtoolsProps extends TanstackDbDevtoolsConfig { +export interface TanStackReactDbDevtoolsProps extends TanstackDbDevtoolsConfig { // Additional React-specific props if needed } -export function ReactDbDevtools(props: ReactDbDevtoolsProps = {}) { +export function TanStackReactDbDevtools(props: TanStackReactDbDevtoolsProps = {}) { const ref = useRef(null) - const [devtools] = useState(() => new TanstackDbDevtools(props)) + const [devtools, setDevtools] = useState(null) + const initializingRef = useRef(false) + + console.log('ReactDbDevtools: Component rendered with props:', props) + + // Initialize devtools only on client side + useEffect(() => { + console.log('ReactDbDevtools: useEffect triggered') + console.log('ReactDbDevtools: window exists:', typeof window !== 'undefined') + console.log('ReactDbDevtools: ref.current exists:', !!ref.current) + console.log('ReactDbDevtools: already initializing:', initializingRef.current) + + if (typeof window === 'undefined' || !ref.current || initializingRef.current) { + console.log('ReactDbDevtools: Early return - no window, ref, or already initializing') + return + } + + // Set flag to prevent multiple initializations + initializingRef.current = true + + // Note: Devtools registry is now initialized in main.tsx before collections are created + console.log('ReactDbDevtools: Skipping devtools initialization (done in main.tsx)') + + console.log('ReactDbDevtools: Creating TanstackDbDevtools instance') + const devtoolsInstance = new TanstackDbDevtools(props) + + try { + console.log('ReactDbDevtools: Attempting to mount devtools') + // Mount the devtools to the DOM element + devtoolsInstance.mount(ref.current) + console.log('ReactDbDevtools: Devtools mounted successfully') + setDevtools(devtoolsInstance) + } catch (error) { + console.error('ReactDbDevtools: Failed to mount DB devtools:', error) + initializingRef.current = false // Reset flag on error + } + + return () => { + console.log('ReactDbDevtools: Cleanup - unmounting devtools') + try { + // Only unmount if the devtools were successfully mounted + if (devtoolsInstance) { + devtoolsInstance.unmount() + console.log('ReactDbDevtools: Devtools unmounted successfully') + } + } catch (error) { + // Ignore unmount errors if devtools weren't mounted + console.warn('ReactDbDevtools: Error unmounting DB devtools:', error) + } + initializingRef.current = false + } + }, []) // Empty dependency array to prevent remounting // Update devtools when props change useEffect(() => { + if (!devtools) return + if (props.initialIsOpen !== undefined) { devtools.setInitialIsOpen(props.initialIsOpen) } - }, [devtools, props.initialIsOpen]) - - useEffect(() => { - if (props.position) { + + if (props.position !== undefined) { devtools.setPosition(props.position) } - }, [devtools, props.position]) - - useEffect(() => { - if (props.panelProps) { + + if (props.panelProps !== undefined) { devtools.setPanelProps(props.panelProps) } - }, [devtools, props.panelProps]) - - useEffect(() => { - if (props.toggleButtonProps) { + + if (props.toggleButtonProps !== undefined) { devtools.setToggleButtonProps(props.toggleButtonProps) } - }, [devtools, props.toggleButtonProps]) - - useEffect(() => { - if (props.closeButtonProps) { + + if (props.closeButtonProps !== undefined) { devtools.setCloseButtonProps(props.closeButtonProps) } - }, [devtools, props.closeButtonProps]) - - useEffect(() => { - if (props.storageKey) { + + if (props.storageKey !== undefined) { devtools.setStorageKey(props.storageKey) } - }, [devtools, props.storageKey]) - - useEffect(() => { - if (props.panelState) { + + if (props.panelState !== undefined) { devtools.setPanelState(props.panelState) } - }, [devtools, props.panelState]) - - useEffect(() => { - if (props.onPanelStateChange) { + + if (props.onPanelStateChange !== undefined) { devtools.setOnPanelStateChange(props.onPanelStateChange) } - }, [devtools, props.onPanelStateChange]) + }, [ + devtools, + props.initialIsOpen, + props.position, + props.panelProps, + props.toggleButtonProps, + props.closeButtonProps, + props.storageKey, + props.panelState, + props.onPanelStateChange, + ]) + + // Render a container div for the devtools + return
+} + +export function TanStackReactDbDevtoolsPanel(props: TanStackReactDbDevtoolsProps = {}) { + const ref = useRef(null) + const [devtools, setDevtools] = useState(null) + // Initialize devtools only on client side useEffect(() => { - if (ref.current) { - devtools.mount(ref.current) + if (typeof window === 'undefined' || !ref.current) return + + const devtoolsInstance = new TanstackDbDevtools(props) + + try { + // Mount the devtools to the DOM element + devtoolsInstance.mount(ref.current) + setDevtools(devtoolsInstance) + } catch (error) { + console.error('Failed to mount DB devtools panel:', error) } - + return () => { - devtools.unmount() + try { + // Only unmount if the devtools were successfully mounted + devtoolsInstance.unmount() + } catch (error) { + // Ignore unmount errors if devtools weren't mounted + console.warn('Error unmounting DB devtools panel:', error) + } } - }, [devtools]) - - return
-} + }, []) -export function ReactDbDevtoolsPanel(props: ReactDbDevtoolsProps = {}) { - const ref = useRef(null) - const [devtools] = useState(() => new TanstackDbDevtools(props)) - - // Similar prop updates... + // Update devtools when props change useEffect(() => { + if (!devtools) return + if (props.initialIsOpen !== undefined) { devtools.setInitialIsOpen(props.initialIsOpen) } - }, [devtools, props.initialIsOpen]) - - useEffect(() => { - if (ref.current) { - devtools.mount(ref.current) + + if (props.position !== undefined) { + devtools.setPosition(props.position) } - - return () => { - devtools.unmount() + + if (props.panelProps !== undefined) { + devtools.setPanelProps(props.panelProps) } - }, [devtools]) - - return
+ + if (props.toggleButtonProps !== undefined) { + devtools.setToggleButtonProps(props.toggleButtonProps) + } + + if (props.closeButtonProps !== undefined) { + devtools.setCloseButtonProps(props.closeButtonProps) + } + + if (props.storageKey !== undefined) { + devtools.setStorageKey(props.storageKey) + } + + if (props.panelState !== undefined) { + devtools.setPanelState(props.panelState) + } + + if (props.onPanelStateChange !== undefined) { + devtools.setOnPanelStateChange(props.onPanelStateChange) + } + }, [ + devtools, + props.initialIsOpen, + props.position, + props.panelProps, + props.toggleButtonProps, + props.closeButtonProps, + props.storageKey, + props.panelState, + props.onPanelStateChange, + ]) + + // Render a container div for the devtools panel + return
} diff --git a/packages/react-db-devtools/src/index.ts b/packages/react-db-devtools/src/index.ts index dd2c614bf..25b543859 100644 --- a/packages/react-db-devtools/src/index.ts +++ b/packages/react-db-devtools/src/index.ts @@ -1,4 +1,134 @@ -export * from "./ReactDbDevtools" +'use client' -// Export development utilities -export { ReactDbDevtools, ReactDbDevtoolsPanel } from "./ReactDbDevtools" +import * as React from 'react' + +function DevtoolsWrapper(props: any) { + const [isClient, setIsClient] = React.useState(false) + const [DevtoolsComponent, setDevtoolsComponent] = React.useState | null>(null) + + React.useEffect(() => { + // Only run on client after hydration + setIsClient(true) + + // Dynamically import the devtools component + import('./ReactDbDevtools').then((module) => { + setDevtoolsComponent(() => module.TanStackReactDbDevtools) + }) + }, []) + + // Always render null during SSR and initial client render to prevent hydration mismatch + if (!isClient || !DevtoolsComponent) { + return null + } + + return React.createElement(DevtoolsComponent, props) +} + +function DevtoolsPanelWrapper(props: any) { + const [isClient, setIsClient] = React.useState(false) + const [DevtoolsComponent, setDevtoolsComponent] = React.useState | null>(null) + + React.useEffect(() => { + setIsClient(true) + + import('./ReactDbDevtools').then((module) => { + setDevtoolsComponent(() => module.TanStackReactDbDevtoolsPanel) + }) + }, []) + + if (!isClient || !DevtoolsComponent) { + return null + } + + return React.createElement(DevtoolsComponent, props) +} + +// Follow TanStack Query devtools pattern exactly +export const TanStackReactDbDevtools: React.ComponentType = + typeof window === 'undefined' || process.env.NODE_ENV !== 'development' + ? () => null + : DevtoolsWrapper + +export const TanStackReactDbDevtoolsPanel: React.ComponentType = + typeof window === 'undefined' || process.env.NODE_ENV !== 'development' + ? () => null + : DevtoolsPanelWrapper + +export type { TanStackReactDbDevtoolsProps } from './ReactDbDevtools' + +// SSR-safe initialization function - implement directly to avoid importing from the SolidJS package +export function initializeDbDevtools(): void { + // SSR safety check + if (typeof window === 'undefined') { + console.log('DbDevtools: SSR environment detected, skipping initialization') + return + } + + console.log('DbDevtools: Initializing devtools...') + + // Initialize the registry directly without importing SolidJS code + if (!(window as any).__TANSTACK_DB_DEVTOOLS__) { + console.log('DbDevtools: Creating registry...') + + const registry = { + collections: new Map(), + registerCollection: () => {}, + unregisterCollection: () => {}, + getCollection: () => undefined, + releaseCollection: () => {}, + getAllCollectionMetadata: () => [], + getCollectionMetadata: () => undefined, + getTransactions: () => [], + getTransaction: () => undefined, + cleanup: () => {}, + isInitialized: true, + } + + // Set up the registry on window + ;(window as any).__TANSTACK_DB_DEVTOOLS__ = registry + + // Set up automatic collection registration + ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { + console.log('DbDevtools: Registering collection:', collection.id) + console.log('DbDevtools: Collection details:', { + id: collection.id, + size: collection.size || 0, + status: collection.status || 'idle', + constructor: collection.constructor.name + }) + + if (registry && registry.collections) { + registry.collections.set(collection.id, { + collection, + metadata: { + id: collection.id, + size: collection.size || 0, + type: 'unknown', + status: collection.status || 'idle', + hasTransactions: false, + transactionCount: 0, + } + }) + console.log('DbDevtools: Collection registered successfully:', collection.id) + console.log('DbDevtools: Total collections now:', registry.collections.size) + console.log('DbDevtools: Registry collections:', Array.from(registry.collections.keys())) + } else { + console.warn('DbDevtools: Registry or collections not available') + } + } + + ;(window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__ = (id: string) => { + console.log('DbDevtools: Unregistering collection:', id) + if (registry.collections) { + registry.collections.delete(id) + console.log('DbDevtools: Collection unregistered successfully:', id) + } + } + + console.log('DbDevtools: Registry created successfully') + } else { + console.log('DbDevtools: Registry already exists') + } + + console.log('DbDevtools: Initialization complete') +} diff --git a/packages/vue-db-devtools/package.json b/packages/vue-db-devtools/package.json deleted file mode 100644 index 599dca187..000000000 --- a/packages/vue-db-devtools/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "@tanstack/vue-db-devtools", - "version": "0.0.1", - "description": "Vue wrapper for TanStack DB Devtools", - "author": "tanstack", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/TanStack/db.git", - "directory": "packages/vue-db-devtools" - }, - "homepage": "https://tanstack.com/db", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "type": "module", - "exports": { - ".": { - "import": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - }, - "require": { - "types": "./dist/index.d.cts", - "default": "./dist/index.cjs" - } - } - }, - "sideEffects": false, - "files": [ - "dist" - ], - "engines": { - "node": ">=18" - }, - "scripts": { - "build": "tsup", - "dev": "tsup --watch", - "test": "vitest", - "test:ci": "vitest run", - "lint": "eslint src", - "clean": "rm -rf dist" - }, - "dependencies": { - "@tanstack/db-devtools": "workspace:*" - }, - "peerDependencies": { - "@tanstack/vue-db": "workspace:*", - "vue": ">=3" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "tsup": "^8.0.0", - "typescript": "^5.0.0", - "vue": "^3.0.0", - "vite": "^5.0.0", - "vitest": "^1.0.0" - } -} \ No newline at end of file diff --git a/packages/vue-db-devtools/src/VueDbDevtools.vue b/packages/vue-db-devtools/src/VueDbDevtools.vue deleted file mode 100644 index b8a996435..000000000 --- a/packages/vue-db-devtools/src/VueDbDevtools.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/packages/vue-db-devtools/src/index.ts b/packages/vue-db-devtools/src/index.ts deleted file mode 100644 index 41ab8dab2..000000000 --- a/packages/vue-db-devtools/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Export types only for now - Vue SFC files need different build setup -export type { VueDbDevtoolsProps } from "./VueDbDevtools.vue" - -// Re-export devtools functions -export { initializeDbDevtools } from "@tanstack/db-devtools" diff --git a/packages/vue-db-devtools/tsconfig.json b/packages/vue-db-devtools/tsconfig.json deleted file mode 100644 index 7a3b2a3ca..000000000 --- a/packages/vue-db-devtools/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "dist", - "declaration": true, - "declarationMap": true, - "jsx": "preserve" - }, - "include": ["src/**/*"], - "exclude": ["dist", "node_modules"] -} \ No newline at end of file diff --git a/packages/vue-db-devtools/tsup.config.ts b/packages/vue-db-devtools/tsup.config.ts deleted file mode 100644 index ac48f869a..000000000 --- a/packages/vue-db-devtools/tsup.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from "tsup" - -export default defineConfig({ - entry: ["src/index.ts"], - format: ["esm", "cjs"], - dts: false, - sourcemap: true, - clean: true, - external: ["vue", "solid-js", "@tanstack/db-devtools"], -}) \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb99dabb2..12465e35a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -101,6 +101,9 @@ importers: '@tanstack/db-collections': specifier: ^0.0.23 version: link:../../../packages/db-collections + '@tanstack/db-devtools': + specifier: workspace:* + version: link:../../../packages/db-devtools '@tanstack/query-core': specifier: ^5.81.5 version: 5.81.5 @@ -113,6 +116,9 @@ importers: '@tanstack/react-router': specifier: ^1.125.6 version: 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-router-devtools': + specifier: ^1.127.3 + version: 1.127.3(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.125.4)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.7)(tiny-invariant@1.3.3) '@tanstack/react-start': specifier: ^1.126.1 version: 1.126.1(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(drizzle-orm@0.40.1(@types/pg@8.15.4)(gel@2.1.1)(kysely@0.28.2)(pg@8.16.3)(postgres@3.4.7))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(vite-plugin-solid@2.11.7(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)))(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) @@ -378,34 +384,6 @@ importers: specifier: ^3.5.13 version: 3.5.17(typescript@5.8.3) - packages/vue-db-devtools: - dependencies: - '@tanstack/db-devtools': - specifier: workspace:* - version: link:../db-devtools - '@tanstack/vue-db': - specifier: workspace:* - version: link:../vue-db - devDependencies: - '@types/node': - specifier: ^20.0.0 - version: 20.19.5 - tsup: - specifier: ^8.0.0 - version: 8.5.0(@microsoft/api-extractor@7.52.8(@types/node@20.19.5))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) - typescript: - specifier: ^5.0.0 - version: 5.8.3 - vite: - specifier: ^5.0.0 - version: 5.4.19(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1) - vitest: - specifier: ^1.0.0 - version: 1.6.1(@types/node@20.19.5)(happy-dom@18.0.1)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1) - vue: - specifier: ^3.0.0 - version: 3.5.17(typescript@5.8.3) - packages: '@adobe/css-tools@4.4.2': @@ -738,12 +716,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.0': resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} engines: {node: '>=18'} @@ -780,12 +752,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.0': resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} @@ -822,12 +788,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.0': resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} @@ -864,12 +824,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.0': resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} @@ -906,12 +860,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.0': resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} @@ -948,12 +896,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.0': resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} @@ -990,12 +932,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.0': resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} @@ -1032,12 +968,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.0': resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} @@ -1074,12 +1004,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.0': resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} @@ -1116,12 +1040,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.0': resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} @@ -1158,12 +1076,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.0': resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} @@ -1200,12 +1112,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.0': resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} @@ -1242,12 +1148,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.0': resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} @@ -1284,12 +1184,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.0': resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} @@ -1326,12 +1220,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.0': resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} @@ -1368,12 +1256,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.0': resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} @@ -1410,12 +1292,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.0': resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} engines: {node: '>=18'} @@ -1476,12 +1352,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.0': resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} @@ -1542,12 +1412,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.0': resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} @@ -1590,12 +1454,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.0': resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} @@ -1632,12 +1490,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.0': resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} @@ -1674,12 +1526,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.0': resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} @@ -1716,12 +1562,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.0': resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} engines: {node: '>=18'} @@ -1858,10 +1698,6 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} @@ -2438,9 +2274,6 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/is@7.0.2': resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} engines: {node: '>=18'} @@ -2668,6 +2501,14 @@ packages: peerDependencies: react: '>=16.8.0' + '@tanstack/react-router-devtools@1.127.3': + resolution: {integrity: sha512-MS8+ArGAoRpFaVWpXnQxNpq2bU5e2WGwV/3Gskh9YB09gqX3t6knp9im4kJ0kam16+A8Vohq1yOpCliyHzQawA==} + engines: {node: '>=12'} + peerDependencies: + '@tanstack/react-router': ^1.127.3 + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + '@tanstack/react-router@1.125.6': resolution: {integrity: sha512-znyUGTq+WRhXwToNTYiluUBLjMdQVxz+ZQ9Ep2PBuS9O+3Qm3kaM7n64hA84ISoCtLqMwTo7Ofw0W4WeLdjpYg==} engines: {node: '>=12'} @@ -2715,6 +2556,18 @@ packages: resolution: {integrity: sha512-tdgGI0Kwt3Lgs9ceLbG32NPh4I2H1T9t2TKjcS+I78sifm5rjTWV8lfqVRNrvMPk5ek60vXPOL2AHAUg6ohwsA==} engines: {node: '>=12'} + '@tanstack/router-devtools-core@1.127.3': + resolution: {integrity: sha512-TaLa0h7efSTmIMckTJ1s4PuvJSRGGv4PBSDQE9QnrtCn3SJAlzjK6VIcGq3C72QKJiVDyDtCcDas4q0YeT8I+A==} + engines: {node: '>=12'} + peerDependencies: + '@tanstack/router-core': ^1.127.3 + csstype: ^3.0.10 + solid-js: '>=1.9.5' + tiny-invariant: ^1.3.3 + peerDependenciesMeta: + csstype: + optional: true + '@tanstack/router-generator@1.125.4': resolution: {integrity: sha512-jF71znMvpZxmkQF0MxfjKKyvXtft9NWRCVcLhb+6d/8nrVGNiEw+dsXn/CLpeRQLk7Mg/fsp/WipBql1dd3Qaw==} engines: {node: '>=12'} @@ -3117,9 +2970,6 @@ packages: peerDependencies: vitest: 3.2.4 - '@vitest/expect@1.6.1': - resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} - '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} @@ -3137,27 +2987,15 @@ packages: '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@1.6.1': - resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} - '@vitest/runner@3.2.4': resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@1.6.1': - resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} - '@vitest/snapshot@3.2.4': resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@1.6.1': - resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} - '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@1.6.1': - resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} - '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} @@ -3264,10 +3102,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -3403,9 +3237,6 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -3558,10 +3389,6 @@ packages: caniuse-lite@1.0.30001727: resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} @@ -3581,9 +3408,6 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -3916,10 +3740,6 @@ packages: decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -4021,10 +3841,6 @@ packages: peerDependencies: typescript: ^5.4.4 - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@8.0.2: resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} @@ -4295,11 +4111,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.25.0: resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} engines: {node: '>=18'} @@ -4691,9 +4502,6 @@ packages: resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} engines: {node: '>=18'} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.7: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} @@ -5473,9 +5281,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} @@ -5890,10 +5695,6 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -6014,9 +5815,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} @@ -6182,10 +5980,6 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -6257,9 +6051,6 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-refresh@0.17.0: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} @@ -6772,9 +6563,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.1: - resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} - strip-literal@3.0.0: resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} @@ -6881,10 +6669,6 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} - tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6893,10 +6677,6 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - tinyspy@4.0.3: resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} @@ -7012,10 +6792,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} @@ -7276,11 +7052,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite-node@1.6.1: - resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -7328,37 +7099,6 @@ packages: vite: optional: true - vite@5.4.19: - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - vite@6.3.5: resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -7447,31 +7187,6 @@ packages: vite: optional: true - vitest@1.6.1: - resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.1 - '@vitest/ui': 1.6.1 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vitest@3.2.4: resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -8190,9 +7905,6 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true - '@esbuild/aix-ppc64@0.21.5': - optional: true - '@esbuild/aix-ppc64@0.25.0': optional: true @@ -8211,9 +7923,6 @@ snapshots: '@esbuild/android-arm64@0.19.12': optional: true - '@esbuild/android-arm64@0.21.5': - optional: true - '@esbuild/android-arm64@0.25.0': optional: true @@ -8232,9 +7941,6 @@ snapshots: '@esbuild/android-arm@0.19.12': optional: true - '@esbuild/android-arm@0.21.5': - optional: true - '@esbuild/android-arm@0.25.0': optional: true @@ -8253,9 +7959,6 @@ snapshots: '@esbuild/android-x64@0.19.12': optional: true - '@esbuild/android-x64@0.21.5': - optional: true - '@esbuild/android-x64@0.25.0': optional: true @@ -8274,9 +7977,6 @@ snapshots: '@esbuild/darwin-arm64@0.19.12': optional: true - '@esbuild/darwin-arm64@0.21.5': - optional: true - '@esbuild/darwin-arm64@0.25.0': optional: true @@ -8295,9 +7995,6 @@ snapshots: '@esbuild/darwin-x64@0.19.12': optional: true - '@esbuild/darwin-x64@0.21.5': - optional: true - '@esbuild/darwin-x64@0.25.0': optional: true @@ -8316,9 +8013,6 @@ snapshots: '@esbuild/freebsd-arm64@0.19.12': optional: true - '@esbuild/freebsd-arm64@0.21.5': - optional: true - '@esbuild/freebsd-arm64@0.25.0': optional: true @@ -8337,9 +8031,6 @@ snapshots: '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.21.5': - optional: true - '@esbuild/freebsd-x64@0.25.0': optional: true @@ -8358,9 +8049,6 @@ snapshots: '@esbuild/linux-arm64@0.19.12': optional: true - '@esbuild/linux-arm64@0.21.5': - optional: true - '@esbuild/linux-arm64@0.25.0': optional: true @@ -8379,9 +8067,6 @@ snapshots: '@esbuild/linux-arm@0.19.12': optional: true - '@esbuild/linux-arm@0.21.5': - optional: true - '@esbuild/linux-arm@0.25.0': optional: true @@ -8400,9 +8085,6 @@ snapshots: '@esbuild/linux-ia32@0.19.12': optional: true - '@esbuild/linux-ia32@0.21.5': - optional: true - '@esbuild/linux-ia32@0.25.0': optional: true @@ -8421,9 +8103,6 @@ snapshots: '@esbuild/linux-loong64@0.19.12': optional: true - '@esbuild/linux-loong64@0.21.5': - optional: true - '@esbuild/linux-loong64@0.25.0': optional: true @@ -8442,9 +8121,6 @@ snapshots: '@esbuild/linux-mips64el@0.19.12': optional: true - '@esbuild/linux-mips64el@0.21.5': - optional: true - '@esbuild/linux-mips64el@0.25.0': optional: true @@ -8463,9 +8139,6 @@ snapshots: '@esbuild/linux-ppc64@0.19.12': optional: true - '@esbuild/linux-ppc64@0.21.5': - optional: true - '@esbuild/linux-ppc64@0.25.0': optional: true @@ -8484,9 +8157,6 @@ snapshots: '@esbuild/linux-riscv64@0.19.12': optional: true - '@esbuild/linux-riscv64@0.21.5': - optional: true - '@esbuild/linux-riscv64@0.25.0': optional: true @@ -8505,9 +8175,6 @@ snapshots: '@esbuild/linux-s390x@0.19.12': optional: true - '@esbuild/linux-s390x@0.21.5': - optional: true - '@esbuild/linux-s390x@0.25.0': optional: true @@ -8526,9 +8193,6 @@ snapshots: '@esbuild/linux-x64@0.19.12': optional: true - '@esbuild/linux-x64@0.21.5': - optional: true - '@esbuild/linux-x64@0.25.0': optional: true @@ -8559,9 +8223,6 @@ snapshots: '@esbuild/netbsd-x64@0.19.12': optional: true - '@esbuild/netbsd-x64@0.21.5': - optional: true - '@esbuild/netbsd-x64@0.25.0': optional: true @@ -8592,9 +8253,6 @@ snapshots: '@esbuild/openbsd-x64@0.19.12': optional: true - '@esbuild/openbsd-x64@0.21.5': - optional: true - '@esbuild/openbsd-x64@0.25.0': optional: true @@ -8616,9 +8274,6 @@ snapshots: '@esbuild/sunos-x64@0.19.12': optional: true - '@esbuild/sunos-x64@0.21.5': - optional: true - '@esbuild/sunos-x64@0.25.0': optional: true @@ -8637,9 +8292,6 @@ snapshots: '@esbuild/win32-arm64@0.19.12': optional: true - '@esbuild/win32-arm64@0.21.5': - optional: true - '@esbuild/win32-arm64@0.25.0': optional: true @@ -8658,9 +8310,6 @@ snapshots: '@esbuild/win32-ia32@0.19.12': optional: true - '@esbuild/win32-ia32@0.21.5': - optional: true - '@esbuild/win32-ia32@0.25.0': optional: true @@ -8679,9 +8328,6 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true - '@esbuild/win32-x64@0.21.5': - optional: true - '@esbuild/win32-x64@0.25.0': optional: true @@ -8810,10 +8456,6 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - '@jridgewell/gen-mapping@0.3.12': dependencies: '@jridgewell/sourcemap-codec': 1.5.4 @@ -8916,15 +8558,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.30.6(@types/node@20.19.5)': - dependencies: - '@microsoft/tsdoc': 0.15.1 - '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@20.19.5) - transitivePeerDependencies: - - '@types/node' - optional: true - '@microsoft/api-extractor-model@7.30.6(@types/node@22.16.1)': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -8960,25 +8593,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.8(@types/node@20.19.5)': - dependencies: - '@microsoft/api-extractor-model': 7.30.6(@types/node@20.19.5) - '@microsoft/tsdoc': 0.15.1 - '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@20.19.5) - '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.3(@types/node@20.19.5) - '@rushstack/ts-command-line': 5.0.1(@types/node@20.19.5) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.10 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.8.2 - transitivePeerDependencies: - - '@types/node' - optional: true - '@microsoft/api-extractor@7.52.8(@types/node@22.16.1)': dependencies: '@microsoft/api-extractor-model': 7.30.6(@types/node@22.16.1) @@ -9417,20 +9031,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.44.2': optional: true - '@rushstack/node-core-library@5.13.1(@types/node@20.19.5)': - dependencies: - ajv: 8.13.0 - ajv-draft-04: 1.0.0(ajv@8.13.0) - ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 11.3.0 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.10 - semver: 7.5.4 - optionalDependencies: - '@types/node': 20.19.5 - optional: true - '@rushstack/node-core-library@5.13.1(@types/node@22.16.1)': dependencies: ajv: 8.13.0 @@ -9483,14 +9083,6 @@ snapshots: optionalDependencies: '@types/node': 22.16.1 - '@rushstack/terminal@0.15.3(@types/node@20.19.5)': - dependencies: - '@rushstack/node-core-library': 5.13.1(@types/node@20.19.5) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 20.19.5 - optional: true - '@rushstack/terminal@0.15.3(@types/node@22.16.1)': dependencies: '@rushstack/node-core-library': 5.13.1(@types/node@22.16.1) @@ -9515,16 +9107,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@rushstack/ts-command-line@5.0.1(@types/node@20.19.5)': - dependencies: - '@rushstack/terminal': 0.15.3(@types/node@20.19.5) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - optional: true - '@rushstack/ts-command-line@5.0.1(@types/node@22.16.1)': dependencies: '@rushstack/terminal': 0.15.3(@types/node@22.16.1) @@ -9556,8 +9138,6 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@sinclair/typebox@0.27.8': {} - '@sindresorhus/is@7.0.2': {} '@sindresorhus/merge-streams@2.3.0': {} @@ -9810,6 +9390,18 @@ snapshots: transitivePeerDependencies: - typescript + '@tanstack/react-router-devtools@1.127.3(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.125.4)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.7)(tiny-invariant@1.3.3)': + dependencies: + '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-devtools-core': 1.127.3(@tanstack/router-core@1.125.4)(csstype@3.1.3)(solid-js@1.9.7)(tiny-invariant@1.3.3) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + transitivePeerDependencies: + - '@tanstack/router-core' + - csstype + - solid-js + - tiny-invariant + '@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@tanstack/history': 1.121.34 @@ -9943,6 +9535,16 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 + '@tanstack/router-devtools-core@1.127.3(@tanstack/router-core@1.125.4)(csstype@3.1.3)(solid-js@1.9.7)(tiny-invariant@1.3.3)': + dependencies: + '@tanstack/router-core': 1.125.4 + clsx: 2.1.1 + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.7 + tiny-invariant: 1.3.3 + optionalDependencies: + csstype: 3.1.3 + '@tanstack/router-generator@1.125.4': dependencies: '@tanstack/router-core': 1.125.4 @@ -10250,6 +9852,7 @@ snapshots: '@types/node@20.19.5': dependencies: undici-types: 6.21.0 + optional: true '@types/node@22.16.1': dependencies: @@ -10522,12 +10125,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@1.6.1': - dependencies: - '@vitest/spy': 1.6.1 - '@vitest/utils': 1.6.1 - chai: 4.5.0 - '@vitest/expect@3.2.4': dependencies: '@types/chai': 5.2.2 @@ -10556,45 +10153,22 @@ snapshots: dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@1.6.1': - dependencies: - '@vitest/utils': 1.6.1 - p-limit: 5.0.0 - pathe: 1.1.2 - '@vitest/runner@3.2.4': dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 strip-literal: 3.0.0 - '@vitest/snapshot@1.6.1': - dependencies: - magic-string: 0.30.17 - pathe: 1.1.2 - pretty-format: 29.7.0 - '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@1.6.1': - dependencies: - tinyspy: 2.2.1 - '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.3 - '@vitest/utils@1.6.1': - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 @@ -10750,10 +10324,6 @@ snapshots: dependencies: acorn: 8.15.0 - acorn-walk@8.3.4: - dependencies: - acorn: 8.15.0 - acorn@8.15.0: {} agent-base@7.1.3: {} @@ -10909,8 +10479,6 @@ snapshots: get-intrinsic: 1.2.7 is-array-buffer: 3.0.5 - assertion-error@1.1.0: {} - assertion-error@2.0.1: {} ast-module-types@6.0.1: {} @@ -11083,16 +10651,6 @@ snapshots: caniuse-lite@1.0.30001727: {} - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - chai@5.2.0: dependencies: assertion-error: 2.0.1 @@ -11115,10 +10673,6 @@ snapshots: chardet@0.7.0: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - check-error@2.1.1: {} cheerio-select@2.1.0: @@ -11428,10 +10982,6 @@ snapshots: decimal.js@10.5.0: {} - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -11526,8 +11076,6 @@ snapshots: transitivePeerDependencies: - supports-color - diff-sequences@29.6.3: {} - diff@8.0.2: {} dir-glob@3.0.1: @@ -11820,32 +11368,6 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - esbuild@0.25.0: optionalDependencies: '@esbuild/aix-ppc64': 0.25.0 @@ -12426,8 +11948,6 @@ snapshots: get-east-asian-width@1.3.0: {} - get-func-name@2.0.2: {} - get-intrinsic@1.2.7: dependencies: call-bind-apply-helpers: 1.0.2 @@ -13240,10 +12760,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - loupe@3.1.3: {} loupe@3.1.4: {} @@ -13719,10 +13235,6 @@ snapshots: dependencies: yocto-queue: 1.2.1 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.2.1 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -13822,8 +13334,6 @@ snapshots: pathe@2.0.3: {} - pathval@1.1.1: {} - pathval@2.0.0: {} pend@1.2.0: {} @@ -13967,12 +13477,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - process-nextick-args@2.0.1: {} process@0.11.10: {} @@ -14043,8 +13547,6 @@ snapshots: react-is@17.0.2: {} - react-is@18.3.1: {} - react-refresh@0.17.0: {} react@19.1.0: {} @@ -14680,10 +14182,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.1.1: - dependencies: - js-tokens: 9.0.1 - strip-literal@3.0.0: dependencies: js-tokens: 9.0.1 @@ -14792,14 +14290,10 @@ snapshots: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@0.8.4: {} - tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyspy@2.2.1: {} - tinyspy@4.0.3: {} tldts-core@6.1.78: {} @@ -14870,35 +14364,6 @@ snapshots: - solid-js - supports-color - tsup@8.5.0(@microsoft/api-extractor@7.52.8(@types/node@20.19.5))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): - dependencies: - bundle-require: 5.1.0(esbuild@0.25.0) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.0 - debug: 4.4.0 - esbuild: 0.25.0 - fix-dts-default-cjs-exports: 1.0.1 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0) - resolve-from: 5.0.0 - rollup: 4.34.8 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.12 - tree-kill: 1.2.2 - optionalDependencies: - '@microsoft/api-extractor': 7.52.8(@types/node@20.19.5) - postcss: 8.5.6 - typescript: 5.8.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - tsup@8.5.0(@microsoft/api-extractor@7.52.8(@types/node@22.16.1))(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): dependencies: bundle-require: 5.1.0(esbuild@0.25.0) @@ -14968,8 +14433,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.1.0: {} - type-fest@0.6.0: {} type-fest@4.41.0: {} @@ -15234,24 +14697,6 @@ snapshots: vary@1.1.2: {} - vite-node@1.6.1(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1): - dependencies: - cac: 6.7.14 - debug: 4.4.1 - pathe: 1.1.2 - picocolors: 1.1.1 - vite: 5.4.19(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vite-node@3.2.4(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 @@ -15378,17 +14823,6 @@ snapshots: - supports-color - typescript - vite@5.4.19(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1): - dependencies: - esbuild: 0.21.5 - postcss: 8.5.6 - rollup: 4.44.2 - optionalDependencies: - '@types/node': 20.19.5 - fsevents: 2.3.3 - lightningcss: 1.30.1 - terser: 5.43.1 - vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: esbuild: 0.25.6 @@ -15449,42 +14883,6 @@ snapshots: optionalDependencies: vite: 7.0.3(@types/node@24.0.11)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) - vitest@1.6.1(@types/node@20.19.5)(happy-dom@18.0.1)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1): - dependencies: - '@vitest/expect': 1.6.1 - '@vitest/runner': 1.6.1 - '@vitest/snapshot': 1.6.1 - '@vitest/spy': 1.6.1 - '@vitest/utils': 1.6.1 - acorn-walk: 8.3.4 - chai: 4.5.0 - debug: 4.4.1 - execa: 8.0.1 - local-pkg: 0.5.1 - magic-string: 0.30.17 - pathe: 1.1.2 - picocolors: 1.1.1 - std-env: 3.9.0 - strip-literal: 2.1.1 - tinybench: 2.9.0 - tinypool: 0.8.4 - vite: 5.4.19(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1) - vite-node: 1.6.1(@types/node@20.19.5)(lightningcss@1.30.1)(terser@5.43.1) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 20.19.5 - happy-dom: 18.0.1 - jsdom: 26.1.0 - transitivePeerDependencies: - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.16.1)(happy-dom@18.0.1)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 diff --git a/tsconfig.json b/tsconfig.json index 7814866aa..621862e89 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -35,5 +35,5 @@ "examples/**/*.tsx", "eslint.config.mjs" ], - "exclude": ["node_modules"] + "exclude": ["node_modules", "devtools-reference/**"] } From 4613190a73e6739cf0cf0d9bb781cb026b866ce5 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Sun, 13 Jul 2025 19:12:20 +0100 Subject: [PATCH 09/25] working --- examples/react/todo/package.json | 4 +- examples/react/todo/src/lib/collections.ts | 7 + examples/react/todo/src/main.tsx | 7 - packages/db-devtools/src/devtools.ts | 18 +- packages/db-devtools/src/index.ts | 2 +- packages/db-devtools/src/registry.ts | 46 ++-- packages/db/src/collection.ts | 24 +- .../react-db-devtools/src/ReactDbDevtools.tsx | 10 +- packages/react-db-devtools/src/index.ts | 217 +++++++++++++----- pnpm-lock.yaml | 30 +-- 10 files changed, 245 insertions(+), 120 deletions(-) diff --git a/examples/react/todo/package.json b/examples/react/todo/package.json index d246687eb..ff7bfbe4c 100644 --- a/examples/react/todo/package.json +++ b/examples/react/todo/package.json @@ -3,10 +3,10 @@ "private": true, "version": "0.0.25", "dependencies": { - "@tanstack/db-collections": "^0.0.23", + "@tanstack/db-collections": "workspace:*", "@tanstack/db-devtools": "workspace:*", "@tanstack/query-core": "^5.81.5", - "@tanstack/react-db": "^0.0.20", + "@tanstack/react-db": "workspace:*", "@tanstack/react-db-devtools": "workspace:*", "@tanstack/react-router": "^1.125.6", "@tanstack/react-router-devtools": "^1.127.3", diff --git a/examples/react/todo/src/lib/collections.ts b/examples/react/todo/src/lib/collections.ts index 33ca94e07..503a5c209 100644 --- a/examples/react/todo/src/lib/collections.ts +++ b/examples/react/todo/src/lib/collections.ts @@ -1,4 +1,5 @@ import { createCollection } from "@tanstack/react-db" +import { initializeDbDevtools } from "@tanstack/react-db-devtools" import { electricCollectionOptions, queryCollectionOptions, @@ -10,6 +11,10 @@ import { api } from "./api" // Create a query client for query collections const queryClient = new QueryClient() +// Initialize DB devtools early (idempotent - safe to call multiple times) +console.log('🏗️ Collections.ts: Initializing devtools before creating collections...') +initializeDbDevtools() + // Electric Todo Collection export const electricTodoCollection = createCollection( electricCollectionOptions({ @@ -170,3 +175,5 @@ export const queryConfigCollection = createCollection( }, }) ) + + diff --git a/examples/react/todo/src/main.tsx b/examples/react/todo/src/main.tsx index c3df7fb97..0fbcebd3c 100644 --- a/examples/react/todo/src/main.tsx +++ b/examples/react/todo/src/main.tsx @@ -2,15 +2,8 @@ import React from "react" import { createRoot } from "react-dom/client" import { RouterProvider } from "@tanstack/react-router" import { createRouter } from "./router" -import { initializeDbDevtools } from "@tanstack/react-db-devtools" import "./index.css" -// Initialize DB devtools BEFORE any collections are created -if (typeof window !== 'undefined' && process.env.NODE_ENV === 'development') { - console.log('Main: Initializing devtools early...') - initializeDbDevtools() -} - const router = createRouter() createRoot(document.getElementById(`root`)!).render( diff --git a/packages/db-devtools/src/devtools.ts b/packages/db-devtools/src/devtools.ts index 448e13601..8dcb1c3d1 100644 --- a/packages/db-devtools/src/devtools.ts +++ b/packages/db-devtools/src/devtools.ts @@ -8,7 +8,23 @@ import type { DbDevtoolsRegistry } from "./types" * Collections will automatically register themselves if this registry is present. */ export function initializeDbDevtools(): void { - initializeDevtoolsRegistry() + // SSR safety check + if (typeof window === 'undefined') { + return + } + + // Initialize the registry + const registry = initializeDevtoolsRegistry() + + // Set up global registration function that collections can call + ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { + registry.registerCollection(collection) + } + + // Set up global unregistration function + ;(window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__ = (id: string) => { + registry.unregisterCollection(id) + } } /** diff --git a/packages/db-devtools/src/index.ts b/packages/db-devtools/src/index.ts index 62f7fbae5..867369a45 100644 --- a/packages/db-devtools/src/index.ts +++ b/packages/db-devtools/src/index.ts @@ -20,4 +20,4 @@ export type { TanstackDbDevtoolsConfig } from "./TanstackDbDevtools" // export { DbDevtoolsPanel } from "./DbDevtoolsPanel" // Export the initialization function -export { initializeDbDevtools } from "./registry" +export { initializeDbDevtools } from "./devtools" diff --git a/packages/db-devtools/src/registry.ts b/packages/db-devtools/src/registry.ts index 51e06f6be..3105e828f 100644 --- a/packages/db-devtools/src/registry.ts +++ b/packages/db-devtools/src/registry.ts @@ -16,6 +16,15 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { } registerCollection = (collection: any): void => { + console.log('Registry: Registering collection', { + id: collection.id, + type: this.detectCollectionType(collection), + status: collection.status, + size: collection.size, + hasTransactions: collection.transactions.size > 0, + registrySize: this.collections.size + }) + const metadata: CollectionMetadata = { id: collection.id, type: this.detectCollectionType(collection), @@ -40,6 +49,12 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { } this.collections.set(collection.id, entry) + + console.log('Registry: Collection registered successfully', { + id: collection.id, + totalCollections: this.collections.size, + allCollectionIds: Array.from(this.collections.keys()) + }) // Track performance for live queries if (this.isLiveQuery(collection)) { @@ -76,9 +91,11 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { } getAllCollectionMetadata = (): Array => { + console.log('Registry: getAllCollectionMetadata called, total collections:', this.collections.size) + const results: Array = [] - for (const [_id, entry] of this.collections) { + for (const [id, entry] of this.collections) { const collection = entry.weakRef.deref() if (collection) { // Collection is still alive, update metadata @@ -88,14 +105,22 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { entry.metadata.transactionCount = collection.transactions.size entry.metadata.lastUpdated = new Date() results.push({ ...entry.metadata }) + console.log('Registry: Found live collection:', { + id, + status: collection.status, + size: collection.size, + type: entry.metadata.type + }) } else { // Collection was garbage collected, mark it entry.metadata.status = `cleaned-up` entry.metadata.lastUpdated = new Date() results.push({ ...entry.metadata }) + console.log('Registry: Found GC\'d collection:', id) } } + console.log('Registry: Returning metadata for', results.length, 'collections') return results } @@ -310,23 +335,4 @@ export function initializeDevtoolsRegistry(): DbDevtoolsRegistry { return (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry } -// Initialize devtools and set up automatic collection registration -export function initializeDbDevtools(): void { - // SSR safety check - if (typeof window === 'undefined') { - return - } - - // Initialize the registry - const registry = initializeDevtoolsRegistry() - // Set up global registration function that collections can call - ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { - registry.registerCollection(collection) - } - - // Set up global unregistration function - ;(window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__ = (id: string) => { - registry.unregisterCollection(id) - } -} diff --git a/packages/db/src/collection.ts b/packages/db/src/collection.ts index cb19404fe..2989044de 100644 --- a/packages/db/src/collection.ts +++ b/packages/db/src/collection.ts @@ -24,8 +24,21 @@ export const collectionsStore = new Map>() // Check for devtools registry and register collection if available function registerWithDevtools(collection: CollectionImpl): void { - if (typeof window !== `undefined` && (window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { - (window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__(collection) + if (typeof window !== `undefined`) { + console.log('Collection created, checking for devtools registration:', { + collectionId: collection.id, + registryAvailable: !!(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__, + registryExists: !!(window as any).__TANSTACK_DB_DEVTOOLS__ + }) + + if ((window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { + (window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__(collection) + ;(collection as any).isRegisteredWithDevtools = true + console.log('Collection registered with devtools:', collection.id) + } else { + ;(collection as any).isRegisteredWithDevtools = false + console.warn('Devtools registry not available for collection:', collection.id) + } } } @@ -238,6 +251,7 @@ export class CollectionImpl< private gcTimeoutId: ReturnType | null = null private preloadPromise: Promise | null = null private syncCleanupFn: (() => void) | null = null + private isRegisteredWithDevtools = false /** * Register a callback to be executed on the next commit @@ -548,6 +562,7 @@ export class CollectionImpl< // Unregister from devtools if available if (typeof window !== `undefined` && (window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__) { (window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__(this.id) + this.isRegisteredWithDevtools = false } // Clear data @@ -605,6 +620,11 @@ export class CollectionImpl< this.activeSubscribersCount++ this.cancelGCTimer() + // Re-register with devtools if not already registered (handles timing issues) + if (!this.isRegisteredWithDevtools) { + registerWithDevtools(this) + } + // Start sync if collection was cleaned up if (this._status === `cleaned-up` || this._status === `idle`) { this.startSync() diff --git a/packages/react-db-devtools/src/ReactDbDevtools.tsx b/packages/react-db-devtools/src/ReactDbDevtools.tsx index ef99ed92d..d06a933e1 100644 --- a/packages/react-db-devtools/src/ReactDbDevtools.tsx +++ b/packages/react-db-devtools/src/ReactDbDevtools.tsx @@ -2,6 +2,7 @@ import { useEffect, useRef, useState } from "react" import { TanstackDbDevtools } from "@tanstack/db-devtools" import type { TanstackDbDevtoolsConfig } from "@tanstack/db-devtools" +import { initializeDbDevtools } from "./index" export interface TanStackReactDbDevtoolsProps extends TanstackDbDevtoolsConfig { // Additional React-specific props if needed @@ -29,10 +30,11 @@ export function TanStackReactDbDevtools(props: TanStackReactDbDevtoolsProps = {} // Set flag to prevent multiple initializations initializingRef.current = true - // Note: Devtools registry is now initialized in main.tsx before collections are created - console.log('ReactDbDevtools: Skipping devtools initialization (done in main.tsx)') - - console.log('ReactDbDevtools: Creating TanstackDbDevtools instance') + // Note: Devtools registry is now initialized in collections.ts before collections are created + console.log('ReactDbDevtools: Calling initializeDbDevtools as backup (also called in collections.ts)') + initializeDbDevtools() + + console.log('ReactDbDevtools: Creating TanstackDbDevtools instance') const devtoolsInstance = new TanstackDbDevtools(props) try { diff --git a/packages/react-db-devtools/src/index.ts b/packages/react-db-devtools/src/index.ts index 25b543859..b4404cec6 100644 --- a/packages/react-db-devtools/src/index.ts +++ b/packages/react-db-devtools/src/index.ts @@ -60,74 +60,179 @@ export type { TanStackReactDbDevtoolsProps } from './ReactDbDevtools' export function initializeDbDevtools(): void { // SSR safety check if (typeof window === 'undefined') { - console.log('DbDevtools: SSR environment detected, skipping initialization') return } - console.log('DbDevtools: Initializing devtools...') - - // Initialize the registry directly without importing SolidJS code - if (!(window as any).__TANSTACK_DB_DEVTOOLS__) { - console.log('DbDevtools: Creating registry...') + // Idempotent check - if already initialized, skip + if ((window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { + return + } + + // Create the registry directly without importing SolidJS code to avoid SSR issues + try { + // Import and call the core initialization asynchronously, but ensure registry exists first + const registryPromise = import('@tanstack/db-devtools').then((module) => { + console.log('DbDevtools: Core devtools module loaded') + module.initializeDbDevtools() + console.log('DbDevtools: Core initialization complete') + }).catch((error) => { + console.warn('DbDevtools: Failed to load core devtools module:', error) + }) - const registry = { - collections: new Map(), - registerCollection: () => {}, - unregisterCollection: () => {}, - getCollection: () => undefined, - releaseCollection: () => {}, - getAllCollectionMetadata: () => [], - getCollectionMetadata: () => undefined, - getTransactions: () => [], - getTransaction: () => undefined, - cleanup: () => {}, - isInitialized: true, - } - - // Set up the registry on window - ;(window as any).__TANSTACK_DB_DEVTOOLS__ = registry - - // Set up automatic collection registration - ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { - console.log('DbDevtools: Registering collection:', collection.id) - console.log('DbDevtools: Collection details:', { - id: collection.id, - size: collection.size || 0, - status: collection.status || 'idle', - constructor: collection.constructor.name - }) + // Create immediate registry that works with the SolidJS UI while core loads + if (!(window as any).__TANSTACK_DB_DEVTOOLS__) { + console.log('DbDevtools: Creating immediate registry...') - if (registry && registry.collections) { - registry.collections.set(collection.id, { - collection, - metadata: { + const collections = new Map() + + const registry = { + collections, + registerCollection: (collection: any) => { + console.log('DbDevtools: Registering collection:', collection.id) + + const metadata = { id: collection.id, - size: collection.size || 0, - type: 'unknown', + type: collection.id.startsWith('live-query-') ? 'live-query' : 'collection', status: collection.status || 'idle', - hasTransactions: false, - transactionCount: 0, + size: collection.size || 0, + hasTransactions: collection.transactions?.size > 0 || false, + transactionCount: collection.transactions?.size || 0, + createdAt: new Date(), + lastUpdated: new Date(), + gcTime: collection.config?.gcTime, + timings: collection.id.startsWith('live-query-') ? { + totalIncrementalRuns: 0, + } : undefined, + } + + const entry = { + weakRef: new WeakRef(collection), + metadata, + isActive: false, + } + + collections.set(collection.id, entry) + console.log('DbDevtools: Collection registered successfully:', collection.id) + console.log('DbDevtools: Total collections now:', collections.size) + }, + unregisterCollection: (id: string) => { + collections.delete(id) + }, + getCollectionMetadata: (id: string) => { + const entry = collections.get(id) + if (!entry) return undefined + + // Try to get fresh data from the collection if it's still alive + const collection = entry.weakRef.deref() + if (collection) { + entry.metadata.status = collection.status + entry.metadata.size = collection.size + entry.metadata.hasTransactions = collection.transactions?.size > 0 || false + entry.metadata.transactionCount = collection.transactions?.size || 0 + entry.metadata.lastUpdated = new Date() } - }) - console.log('DbDevtools: Collection registered successfully:', collection.id) - console.log('DbDevtools: Total collections now:', registry.collections.size) - console.log('DbDevtools: Registry collections:', Array.from(registry.collections.keys())) - } else { - console.warn('DbDevtools: Registry or collections not available') + + return { ...entry.metadata } + }, + getAllCollectionMetadata: () => { + console.log('DbDevtools: getAllCollectionMetadata called, total collections:', collections.size) + + const results = [] + for (const [id, entry] of collections) { + const collection = entry.weakRef.deref() + if (collection) { + // Collection is still alive, update metadata + entry.metadata.status = collection.status + entry.metadata.size = collection.size + entry.metadata.hasTransactions = collection.transactions?.size > 0 || false + entry.metadata.transactionCount = collection.transactions?.size || 0 + entry.metadata.lastUpdated = new Date() + results.push({ ...entry.metadata }) + console.log('DbDevtools: Found live collection:', { + id, + status: collection.status, + size: collection.size, + type: entry.metadata.type + }) + } else { + // Collection was garbage collected + entry.metadata.status = 'cleaned-up' + entry.metadata.lastUpdated = new Date() + results.push({ ...entry.metadata }) + console.log('DbDevtools: Found GC\'d collection:', id) + } + } + + console.log('DbDevtools: Returning metadata for', results.length, 'collections') + return results + }, + getCollection: (id: string) => { + const entry = collections.get(id) + if (!entry) return undefined + + const collection = entry.weakRef.deref() + if (collection && !entry.isActive) { + // Create hard reference + entry.hardRef = collection + entry.isActive = true + } + + return collection + }, + releaseCollection: (id: string) => { + const entry = collections.get(id) + if (entry && entry.isActive) { + // Release hard reference + entry.hardRef = undefined + entry.isActive = false + } + }, + getTransactions: () => [], + getTransaction: () => undefined, + cleanup: () => { + for (const [_id, entry] of collections) { + if (entry.isActive) { + entry.hardRef = undefined + entry.isActive = false + } + } + }, + garbageCollect: () => { + for (const [id, entry] of collections) { + const collection = entry.weakRef.deref() + if (!collection) { + collections.delete(id) + } + } + }, } + + // Set up the registry on window + ;(window as any).__TANSTACK_DB_DEVTOOLS__ = registry + console.log('DbDevtools: Registry created successfully') } - - ;(window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__ = (id: string) => { - console.log('DbDevtools: Unregistering collection:', id) - if (registry.collections) { - registry.collections.delete(id) - console.log('DbDevtools: Collection unregistered successfully:', id) + + // Set up automatic collection registration + if (!(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { + ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { + const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ + if (registry) { + registry.registerCollection(collection) + } + } + } + + console.log('DbDevtools: Initialization complete') + } catch (error) { + console.warn('DbDevtools: Failed to initialize devtools:', error) + + // Final fallback: set up a basic registration function so collections don't fail + if (!(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { + console.log('DbDevtools: Setting up fallback registration function...') + ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { + console.log('DbDevtools: Fallback - collection registered:', collection.id) } } - - console.log('DbDevtools: Registry created successfully') - } else { - console.log('DbDevtools: Registry already exists') } console.log('DbDevtools: Initialization complete') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12465e35a..74d32a96d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,7 +99,7 @@ importers: examples/react/todo: dependencies: '@tanstack/db-collections': - specifier: ^0.0.23 + specifier: workspace:* version: link:../../../packages/db-collections '@tanstack/db-devtools': specifier: workspace:* @@ -108,8 +108,8 @@ importers: specifier: ^5.81.5 version: 5.81.5 '@tanstack/react-db': - specifier: ^0.0.20 - version: 0.0.20(react@19.1.0)(typescript@5.8.3) + specifier: workspace:* + version: link:../../../packages/react-db '@tanstack/react-db-devtools': specifier: workspace:* version: link:../../../packages/react-db-devtools @@ -2466,11 +2466,6 @@ packages: resolution: {integrity: sha512-kUqfsU5qO/kiptgkjumdKuu/W4i1iYKPW6pUujEH1I+rzZLGIqD6noq9LDVZRh78ArAiZj+VYrdC5jbrtmsI8A==} engines: {node: '>=18'} - '@tanstack/db@0.0.20': - resolution: {integrity: sha512-bh/VggsuV/N5LmNgQiTFuVOATs+c1DRC3D36vRPNWw79V3O4HHptod8hKQdgEQtAbgjXvXrIFJOnlOpc5VOiEQ==} - peerDependencies: - typescript: '>=4.7' - '@tanstack/directive-functions-plugin@1.124.1': resolution: {integrity: sha512-eZdsPCZz+7VIKiXAF5dNdLJBerAo4t79w/OQTWaKuqPLX1E9GQOKHsmTZChWeQbxPx+y+cOV3/0U/yKxtHsm0Q==} engines: {node: '>=12'} @@ -2496,11 +2491,6 @@ packages: '@tanstack/query-core@5.81.5': resolution: {integrity: sha512-ZJOgCy/z2qpZXWaj/oxvodDx07XcQa9BF92c0oINjHkoqUPsmm3uG08HpTaviviZ/N9eP1f9CM7mKSEkIo7O1Q==} - '@tanstack/react-db@0.0.20': - resolution: {integrity: sha512-+odiHmk+09vhVKweeHUedy5jQcMZH97Bn0dN+TncoE9zq107blayF7Pbi4GPW2S30J8EZa+zP+o5aqbo5WtHeA==} - peerDependencies: - react: '>=16.8.0' - '@tanstack/react-router-devtools@1.127.3': resolution: {integrity: sha512-MS8+ArGAoRpFaVWpXnQxNpq2bU5e2WGwV/3Gskh9YB09gqX3t6knp9im4kJ0kam16+A8Vohq1yOpCliyHzQawA==} engines: {node: '>=12'} @@ -9330,12 +9320,6 @@ snapshots: - typescript - vite - '@tanstack/db@0.0.20(typescript@5.8.3)': - dependencies: - '@electric-sql/d2mini': 0.1.6 - '@standard-schema/spec': 1.0.0 - typescript: 5.8.3 - '@tanstack/directive-functions-plugin@1.124.1(vite@6.3.5(@types/node@22.16.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@babel/code-frame': 7.27.1 @@ -9382,14 +9366,6 @@ snapshots: '@tanstack/query-core@5.81.5': {} - '@tanstack/react-db@0.0.20(react@19.1.0)(typescript@5.8.3)': - dependencies: - '@tanstack/db': 0.0.20(typescript@5.8.3) - react: 19.1.0 - use-sync-external-store: 1.5.0(react@19.1.0) - transitivePeerDependencies: - - typescript - '@tanstack/react-router-devtools@1.127.3(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.125.4)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.7)(tiny-invariant@1.3.3)': dependencies: '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) From 379a91d01bccbe70a47866d88324c8d104425cb9 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Sun, 13 Jul 2025 19:41:04 +0100 Subject: [PATCH 10/25] fix --- examples/react/todo/src/lib/collections.ts | 1 - .../react-db-devtools/src/ReactDbDevtools.tsx | 19 ++----------- packages/react-db-devtools/src/index.ts | 27 +++---------------- 3 files changed, 5 insertions(+), 42 deletions(-) diff --git a/examples/react/todo/src/lib/collections.ts b/examples/react/todo/src/lib/collections.ts index 503a5c209..8f7e886c6 100644 --- a/examples/react/todo/src/lib/collections.ts +++ b/examples/react/todo/src/lib/collections.ts @@ -12,7 +12,6 @@ import { api } from "./api" const queryClient = new QueryClient() // Initialize DB devtools early (idempotent - safe to call multiple times) -console.log('🏗️ Collections.ts: Initializing devtools before creating collections...') initializeDbDevtools() // Electric Todo Collection diff --git a/packages/react-db-devtools/src/ReactDbDevtools.tsx b/packages/react-db-devtools/src/ReactDbDevtools.tsx index d06a933e1..3b0c044e2 100644 --- a/packages/react-db-devtools/src/ReactDbDevtools.tsx +++ b/packages/react-db-devtools/src/ReactDbDevtools.tsx @@ -13,35 +13,22 @@ export function TanStackReactDbDevtools(props: TanStackReactDbDevtoolsProps = {} const [devtools, setDevtools] = useState(null) const initializingRef = useRef(false) - console.log('ReactDbDevtools: Component rendered with props:', props) - // Initialize devtools only on client side useEffect(() => { - console.log('ReactDbDevtools: useEffect triggered') - console.log('ReactDbDevtools: window exists:', typeof window !== 'undefined') - console.log('ReactDbDevtools: ref.current exists:', !!ref.current) - console.log('ReactDbDevtools: already initializing:', initializingRef.current) - if (typeof window === 'undefined' || !ref.current || initializingRef.current) { - console.log('ReactDbDevtools: Early return - no window, ref, or already initializing') return } // Set flag to prevent multiple initializations initializingRef.current = true - // Note: Devtools registry is now initialized in collections.ts before collections are created - console.log('ReactDbDevtools: Calling initializeDbDevtools as backup (also called in collections.ts)') - initializeDbDevtools() - - console.log('ReactDbDevtools: Creating TanstackDbDevtools instance') + // Note: Devtools registry is now initialized in collections.ts before collections are created + initializeDbDevtools() const devtoolsInstance = new TanstackDbDevtools(props) try { - console.log('ReactDbDevtools: Attempting to mount devtools') // Mount the devtools to the DOM element devtoolsInstance.mount(ref.current) - console.log('ReactDbDevtools: Devtools mounted successfully') setDevtools(devtoolsInstance) } catch (error) { console.error('ReactDbDevtools: Failed to mount DB devtools:', error) @@ -49,12 +36,10 @@ export function TanStackReactDbDevtools(props: TanStackReactDbDevtoolsProps = {} } return () => { - console.log('ReactDbDevtools: Cleanup - unmounting devtools') try { // Only unmount if the devtools were successfully mounted if (devtoolsInstance) { devtoolsInstance.unmount() - console.log('ReactDbDevtools: Devtools unmounted successfully') } } catch (error) { // Ignore unmount errors if devtools weren't mounted diff --git a/packages/react-db-devtools/src/index.ts b/packages/react-db-devtools/src/index.ts index b4404cec6..b36bf9787 100644 --- a/packages/react-db-devtools/src/index.ts +++ b/packages/react-db-devtools/src/index.ts @@ -71,25 +71,20 @@ export function initializeDbDevtools(): void { // Create the registry directly without importing SolidJS code to avoid SSR issues try { // Import and call the core initialization asynchronously, but ensure registry exists first - const registryPromise = import('@tanstack/db-devtools').then((module) => { - console.log('DbDevtools: Core devtools module loaded') + import('@tanstack/db-devtools').then((module) => { module.initializeDbDevtools() - console.log('DbDevtools: Core initialization complete') }).catch((error) => { console.warn('DbDevtools: Failed to load core devtools module:', error) }) // Create immediate registry that works with the SolidJS UI while core loads if (!(window as any).__TANSTACK_DB_DEVTOOLS__) { - console.log('DbDevtools: Creating immediate registry...') const collections = new Map() const registry = { collections, registerCollection: (collection: any) => { - console.log('DbDevtools: Registering collection:', collection.id) - const metadata = { id: collection.id, type: collection.id.startsWith('live-query-') ? 'live-query' : 'collection', @@ -112,8 +107,6 @@ export function initializeDbDevtools(): void { } collections.set(collection.id, entry) - console.log('DbDevtools: Collection registered successfully:', collection.id) - console.log('DbDevtools: Total collections now:', collections.size) }, unregisterCollection: (id: string) => { collections.delete(id) @@ -135,10 +128,8 @@ export function initializeDbDevtools(): void { return { ...entry.metadata } }, getAllCollectionMetadata: () => { - console.log('DbDevtools: getAllCollectionMetadata called, total collections:', collections.size) - const results = [] - for (const [id, entry] of collections) { + for (const [, entry] of collections) { const collection = entry.weakRef.deref() if (collection) { // Collection is still alive, update metadata @@ -148,22 +139,14 @@ export function initializeDbDevtools(): void { entry.metadata.transactionCount = collection.transactions?.size || 0 entry.metadata.lastUpdated = new Date() results.push({ ...entry.metadata }) - console.log('DbDevtools: Found live collection:', { - id, - status: collection.status, - size: collection.size, - type: entry.metadata.type - }) } else { // Collection was garbage collected entry.metadata.status = 'cleaned-up' entry.metadata.lastUpdated = new Date() results.push({ ...entry.metadata }) - console.log('DbDevtools: Found GC\'d collection:', id) } } - console.log('DbDevtools: Returning metadata for', results.length, 'collections') return results }, getCollection: (id: string) => { @@ -209,7 +192,6 @@ export function initializeDbDevtools(): void { // Set up the registry on window ;(window as any).__TANSTACK_DB_DEVTOOLS__ = registry - console.log('DbDevtools: Registry created successfully') } // Set up automatic collection registration @@ -221,16 +203,13 @@ export function initializeDbDevtools(): void { } } } - - console.log('DbDevtools: Initialization complete') } catch (error) { console.warn('DbDevtools: Failed to initialize devtools:', error) // Final fallback: set up a basic registration function so collections don't fail if (!(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { - console.log('DbDevtools: Setting up fallback registration function...') ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { - console.log('DbDevtools: Fallback - collection registered:', collection.id) + // Silent fallback registration } } } From 98626e76e1f1cc14f0450ea39619f1daf57e021a Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Sun, 13 Jul 2025 19:53:43 +0100 Subject: [PATCH 11/25] wip --- .../src/BaseTanStackDbDevtoolsPanel.tsx | 3 +- packages/db-devtools/src/DbDevtools.tsx | 3 +- packages/db-devtools/src/DbDevtoolsPanel.tsx | 73 ++++++++++++------- packages/db-devtools/src/Devtools.tsx | 73 ++++++++++++------- packages/db-devtools/src/constants.ts | 1 + packages/db-devtools/src/registry.ts | 4 +- 6 files changed, 103 insertions(+), 54 deletions(-) diff --git a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx index e647e31ea..dfe3fcfb8 100644 --- a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx +++ b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx @@ -4,6 +4,7 @@ import { useDevtoolsOnClose } from './contexts' import { useStyles } from './useStyles' import { useLocalStorage } from './useLocalStorage' import { multiSortBy } from './utils' +import { POLLING_INTERVAL_MS } from './constants' import type { Accessor, JSX } from 'solid-js' import type { DbDevtoolsRegistry, CollectionMetadata } from './types' @@ -117,7 +118,7 @@ export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel( } updateCollections() - const intervalId = setInterval(updateCollections, 1000) + const intervalId = setInterval(updateCollections, POLLING_INTERVAL_MS) return () => clearInterval(intervalId) }) diff --git a/packages/db-devtools/src/DbDevtools.tsx b/packages/db-devtools/src/DbDevtools.tsx index 02a491074..6e2e2cf7b 100644 --- a/packages/db-devtools/src/DbDevtools.tsx +++ b/packages/db-devtools/src/DbDevtools.tsx @@ -2,6 +2,7 @@ import { createEffect, createSignal, onCleanup } from "solid-js" import { DbDevtoolsPanel } from "./DbDevtoolsPanel" import { initializeDevtoolsRegistry } from "./registry" +import { POLLING_INTERVAL_MS } from "./constants" import type { CollectionMetadata, DbDevtoolsConfig } from "./types" import type { DbDevtoolsRegistry } from './types' @@ -33,7 +34,7 @@ function DbDevtools(props: DbDevtoolsProps = {}) { updateCollections() // Set up polling - intervalId = window.setInterval(updateCollections, 1000) + intervalId = window.setInterval(updateCollections, POLLING_INTERVAL_MS) onCleanup(() => { if (intervalId) { diff --git a/packages/db-devtools/src/DbDevtoolsPanel.tsx b/packages/db-devtools/src/DbDevtoolsPanel.tsx index 0ca785f29..76ca33c0f 100644 --- a/packages/db-devtools/src/DbDevtoolsPanel.tsx +++ b/packages/db-devtools/src/DbDevtoolsPanel.tsx @@ -26,14 +26,31 @@ export function DbDevtoolsPanel(props: DbDevtoolsPanelProps) { string | null >(null) - const liveQueries = createMemo(() => - props.collections.filter((c) => c.type === `live-query`) + // Create stable collection IDs that only change when collections are added/removed + const collectionIds = createMemo(() => { + const currentIds = new Set(props.collections.map(c => c.id)) + return Array.from(currentIds) + }) + + const liveQueryIds = createMemo(() => + collectionIds().filter(id => { + const collection = props.collections.find(c => c.id === id) + return collection?.type === `live-query` + }) ) - const regularCollections = createMemo(() => - props.collections.filter((c) => c.type === `collection`) + const regularCollectionIds = createMemo(() => + collectionIds().filter(id => { + const collection = props.collections.find(c => c.id === id) + return collection?.type === `collection` + }) ) + // Helper to get latest metadata for a collection ID + const getCollectionMetadata = (id: string) => { + return props.collections.find(c => c.id === id) + } + const allTransactions = createMemo(() => props.registry.getTransactions()) const handleCollectionSelect = (id: string) => { @@ -187,7 +204,7 @@ export function DbDevtoolsPanel(props: DbDevtoolsPanelProps) {
{/* Live Queries Section */} - 0}> + 0}>

- Live Queries ({liveQueries().length}) + Live Queries ({liveQueryIds().length})

- - {(collection) => ( - handleCollectionSelect(collection.id)} - /> - )} + + {(collectionId) => { + const collection = getCollectionMetadata(collectionId) + return collection ? ( + handleCollectionSelect(collectionId)} + /> + ) : null + }}
{/* Regular Collections Section */} - 0}> + 0}>

- Collections ({regularCollections().length}) + Collections ({regularCollectionIds().length})

- - {(collection) => ( - handleCollectionSelect(collection.id)} - /> - )} + + {(collectionId) => { + const collection = getCollectionMetadata(collectionId) + return collection ? ( + handleCollectionSelect(collectionId)} + /> + ) : null + }}
- +
= (props) => { const [selectedView, setSelectedView] = createSignal<'collections' | 'transactions'>('collections') - const liveQueries = createMemo(() => - props.collections.filter(c => c.type === 'live-query') + // Create stable collection IDs that only change when collections are added/removed + const collectionIds = createMemo(() => { + const currentIds = new Set(props.collections.map(c => c.id)) + return Array.from(currentIds) + }) + + const liveQueryIds = createMemo(() => + collectionIds().filter(id => { + const collection = props.collections.find(c => c.id === id) + return collection?.type === 'live-query' + }) ) - const regularCollections = createMemo(() => - props.collections.filter(c => c.type === 'collection') + const regularCollectionIds = createMemo(() => + collectionIds().filter(id => { + const collection = props.collections.find(c => c.id === id) + return collection?.type === 'collection' + }) ) + // Helper to get latest metadata for a collection ID + const getCollectionMetadata = (id: string) => { + return props.collections.find(c => c.id === id) + } + const allTransactions = createMemo(() => props.registry.getTransactions() ) @@ -502,37 +519,43 @@ const ContentView: Component = (props) => { {/* Content based on selected view */}
- 0}> + 0}>
-

Live Queries ({liveQueries().length})

+

Live Queries ({liveQueryIds().length})

- - {(collection) => ( - handleCollectionSelect(collection.id)} - /> - )} + + {(collectionId) => { + const collection = getCollectionMetadata(collectionId) + return collection ? ( + handleCollectionSelect(collectionId)} + /> + ) : null + }}
- 0}> + 0}>
-

Collections ({regularCollections().length})

+

Collections ({regularCollectionIds().length})

- - {(collection) => ( - handleCollectionSelect(collection.id)} - /> - )} + + {(collectionId) => { + const collection = getCollectionMetadata(collectionId) + return collection ? ( + handleCollectionSelect(collectionId)} + /> + ) : null + }}
- +
No collections found. Create a collection to see it here.
diff --git a/packages/db-devtools/src/constants.ts b/packages/db-devtools/src/constants.ts index 31955418b..974f905e6 100644 --- a/packages/db-devtools/src/constants.ts +++ b/packages/db-devtools/src/constants.ts @@ -6,6 +6,7 @@ export const INITIAL_IS_OPEN = false export const DEFAULT_SORT_ORDER = 1 export const DEFAULT_SORT_FN_NAME = 'Status > Last Updated' export const DEFAULT_MUTATION_SORT_FN_NAME = 'Status > Last Updated' +export const POLLING_INTERVAL_MS = 1000 // Poll every second for metadata updates export const firstBreakpoint = 1024 export const secondBreakpoint = 796 diff --git a/packages/db-devtools/src/registry.ts b/packages/db-devtools/src/registry.ts index 3105e828f..5acb132f8 100644 --- a/packages/db-devtools/src/registry.ts +++ b/packages/db-devtools/src/registry.ts @@ -4,11 +4,11 @@ import type { DbDevtoolsRegistry, TransactionDetails, } from "./types" +import { POLLING_INTERVAL_MS } from "./constants" class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { public collections = new Map() private pollingInterval: number | null = null - private readonly POLLING_INTERVAL_MS = 1000 // Poll every second for metadata updates constructor() { // Start polling for metadata updates @@ -259,7 +259,7 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { entry.metadata.lastUpdated = new Date() } } - }, this.POLLING_INTERVAL_MS) + }, POLLING_INTERVAL_MS) } private detectCollectionType = ( From d93a353e87fe19cdc1a5bc2c16a7387328143b5e Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Tue, 15 Jul 2025 12:48:34 +0100 Subject: [PATCH 12/25] fixed stuff --- examples/react/todo/src/App.tsx | 1 - .../src/BaseTanStackDbDevtoolsPanel.tsx | 193 +++- packages/db-devtools/src/DbDevtools.tsx | 112 -- packages/db-devtools/src/DbDevtoolsPanel.tsx | 526 --------- packages/db-devtools/src/Devtools.tsx | 1008 ----------------- .../src/FloatingTanStackDbDevtools.tsx | 4 +- .../src/components/CollectionDetails.tsx | 317 ------ .../src/components/TransactionList.tsx | 142 --- packages/db-devtools/src/contexts/index.tsx | 161 +-- packages/db-devtools/src/devtools.ts | 8 + packages/db-devtools/src/icons/index.tsx | 372 ------ packages/db-devtools/src/index.ts | 19 +- packages/db-devtools/src/registry.ts | 25 - packages/db-devtools/src/theme.ts | 299 ----- packages/db-devtools/src/useLocalStorage.ts | 2 +- packages/db-devtools/src/useStyles.tsx | 40 +- packages/db-devtools/src/utils.tsx | 12 +- packages/db/src/collection.ts | 8 - .../react-db-devtools/src/ReactDbDevtools.tsx | 96 +- packages/react-db-devtools/src/index.ts | 184 +-- 20 files changed, 218 insertions(+), 3311 deletions(-) delete mode 100644 packages/db-devtools/src/DbDevtools.tsx delete mode 100644 packages/db-devtools/src/DbDevtoolsPanel.tsx delete mode 100644 packages/db-devtools/src/Devtools.tsx delete mode 100644 packages/db-devtools/src/components/CollectionDetails.tsx delete mode 100644 packages/db-devtools/src/components/TransactionList.tsx delete mode 100644 packages/db-devtools/src/icons/index.tsx delete mode 100644 packages/db-devtools/src/theme.ts diff --git a/examples/react/todo/src/App.tsx b/examples/react/todo/src/App.tsx index ca07692bb..8f63fb702 100644 --- a/examples/react/todo/src/App.tsx +++ b/examples/react/todo/src/App.tsx @@ -4,7 +4,6 @@ import { electricCollectionOptions, queryCollectionOptions, } from "@tanstack/db-collections" -import { TanStackReactDbDevtools } from "@tanstack/react-db-devtools" import { QueryClient } from "@tanstack/query-core" import { selectConfigSchema, selectTodoSchema } from "./db/validation" import type { Collection } from "@tanstack/react-db" diff --git a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx index dfe3fcfb8..c2e48dafe 100644 --- a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx +++ b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx @@ -1,5 +1,5 @@ import { clsx as cx } from 'clsx' -import { Show, createMemo, createSignal, onMount } from 'solid-js' +import { Show, createMemo, createSignal, onMount, For } from 'solid-js' import { useDevtoolsOnClose } from './contexts' import { useStyles } from './useStyles' import { useLocalStorage } from './useLocalStorage' @@ -56,7 +56,7 @@ function CollectionItem({ onSelect, }: { collection: CollectionMetadata - isActive: boolean + isActive: Accessor onSelect: (collection: CollectionMetadata) => void }) { const styles = useStyles() @@ -65,7 +65,7 @@ function CollectionItem({
onSelect(collection)} > @@ -102,27 +102,68 @@ export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel( '', ) + const [selectedView, setSelectedView] = createSignal<'collections' | 'transactions'>('collections') + const [selectedTransaction, setSelectedTransaction] = createSignal(null) + const [collections, setCollections] = createSignal([]) // Poll for collections data onMount(() => { const updateCollections = () => { if (typeof window === 'undefined') return - try { - const metadata = registry().getAllCollectionMetadata() - setCollections(metadata) + const collections = registry().getAllCollectionMetadata() + setCollections(collections) } catch (error) { - console.warn('Error fetching collections metadata:', error) + // Silently handle errors when fetching collections metadata } } - updateCollections() const intervalId = setInterval(updateCollections, POLLING_INTERVAL_MS) - return () => clearInterval(intervalId) }) + // Helper function to detect if collections data actually changed + const hasCollectionsChanged = (oldCollections: CollectionMetadata[], newCollections: CollectionMetadata[]): boolean => { + if (oldCollections.length !== newCollections.length) return true + + // Create maps for O(1) lookup by ID + const oldMap = new Map(oldCollections.map(c => [c.id, c])) + const newMap = new Map(newCollections.map(c => [c.id, c])) + + // Check if any collection data changed by comparing by ID + for (const [id, old] of oldMap) { + const new_ = newMap.get(id) + if (!new_) return true // Collection was removed + + if (old.status !== new_.status) return true + if (old.size !== new_.size) return true + if (old.hasTransactions !== new_.hasTransactions) return true + if (old.transactionCount !== new_.transactionCount) return true + } + + // Check if any new collections were added + for (const [id] of newMap) { + if (!oldMap.has(id)) return true + } + + return false + } + + // --- Fix: Ensure selection is always valid and highlight updates instantly --- + // If the selected collection disappears, auto-select the first available one + createMemo(() => { + const ids = collections().map(c => c.id) + if (ids.length === 0) { + setActiveCollectionId('') // always a string + return + } + if (!ids.includes(activeCollectionId())) { + setActiveCollectionId(ids[0] ?? '') + } + }) + // --- End fix --- + const activeCollection = createMemo(() => { const active = collections().find(c => c.id === activeCollectionId()) return active || collections()[0] @@ -138,24 +179,7 @@ export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel( ) }) - const collectionDetails = createMemo(() => { - const active = activeCollection() - if (!active) return null - - try { - const collection = registry().getCollection(active.id) - const metadata = registry().getCollectionMetadata(active.id) - - return { - collection, - metadata, - transactions: registry().getTransactions(active.id), - } - } catch (error) { - console.warn('Error getting collection details:', error) - return null - } - }) + return (
-
-
-
Collections ({collections().length})
-
- -
- 0} - fallback={ -
- No collections found -
- } - > - {sortedCollections().map((collection) => ( - setActiveCollectionId(c.id)} - /> - ))} -
-
+ {/* Tab Navigation */} +
+ + +
+ + {/* Content based on selected view */} +
+ +
+
+
Collections ({collections().length})
+
+ +
+ 0} + fallback={ +
+ No collections found +
+ } + > + {(collection) => + collection.id === activeCollectionId()} + onSelect={(c) => setActiveCollectionId(c.id)} + /> + } +
+
+
+
+ + +
+
+
Transactions ({registry().getTransactions().length})
+
+ +
+ 0} + fallback={ +
+ No transactions found +
+ } + > + {registry().getTransactions().map((transaction) => ( +
setSelectedTransaction(transaction.id)} + > +
+ Transaction {transaction.id.slice(0, 8)}... +
+
+ {transaction.mutations.length} mutations +
+
+ {transaction.state} +
+
+ ))} +
+
+
+
diff --git a/packages/db-devtools/src/DbDevtools.tsx b/packages/db-devtools/src/DbDevtools.tsx deleted file mode 100644 index 6e2e2cf7b..000000000 --- a/packages/db-devtools/src/DbDevtools.tsx +++ /dev/null @@ -1,112 +0,0 @@ -/** @jsxImportSource solid-js */ -import { createEffect, createSignal, onCleanup } from "solid-js" -import { DbDevtoolsPanel } from "./DbDevtoolsPanel" -import { initializeDevtoolsRegistry } from "./registry" -import { POLLING_INTERVAL_MS } from "./constants" -import type { CollectionMetadata, DbDevtoolsConfig } from "./types" - -import type { DbDevtoolsRegistry } from './types' - -interface DbDevtoolsProps extends DbDevtoolsConfig { - // Additional component props - registry?: DbDevtoolsRegistry - shadowDOMTarget?: ShadowRoot -} - -function DbDevtools(props: DbDevtoolsProps = {}) { - const [isOpen, setIsOpen] = createSignal(props.initialIsOpen ?? false) - const [collections, setCollections] = createSignal>( - [] - ) - - const registry = props.registry || initializeDevtoolsRegistry() - - let intervalId: number | undefined - - // Update collections metadata periodically - createEffect(() => { - const updateCollections = () => { - const metadata = registry.getAllCollectionMetadata() - setCollections(metadata) - } - - // Initial load - updateCollections() - - // Set up polling - intervalId = window.setInterval(updateCollections, POLLING_INTERVAL_MS) - - onCleanup(() => { - if (intervalId) { - clearInterval(intervalId) - } - }) - }) - - const toggleOpen = () => { - const newState = !isOpen() - setIsOpen(newState) - props.onPanelStateChange?.(newState) - } - - // Handle controlled state - createEffect(() => { - if (props.panelState) { - setIsOpen(props.panelState === `open`) - } - }) - - const position = props.position ?? `bottom-right` - - return ( -
- {/* Toggle Button */} -
- -
- - {/* Panel */} - {isOpen() && ( - setIsOpen(false)} - collections={collections()} - registry={registry} - {...props.panelProps} - /> - )} -
- ) -} - -export default DbDevtools diff --git a/packages/db-devtools/src/DbDevtoolsPanel.tsx b/packages/db-devtools/src/DbDevtoolsPanel.tsx deleted file mode 100644 index 76ca33c0f..000000000 --- a/packages/db-devtools/src/DbDevtoolsPanel.tsx +++ /dev/null @@ -1,526 +0,0 @@ -/** @jsxImportSource solid-js */ -import { For, Show, createMemo, createSignal } from "solid-js" -import { CollectionDetails } from "./components/CollectionDetails" -import { TransactionList } from "./components/TransactionList" -import type { - CollectionMetadata, - DbDevtoolsRegistry, - TransactionDetails, -} from "./types" - -interface DbDevtoolsPanelProps { - onClose: () => void - collections: Array - registry: DbDevtoolsRegistry - [key: string]: any -} - -export function DbDevtoolsPanel(props: DbDevtoolsPanelProps) { - const [selectedView, setSelectedView] = createSignal< - `collections` | `transactions` - >(`collections`) - const [selectedCollection, setSelectedCollection] = createSignal< - string | null - >(null) - const [selectedTransaction, setSelectedTransaction] = createSignal< - string | null - >(null) - - // Create stable collection IDs that only change when collections are added/removed - const collectionIds = createMemo(() => { - const currentIds = new Set(props.collections.map(c => c.id)) - return Array.from(currentIds) - }) - - const liveQueryIds = createMemo(() => - collectionIds().filter(id => { - const collection = props.collections.find(c => c.id === id) - return collection?.type === `live-query` - }) - ) - - const regularCollectionIds = createMemo(() => - collectionIds().filter(id => { - const collection = props.collections.find(c => c.id === id) - return collection?.type === `collection` - }) - ) - - // Helper to get latest metadata for a collection ID - const getCollectionMetadata = (id: string) => { - return props.collections.find(c => c.id === id) - } - - const allTransactions = createMemo(() => props.registry.getTransactions()) - - const handleCollectionSelect = (id: string) => { - setSelectedCollection(id) - setSelectedTransaction(null) - } - - const handleTransactionSelect = (id: string) => { - setSelectedTransaction(id) - setSelectedCollection(null) - } - - const panelStyle = { - position: `fixed` as const, - top: `0`, - left: `0`, - width: `100vw`, - height: `100vh`, - "z-index": 9999999, - "background-color": `rgba(0, 0, 0, 0.5)`, - display: `flex`, - "align-items": `center`, - "justify-content": `center`, - "font-family": `system-ui, -apple-system, sans-serif`, - } - - const contentStyle = { - "background-color": `#1a1a1a`, - color: `#e1e1e1`, - width: `90vw`, - height: `90vh`, - "border-radius": `12px`, - "box-shadow": `0 20px 40px rgba(0, 0, 0, 0.3)`, - display: `flex`, - "flex-direction": `column` as const, - overflow: `hidden`, - } - - const headerStyle = { - display: `flex`, - "align-items": `center`, - "justify-content": `space-between`, - padding: `16px 20px`, - "border-bottom": `1px solid #333`, - "background-color": `#222`, - } - - const bodyStyle = { - display: `flex`, - flex: `1`, - overflow: `hidden`, - } - - const sidebarStyle = { - width: `300px`, - "border-right": `1px solid #333`, - "background-color": `#1e1e1e`, - display: `flex`, - "flex-direction": `column` as const, - } - - const mainStyle = { - flex: `1`, - display: `flex`, - "flex-direction": `column` as const, - overflow: `hidden`, - } - - return ( -
e.target === e.currentTarget && props.onClose()} - > -
e.stopPropagation()}> - {/* Header */} -
-
- 🗄️ -

- TanStack DB Devtools -

-
- -
- -
- {/* Sidebar */} -
- {/* Tab Navigation */} -
- - -
- - {/* Content based on selected view */} -
- - {/* Live Queries Section */} - 0}> -
-

- Live Queries ({liveQueryIds().length}) -

-
- - {(collectionId) => { - const collection = getCollectionMetadata(collectionId) - return collection ? ( - handleCollectionSelect(collectionId)} - /> - ) : null - }} - -
- - {/* Regular Collections Section */} - 0}> -
-

- Collections ({regularCollectionIds().length}) -

-
- - {(collectionId) => { - const collection = getCollectionMetadata(collectionId) - return collection ? ( - handleCollectionSelect(collectionId)} - /> - ) : null - }} - -
- - -
- No collections found. Create a collection to see it here. -
-
-
- - - - -
-
- - {/* Main Content */} -
- - {selectedView() === `collections` - ? `Select a collection to view details` - : `Select a transaction to view details`} -
- } - > - - - } - > - - -
-
-
-
- ) -} - -// Collection Item Component -function CollectionItem(props: { - collection: CollectionMetadata - isSelected: boolean - onClick: () => void -}) { - const statusColor = () => { - switch (props.collection.status) { - case `ready`: - return `#22c55e` - case `loading`: - return `#eab308` - case `error`: - return `#ef4444` - case `cleaned-up`: - return `#6b7280` - default: - return `#6b7280` - } - } - - const statusIcon = () => { - switch (props.collection.status) { - case `ready`: - return `✓` - case `loading`: - return `⟳` - case `error`: - return `⚠` - case `cleaned-up`: - return `🗑` - default: - return `○` - } - } - - return ( -
-
-
- {props.collection.type === `live-query` ? `🔄` : `📄`} - {` `} - {props.collection.id} -
-
- {statusIcon()} -
-
-
- {props.collection.size} items - - {props.collection.transactionCount} tx - -
- -
- {props.collection.timings!.totalIncrementalRuns} runs - - , avg {props.collection.timings!.averageIncrementalRunTime}ms - -
-
-
- ) -} - -// Transaction Details Component -function TransactionDetails(props: { - transactionId: string - registry: DbDevtoolsRegistry -}) { - const transaction = () => props.registry.getTransaction(props.transactionId) - - return ( -
- Transaction not found
}> - {(tx) => ( -
-

- Transaction {tx().id} -

-
-
- Collection: {tx().collectionId} -
-
- State: {tx().state} -
-
- Created: {tx().createdAt.toLocaleString()} -
-
- Updated: {tx().updatedAt.toLocaleString()} -
-
- Persisted: {tx().isPersisted ? `Yes` : `No`} -
-
-

Mutations ({tx().mutations.length})

- - {(mutation) => ( -
-
- Type: {mutation.type} -
-
- Key: {String(mutation.key)} -
-
- Optimistic: - {` `} - {mutation.optimistic ? `Yes` : `No`} -
- -
- Changes -
-                        {JSON.stringify(mutation.changes, null, 2)}
-                      
-
-
-
- )} -
-
- )} -
-
- ) -} diff --git a/packages/db-devtools/src/Devtools.tsx b/packages/db-devtools/src/Devtools.tsx deleted file mode 100644 index 2a086b3fc..000000000 --- a/packages/db-devtools/src/Devtools.tsx +++ /dev/null @@ -1,1008 +0,0 @@ -/** @jsxImportSource solid-js */ -import { - For, - Show, - createEffect, - createMemo, - createSignal, - onCleanup, - onMount, -} from 'solid-js' -import * as goober from 'goober' -import { clsx as cx } from 'clsx' -import { TransitionGroup } from 'solid-transition-group' -import { createResizeObserver } from '@solid-primitives/resize-observer' -import { Portal } from 'solid-js/web' -import { tokens } from './theme' -import { - convertRemToPixels, - getCollectionStatusColor, - getTransactionStatusColor, -} from './utils' -import { - CheckCircle, - LoadingCircle, - PauseCircle, - TanstackLogo, - Trash, - XCircle, -} from './icons' -import { useDbDevtoolsContext, useTheme, usePiPWindow } from './contexts' -import { - BUTTON_POSITION, - DEFAULT_HEIGHT, - DEFAULT_WIDTH, - POSITION, - INITIAL_IS_OPEN, - secondBreakpoint, - thirdBreakpoint, -} from './constants' -import type { CollectionMetadata, DbDevtoolsRegistry, TransactionDetails } from './types' -import type { DevtoolsPosition } from './constants' -import type { StorageObject, StorageSetter } from '@solid-primitives/storage' -import type { Component, JSX } from 'solid-js' - -interface DevtoolsPanelProps { - localStore: StorageObject - setLocalStore: StorageSetter - collections: CollectionMetadata[] - registry: DbDevtoolsRegistry -} - -interface ContentViewProps { - localStore: StorageObject - setLocalStore: StorageSetter - collections: CollectionMetadata[] - registry: DbDevtoolsRegistry - showPanelViewOnly?: boolean - onClose?: () => unknown -} - -const [selectedCollectionId, setSelectedCollectionId] = createSignal(null) -const [selectedTransactionId, setSelectedTransactionId] = createSignal(null) -const [panelWidth, setPanelWidth] = createSignal(0) -const [_offline, _setOffline] = createSignal(false) - -export type DevtoolsComponentType = Component<{ - collections: CollectionMetadata[] - registry: DbDevtoolsRegistry - onClose?: () => void -}> & { - shadowDOMTarget?: ShadowRoot -} - -export const Devtools: Component = (props) => { - const theme = useTheme() - const css = useDbDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const pip = usePiPWindow() - - const buttonPosition = createMemo(() => { - return useDbDevtoolsContext().buttonPosition || BUTTON_POSITION - }) - - const isOpen = createMemo(() => { - return props.localStore.open === 'true' - ? true - : props.localStore.open === 'false' - ? false - : useDbDevtoolsContext().initialIsOpen || INITIAL_IS_OPEN - }) - - const position = createMemo(() => { - return ( - props.localStore.position || - useDbDevtoolsContext().position || - POSITION - ) - }) - - let transitionsContainerRef!: HTMLDivElement - createEffect(() => { - const root = transitionsContainerRef.parentElement as HTMLElement - const height = props.localStore.height || DEFAULT_HEIGHT - const width = props.localStore.width || DEFAULT_WIDTH - const panelPosition = position() - root.style.setProperty( - '--tsdb-panel-height', - `${panelPosition === 'top' ? '-' : ''}${height}px`, - ) - root.style.setProperty( - '--tsdb-panel-width', - `${panelPosition === 'left' ? '-' : ''}${width}px`, - ) - }) - - // Calculates the inherited font size of the parent and sets it as a CSS variable - onMount(() => { - const onFocus = () => { - const root = transitionsContainerRef.parentElement as HTMLElement - const fontSize = getComputedStyle(root).fontSize - root.style.setProperty('--tsdb-font-size', fontSize) - } - onFocus() - window.addEventListener('focus', onFocus) - onCleanup(() => { - window.removeEventListener('focus', onFocus) - }) - }) - - const pip_open = createMemo( - () => (props.localStore.pip_open ?? 'false') as 'true' | 'false', - ) - - return ( - <> - - - - - - - -
- - - - - - - -
- - -
-
-
-
- - ) -} - -const PiPPanel: Component<{ - children: JSX.Element -}> = (props) => { - const pip = usePiPWindow() - const theme = useTheme() - const css = useDbDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const getPanelDynamicStyles = () => { - const { colors } = tokens - const t = (light: string, dark: string) => - theme() === 'dark' ? dark : light - if (panelWidth() < secondBreakpoint) { - return css` - flex-direction: column; - background-color: ${t(colors.gray[300], colors.gray[600])}; - ` - } - return css` - flex-direction: row; - background-color: ${t(colors.gray[200], colors.darkGray[900])}; - ` - } - - createEffect(() => { - const win = pip.pipWindow() - const resizeCB = () => { - if (!win) return - setPanelWidth(win.innerWidth) - } - if (win) { - win.addEventListener('resize', resizeCB) - resizeCB() - } - - onCleanup(() => { - if (win) { - win.removeEventListener('resize', resizeCB) - } - }) - }) - - return ( -
- {props.children} -
- ) -} - -const DraggablePanel: Component = (props) => { - const theme = useTheme() - const css = useDbDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const [isResizing, setIsResizing] = createSignal(false) - - const position = createMemo( - () => - (props.localStore.position || - useDbDevtoolsContext().position || - POSITION) as DevtoolsPosition, - ) - - const handleDragStart = (event: MouseEvent) => { - const panelElement = event.currentTarget as HTMLDivElement - if (!panelElement.parentElement) return - setIsResizing(true) - const { height, width } = panelElement.parentElement.getBoundingClientRect() - const startX = event.clientX - const startY = event.clientY - let newSize = 0 - const minHeight = convertRemToPixels(3.5) - const minWidth = convertRemToPixels(12) - const runDrag = (moveEvent: MouseEvent) => { - moveEvent.preventDefault() - - if (position() === 'left' || position() === 'right') { - const valToAdd = - position() === 'right' - ? startX - moveEvent.clientX - : moveEvent.clientX - startX - newSize = Math.round(width + valToAdd) - if (newSize < minWidth) { - newSize = minWidth - } - props.setLocalStore('width', String(Math.round(newSize))) - } else { - const valToAdd = - position() === 'bottom' - ? startY - moveEvent.clientY - : moveEvent.clientY - startY - newSize = Math.round(height + valToAdd) - if (newSize < minHeight) { - newSize = minHeight - setSelectedCollectionId(null) - } - props.setLocalStore('height', String(Math.round(newSize))) - } - } - - const unsubscribe = () => { - if (isResizing()) { - setIsResizing(false) - } - document.removeEventListener('mousemove', runDrag, false) - document.removeEventListener('mouseup', unsubscribe, false) - } - - document.addEventListener('mousemove', runDrag, false) - document.addEventListener('mouseup', unsubscribe, false) - } - - let panelRef!: HTMLDivElement - - onMount(() => { - createResizeObserver(panelRef, ({ width }, el) => { - if (el === panelRef) { - setPanelWidth(width) - } - }) - }) - - const getPanelDynamicStyles = () => { - const { colors } = tokens - const t = (light: string, dark: string) => - theme() === 'dark' ? dark : light - if (panelWidth() < secondBreakpoint) { - return css` - flex-direction: column; - background-color: ${t(colors.gray[300], colors.gray[600])}; - ` - } - return css` - flex-direction: row; - background-color: ${t(colors.gray[200], colors.darkGray[900])}; - ` - } - - return ( -
- -
-
- ) -} - -const ContentView: Component = (props) => { - const theme = useTheme() - const css = useDbDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const [selectedView, setSelectedView] = createSignal<'collections' | 'transactions'>('collections') - - // Create stable collection IDs that only change when collections are added/removed - const collectionIds = createMemo(() => { - const currentIds = new Set(props.collections.map(c => c.id)) - return Array.from(currentIds) - }) - - const liveQueryIds = createMemo(() => - collectionIds().filter(id => { - const collection = props.collections.find(c => c.id === id) - return collection?.type === 'live-query' - }) - ) - - const regularCollectionIds = createMemo(() => - collectionIds().filter(id => { - const collection = props.collections.find(c => c.id === id) - return collection?.type === 'collection' - }) - ) - - // Helper to get latest metadata for a collection ID - const getCollectionMetadata = (id: string) => { - return props.collections.find(c => c.id === id) - } - - const allTransactions = createMemo(() => - props.registry.getTransactions() - ) - - const handleCollectionSelect = (id: string) => { - setSelectedCollectionId(id) - setSelectedTransactionId(null) - } - - const handleTransactionSelect = (id: string) => { - setSelectedTransactionId(id) - setSelectedCollectionId(null) - } - - return ( -
- {/* Header */} -
-
- -

TanStack DB Devtools

-
-
- - - -
-
- -
- {/* Sidebar */} -
- {/* Tab Navigation */} -
- - -
- - {/* Content based on selected view */} -
- - 0}> -
-

Live Queries ({liveQueryIds().length})

-
- - {(collectionId) => { - const collection = getCollectionMetadata(collectionId) - return collection ? ( - handleCollectionSelect(collectionId)} - /> - ) : null - }} - -
- - 0}> -
-

Collections ({regularCollectionIds().length})

-
- - {(collectionId) => { - const collection = getCollectionMetadata(collectionId) - return collection ? ( - handleCollectionSelect(collectionId)} - /> - ) : null - }} - -
- - -
- No collections found. Create a collection to see it here. -
-
-
- - - - {(transaction) => ( - handleTransactionSelect(transaction.id)} - /> - )} - - -
-
- - {/* Main Content */} -
- - {selectedView() === 'collections' - ? 'Select a collection to view details' - : 'Select a transaction to view details' - } -
- } - > - - - } - > - - -
-
-
- ) -} - -// Collection Item Component -const CollectionItem = (props: { - collection: CollectionMetadata - isSelected: boolean - onClick: () => void -}) => { - const theme = useTheme() - const css = useDbDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const statusColor = () => getCollectionStatusColor(props.collection.status) - - const statusIcon = () => { - switch (props.collection.status) { - case 'ready': return - case 'loading': return - case 'error': return - case 'cleaned-up': return - default: return - } - } - - return ( -
-
-
- {props.collection.type === 'live-query' ? '🔄' : '📄'} {props.collection.id} -
-
- {statusIcon()} -
-
-
- {props.collection.size} items - - {props.collection.transactionCount} tx - -
- -
- {props.collection.timings!.totalIncrementalRuns} runs - - , avg {props.collection.timings!.averageIncrementalRunTime}ms - -
-
-
- ) -} - -// Transaction Item Component -const TransactionItem = (props: { - transaction: TransactionDetails - isSelected: boolean - onClick: () => void -}) => { - const theme = useTheme() - const css = useDbDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useDbDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const statusColor = () => getTransactionStatusColor(props.transaction.state) - - const statusIcon = () => { - switch (props.transaction.state) { - case 'pending': return - case 'success': return - case 'error': return - default: return - } - } - - return ( -
-
-
- Transaction {props.transaction.id} -
-
- {statusIcon()} -
-
-
- {props.transaction.collectionId} - {props.transaction.mutations.length} mutations -
-
- ) -} - -// Placeholder components - these will be replaced with actual implementations -const CollectionDetails = (props: { collectionId: string, registry: DbDevtoolsRegistry }) => { - return
Collection Details: {props.collectionId}
-} - -const TransactionDetails = (props: { transactionId: string, registry: DbDevtoolsRegistry }) => { - return
Transaction Details: {props.transactionId}
-} - -// Style factory function -const stylesFactory = ( - theme: 'light' | 'dark', - css: (typeof goober)['css'], -) => { - const { colors, font, size, border, shadow } = tokens - const t = (light: string, dark: string) => (theme === 'light' ? light : dark) - - return { - devtoolsBtn: css` - position: fixed; - z-index: 99999; - border: none; - background: ${t(colors.white, colors.darkGray[800])}; - color: ${t(colors.gray[700], colors.gray[300])}; - border-radius: ${border.radius.md}; - box-shadow: ${shadow.lg(t(colors.gray[500] + '20', colors.black + '50'))}; - cursor: pointer; - padding: ${size[2]}; - display: flex; - align-items: center; - justify-content: center; - width: ${size[12]}; - height: ${size[12]}; - font-size: ${font.size.lg}; - - &:hover { - background: ${t(colors.gray[50], colors.darkGray[700])}; - } - `, - 'devtoolsBtn-position-bottom-right': css` - bottom: ${size[6]}; - right: ${size[6]}; - `, - 'devtoolsBtn-position-bottom-left': css` - bottom: ${size[6]}; - left: ${size[6]}; - `, - 'devtoolsBtn-position-top-right': css` - top: ${size[6]}; - right: ${size[6]}; - `, - 'devtoolsBtn-position-top-left': css` - top: ${size[6]}; - left: ${size[6]}; - `, - 'devtoolsBtn-position-relative': css` - position: relative; - `, - panel: css` - position: fixed; - display: flex; - font-family: ui-sans-serif, system-ui, sans-serif; - font-size: ${font.size.md}; - z-index: 99999; - color: ${t(colors.gray[700], colors.gray[300])}; - background: ${t(colors.gray[100], colors.darkGray[800])}; - border: 1px solid ${t(colors.gray[300], colors.gray[600])}; - border-radius: ${border.radius.lg}; - box-shadow: ${shadow.xl(t(colors.gray[500] + '20', colors.black + '50'))}; - backdrop-filter: blur(10px); - min-height: 300px; - min-width: 400px; - max-height: 90vh; - max-width: 90vw; - overflow: hidden; - `, - contentView: css` - display: flex; - flex-direction: column; - width: 100%; - height: 100%; - `, - header: css` - display: flex; - align-items: center; - justify-content: space-between; - padding: ${size[4]} ${size[6]}; - border-bottom: 1px solid ${t(colors.gray[300], colors.gray[600])}; - background: ${t(colors.gray[50], colors.darkGray[700])}; - `, - headerTitle: css` - display: flex; - align-items: center; - gap: ${size[3]}; - font-size: ${font.size.lg}; - font-weight: ${font.weight.semibold}; - `, - headerControls: css` - display: flex; - align-items: center; - gap: ${size[2]}; - `, - closeBtn: css` - background: none; - border: none; - color: ${t(colors.gray[500], colors.gray[400])}; - cursor: pointer; - padding: ${size[1]}; - border-radius: ${border.radius.sm}; - - &:hover { - background: ${t(colors.gray[200], colors.gray[600])}; - } - `, - body: css` - display: flex; - flex: 1; - overflow: hidden; - `, - sidebar: css` - width: 300px; - border-right: 1px solid ${t(colors.gray[300], colors.gray[600])}; - background: ${t(colors.gray[50], colors.darkGray[800])}; - display: flex; - flex-direction: column; - `, - tabNav: css` - display: flex; - border-bottom: 1px solid ${t(colors.gray[300], colors.gray[600])}; - background: ${t(colors.gray[100], colors.darkGray[700])}; - `, - tabBtn: css` - flex: 1; - padding: ${size[3]}; - background: transparent; - border: none; - color: ${t(colors.gray[600], colors.gray[400])}; - cursor: pointer; - font-size: ${font.size.sm}; - font-weight: ${font.weight.medium}; - - &:hover { - background: ${t(colors.gray[200], colors.gray[600])}; - } - `, - tabBtnActive: css` - background: ${colors.blue[500]}; - color: ${colors.white}; - - &:hover { - background: ${colors.blue[600]}; - } - `, - sidebarContent: css` - flex: 1; - overflow-y: auto; - `, - sectionHeader: css` - padding: ${size[4]} ${size[4]} ${size[2]} ${size[4]}; - - h3 { - margin: 0; - font-size: ${font.size.sm}; - font-weight: ${font.weight.semibold}; - color: ${t(colors.gray[600], colors.gray[400])}; - text-transform: uppercase; - letter-spacing: 0.5px; - } - `, - collectionItem: css` - padding: ${size[3]} ${size[4]}; - border-bottom: 1px solid ${t(colors.gray[200], colors.gray[700])}; - cursor: pointer; - - &:hover { - background: ${t(colors.gray[100], colors.gray[700])}; - } - `, - collectionItemSelected: css` - background: ${colors.blue[50]}; - border-left: 3px solid ${colors.blue[500]}; - - &:hover { - background: ${colors.blue[100]}; - } - `, - collectionItemHeader: css` - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: ${size[1]}; - `, - collectionItemTitle: css` - font-weight: ${font.weight.medium}; - font-size: ${font.size.sm}; - color: ${t(colors.gray[900], colors.gray[100])}; - `, - collectionItemStatus: css` - display: flex; - align-items: center; - font-size: ${font.size.xs}; - `, - collectionItemMeta: css` - font-size: ${font.size.xs}; - color: ${t(colors.gray[600], colors.gray[400])}; - display: flex; - justify-content: space-between; - `, - collectionItemTimings: css` - font-size: ${font.size['2xs']}; - color: ${t(colors.gray[500], colors.gray[500])}; - margin-top: ${size[0.5]}; - `, - transactionItem: css` - padding: ${size[3]} ${size[4]}; - border-bottom: 1px solid ${t(colors.gray[200], colors.gray[700])}; - cursor: pointer; - - &:hover { - background: ${t(colors.gray[100], colors.gray[700])}; - } - `, - transactionItemSelected: css` - background: ${colors.blue[50]}; - border-left: 3px solid ${colors.blue[500]}; - - &:hover { - background: ${colors.blue[100]}; - } - `, - transactionItemHeader: css` - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: ${size[1]}; - `, - transactionItemTitle: css` - font-weight: ${font.weight.medium}; - font-size: ${font.size.sm}; - color: ${t(colors.gray[900], colors.gray[100])}; - `, - transactionItemStatus: css` - display: flex; - align-items: center; - font-size: ${font.size.xs}; - `, - transactionItemMeta: css` - font-size: ${font.size.xs}; - color: ${t(colors.gray[600], colors.gray[400])}; - display: flex; - justify-content: space-between; - `, - mainContent: css` - flex: 1; - display: flex; - flex-direction: column; - overflow: hidden; - `, - placeholder: css` - display: flex; - align-items: center; - justify-content: center; - flex: 1; - color: ${t(colors.gray[500], colors.gray[400])}; - font-style: italic; - `, - emptyState: css` - padding: ${size[10]} ${size[6]}; - text-align: center; - color: ${t(colors.gray[500], colors.gray[400])}; - font-style: italic; - `, - dragHandle: css` - background: transparent; - cursor: ${(pos: DevtoolsPosition) => pos === 'left' || pos === 'right' ? 'ew-resize' : 'ns-resize'}; - opacity: 0; - - &:hover { - opacity: 1; - background: ${colors.blue[500]}; - } - `, - } -} - -const lightStyles = (css: (typeof goober)['css']) => stylesFactory('light', css) -const darkStyles = (css: (typeof goober)['css']) => stylesFactory('dark', css) \ No newline at end of file diff --git a/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx b/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx index 92860e292..a7e692f6c 100644 --- a/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx +++ b/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx @@ -118,7 +118,7 @@ export function FloatingTanStackDbDevtools({ document.addEventListener('mouseup', unsub) } - const isButtonClosed = isOpen() ?? false + createEffect(() => { setIsResolvedOpen(isOpen() ?? false) @@ -182,9 +182,7 @@ export function FloatingTanStackDbDevtools({ } const { - style: closeButtonStyle = {}, onClick: onCloseClick, - ...otherCloseButtonProps } = closeButtonProps const { diff --git a/packages/db-devtools/src/components/CollectionDetails.tsx b/packages/db-devtools/src/components/CollectionDetails.tsx deleted file mode 100644 index 997d87d5d..000000000 --- a/packages/db-devtools/src/components/CollectionDetails.tsx +++ /dev/null @@ -1,317 +0,0 @@ -/** @jsxImportSource solid-js */ -import { For, Show, createEffect, createSignal, onCleanup } from "solid-js" -import type { DbDevtoolsRegistry } from "../types" - -interface CollectionDetailsProps { - collectionId: string - registry: DbDevtoolsRegistry -} - -export function CollectionDetails(props: CollectionDetailsProps) { - const [collectionData, setCollectionData] = createSignal>([]) - const [isLoading, setIsLoading] = createSignal(false) - const [error, setError] = createSignal(null) - - let unsubscribe: (() => void) | undefined - - createEffect(() => { - const collectionId = props.collectionId - if (!collectionId) return - - setIsLoading(true) - setError(null) - - // Get the collection (creates hard reference) - const collection = props.registry.getCollection(collectionId) - if (!collection) { - setError(`Collection not found`) - setIsLoading(false) - return - } - - // Subscribe to collection changes - unsubscribe = collection.subscribeChanges( - (_changes) => { - // Update the local state with fresh data - setCollectionData(Array.from(collection.values())) - }, - { includeInitialState: true } - ) - - setIsLoading(false) - - // Cleanup: release hard reference and unsubscribe - onCleanup(() => { - if (unsubscribe) { - unsubscribe() - unsubscribe = undefined - } - props.registry.releaseCollection(collectionId) - }) - }) - - const metadata = () => - props.registry.getCollectionMetadata(props.collectionId) - - return ( -
- -
- Loading collection details... -
-
- } - > -
-
-

- {metadata()?.type === `live-query` ? `🔄` : `📄`} - {` `} - {props.collectionId} -

-
- Status: {metadata()?.status} - - {collectionData().length} items -
-
- - {/* Metadata Section */} - -
-

- Metadata -

-
-
- Type: {metadata()!.type} -
-
- Created: - {` `} - {metadata()!.createdAt.toLocaleString()} -
-
- Last Updated: - {` `} - {metadata()!.lastUpdated.toLocaleString()} -
-
- GC Time: - {` `} - {metadata()!.gcTime || `Default`}ms -
- -
- Transactions: - {` `} - {metadata()!.transactionCount} -
-
-
- - {/* Live Query Timings */} - -
-

- Performance Metrics -

-
- -
- Initial Run: - {` `} - {metadata()!.timings!.initialRunTime}ms -
-
-
- Total Runs: - {` `} - {metadata()!.timings!.totalIncrementalRuns} -
- -
- Avg Incremental: - {` `} - {metadata()!.timings!.averageIncrementalRunTime}ms -
-
- -
- Last Run: - {` `} - {metadata()!.timings!.lastIncrementalRunTime}ms -
-
-
-
-
-
-
- - {/* Data Section */} -
-

- Data ({collectionData().length} items) -

- - - - {(item, index) => ( -
-
- - Item {index() + 1} - -
-                                {JSON.stringify(item, null, 2)}
-                              
-
-
- )} -
-
- } - > -
- No data in collection -
- -
-
-
- } - > -
- {error()} -
-
-
- ) -} diff --git a/packages/db-devtools/src/components/TransactionList.tsx b/packages/db-devtools/src/components/TransactionList.tsx deleted file mode 100644 index 9f99d317b..000000000 --- a/packages/db-devtools/src/components/TransactionList.tsx +++ /dev/null @@ -1,142 +0,0 @@ -/** @jsxImportSource solid-js */ -import { For, Show } from "solid-js" -import type { TransactionDetails } from "../types" - -interface TransactionListProps { - transactions: Array - selectedTransaction: string | null - onTransactionSelect: (id: string) => void -} - -export function TransactionList(props: TransactionListProps) { - const getStateColor = (state: string) => { - switch (state) { - case `completed`: - return `#22c55e` - case `failed`: - return `#ef4444` - case `persisting`: - return `#eab308` - case `pending`: - return `#3b82f6` - default: - return `#6b7280` - } - } - - const getStateIcon = (state: string) => { - switch (state) { - case `completed`: - return `✓` - case `failed`: - return `✗` - case `persisting`: - return `⟳` - case `pending`: - return `○` - default: - return `?` - } - } - - return ( -
- - {(transaction) => ( -
props.onTransactionSelect(transaction.id)} - style={{ - padding: `12px 16px`, - "border-bottom": `1px solid #333`, - cursor: `pointer`, - "background-color": - props.selectedTransaction === transaction.id - ? `#0088ff20` - : `transparent`, - "border-left": - props.selectedTransaction === transaction.id - ? `3px solid #0088ff` - : `3px solid transparent`, - }} - > -
-
- {transaction.id.slice(0, 8)}... -
-
- - {getStateIcon(transaction.state)} - - - {transaction.state} - -
-
-
- {transaction.collectionId} - {transaction.mutations.length} mutations -
-
- {new Date(transaction.createdAt).toLocaleString()} -
-
- )} - - } - > -
- No transactions found -
-
-
- ) -} diff --git a/packages/db-devtools/src/contexts/index.tsx b/packages/db-devtools/src/contexts/index.tsx index fd49bb854..5ff3fbaff 100644 --- a/packages/db-devtools/src/contexts/index.tsx +++ b/packages/db-devtools/src/contexts/index.tsx @@ -1,32 +1,4 @@ -import { createContext, useContext, createSignal, onMount, onCleanup } from 'solid-js' -import { createStorage } from '@solid-primitives/storage' -import type { JSX, Accessor } from 'solid-js' -import type { DevtoolsPosition, DevtoolsButtonPosition } from '../constants' - -export type DevtoolsErrorType = 'loading' | 'error' - -export interface DbDevtoolsContext { - initialIsOpen?: boolean - position?: DevtoolsPosition - buttonPosition?: DevtoolsButtonPosition - shadowDOMTarget?: ShadowRoot - errorTypes?: DevtoolsErrorType[] - onlineManager?: { - isOnline: () => boolean - subscribe: (fn: (online: boolean) => void) => () => void - } -} - -export interface DbDevtoolsProps extends DbDevtoolsContext { - children?: JSX.Element -} - -const DbDevtoolsContext = createContext({}) - -export const useDbDevtoolsContext = () => useContext(DbDevtoolsContext) - -// Shadow DOM Target Context - matches Router devtools pattern -export const ShadowDomTargetContext = createContext(undefined) +import { createContext, useContext } from 'solid-js' // Devtools On Close Context - matches Router devtools pattern export const DevtoolsOnCloseContext = createContext<{ onCloseClick: (e: any) => void }>({ @@ -35,132 +7,5 @@ export const DevtoolsOnCloseContext = createContext<{ onCloseClick: (e: any) => export const useDevtoolsOnClose = () => useContext(DevtoolsOnCloseContext) -export const DbDevtoolsProvider = (props: DbDevtoolsProps) => { - const value = { - initialIsOpen: props.initialIsOpen, - position: props.position, - buttonPosition: props.buttonPosition, - shadowDOMTarget: props.shadowDOMTarget, - errorTypes: props.errorTypes, - onlineManager: props.onlineManager, - } - - return ( - - {props.children} - - ) -} - -export type Theme = 'light' | 'dark' - -const ThemeContext = createContext<{ - theme: Accessor - setTheme: (theme: Theme) => void -}>({ - theme: () => 'dark' as Theme, - setTheme: () => {}, -}) - -export const useTheme = () => useContext(ThemeContext).theme -export const useSetTheme = () => useContext(ThemeContext).setTheme - -export const ThemeProvider = (props: { children: JSX.Element }) => { - const [theme, setTheme] = createSignal('dark') - - onMount(() => { - // SSR safety check - if (typeof window === 'undefined') return - - // Check system preference - const prefersDark = window.matchMedia('(prefers-color-scheme: dark)') - setTheme(prefersDark.matches ? 'dark' : 'light') - - // Listen for changes - const handleChange = (e: MediaQueryListEvent) => { - setTheme(e.matches ? 'dark' : 'light') - } - - prefersDark.addEventListener('change', handleChange) - onCleanup(() => prefersDark.removeEventListener('change', handleChange)) - }) - - const value = { - theme, - setTheme, - } - - return ( - - {props.children} - - ) -} - -// Picture-in-Picture Context -const PiPContext = createContext<{ - pipWindow: Accessor - openPiP: () => void - closePiP: () => void -}>({ - pipWindow: () => null, - openPiP: () => {}, - closePiP: () => {}, -}) - -export const usePiPWindow = () => useContext(PiPContext) - -export const PiPProvider = (props: { children: JSX.Element }) => { - const [pipWindow, setPiPWindow] = createSignal(null) - - const openPiP = () => { - if (typeof window === 'undefined') return - - const features = [ - 'width=500', - 'height=300', - 'toolbar=no', - 'location=no', - 'directories=no', - 'status=no', - 'menubar=no', - 'scrollbars=no', - 'resizable=yes', - 'copyhistory=no', - ].join(',') - - const pip = window.open('', 'devtools', features) - setPiPWindow(pip) - } - - const closePiP = () => { - pipWindow()?.close() - setPiPWindow(null) - } - - const value = { - pipWindow, - openPiP, - closePiP, - } - - return ( - - {props.children} - - ) -} - -// Storage hooks -export const useDevtoolsStorage = () => { - const [store, setStore] = createStorage({ - prefix: 'tanstack-db-devtools', - api: localStorage, - serializer: { - read: (value: string) => JSON.parse(value), - write: (value: any) => JSON.stringify(value), - }, - }) - - return { store, setStore } -} \ No newline at end of file +// Shadow DOM Target Context - matches Router devtools pattern +export const ShadowDomTargetContext = createContext(undefined) \ No newline at end of file diff --git a/packages/db-devtools/src/devtools.ts b/packages/db-devtools/src/devtools.ts index 8dcb1c3d1..a75dfdd68 100644 --- a/packages/db-devtools/src/devtools.ts +++ b/packages/db-devtools/src/devtools.ts @@ -13,9 +13,17 @@ export function initializeDbDevtools(): void { return } + // Check if devtools are already initialized + if ((window as any).__TANSTACK_DB_DEVTOOLS__) { + return + } + // Initialize the registry const registry = initializeDevtoolsRegistry() + // Store the registry globally + ;(window as any).__TANSTACK_DB_DEVTOOLS__ = registry + // Set up global registration function that collections can call ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { registry.registerCollection(collection) diff --git a/packages/db-devtools/src/icons/index.tsx b/packages/db-devtools/src/icons/index.tsx deleted file mode 100644 index 12f7e209a..000000000 --- a/packages/db-devtools/src/icons/index.tsx +++ /dev/null @@ -1,372 +0,0 @@ -/** @jsxImportSource solid-js */ -import type { Component } from 'solid-js' - -export const TanstackLogo: Component = (props) => ( - - - -) - -export const ArrowDown: Component = (props) => ( - - - -) - -export const ArrowUp = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const ArrowLeft = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const ArrowRight = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const CheckCircle = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const LoadingCircle = (props: JSX.SvgSVGAttributes) => ( - - - - -) - -export const XCircle = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const PauseCircle = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const Search = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const Settings = (props: JSX.SvgSVGAttributes) => ( - - - - -) - -export const Trash = (props: JSX.SvgSVGAttributes) => ( - - - - -) - -export const Sun = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const Moon = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const Monitor = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const Wifi = (props: JSX.SvgSVGAttributes) => ( - - - - - - -) - -export const Offline = (props: JSX.SvgSVGAttributes) => ( - - - - -) - -export const ChevronDown = (props: JSX.SvgSVGAttributes) => ( - - - -) - -export const PiPIcon = (props: JSX.SvgSVGAttributes) => ( - - - - -) \ No newline at end of file diff --git a/packages/db-devtools/src/index.ts b/packages/db-devtools/src/index.ts index 867369a45..46b149c28 100644 --- a/packages/db-devtools/src/index.ts +++ b/packages/db-devtools/src/index.ts @@ -1,23 +1,12 @@ -// New implementation exports (temporarily commented out until dependencies are installed) -// export * from './Devtools' -// export * from './contexts' -export * from './theme' -export * from './constants' -// export * from './utils' -// export * from './icons' +// Core exports export * from './types' - -// Legacy exports for backwards compatibility -export * from "./devtools" -export * from "./registry" +export * from './constants' +export * from './devtools' +export * from './registry' // Main Devtools Class (follows TanStack pattern) export { TanstackDbDevtools } from "./TanstackDbDevtools" export type { TanstackDbDevtoolsConfig } from "./TanstackDbDevtools" -// SolidJS Components (for direct SolidJS usage) - Temporarily disabled to prevent SSR issues -// export { default as DbDevtools } from "./DbDevtools" -// export { DbDevtoolsPanel } from "./DbDevtoolsPanel" - // Export the initialization function export { initializeDbDevtools } from "./devtools" diff --git a/packages/db-devtools/src/registry.ts b/packages/db-devtools/src/registry.ts index 5acb132f8..6fd13c783 100644 --- a/packages/db-devtools/src/registry.ts +++ b/packages/db-devtools/src/registry.ts @@ -16,15 +16,6 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { } registerCollection = (collection: any): void => { - console.log('Registry: Registering collection', { - id: collection.id, - type: this.detectCollectionType(collection), - status: collection.status, - size: collection.size, - hasTransactions: collection.transactions.size > 0, - registrySize: this.collections.size - }) - const metadata: CollectionMetadata = { id: collection.id, type: this.detectCollectionType(collection), @@ -49,12 +40,6 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { } this.collections.set(collection.id, entry) - - console.log('Registry: Collection registered successfully', { - id: collection.id, - totalCollections: this.collections.size, - allCollectionIds: Array.from(this.collections.keys()) - }) // Track performance for live queries if (this.isLiveQuery(collection)) { @@ -91,8 +76,6 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { } getAllCollectionMetadata = (): Array => { - console.log('Registry: getAllCollectionMetadata called, total collections:', this.collections.size) - const results: Array = [] for (const [id, entry] of this.collections) { @@ -105,22 +88,14 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { entry.metadata.transactionCount = collection.transactions.size entry.metadata.lastUpdated = new Date() results.push({ ...entry.metadata }) - console.log('Registry: Found live collection:', { - id, - status: collection.status, - size: collection.size, - type: entry.metadata.type - }) } else { // Collection was garbage collected, mark it entry.metadata.status = `cleaned-up` entry.metadata.lastUpdated = new Date() results.push({ ...entry.metadata }) - console.log('Registry: Found GC\'d collection:', id) } } - console.log('Registry: Returning metadata for', results.length, 'collections') return results } diff --git a/packages/db-devtools/src/theme.ts b/packages/db-devtools/src/theme.ts deleted file mode 100644 index febf8fe68..000000000 --- a/packages/db-devtools/src/theme.ts +++ /dev/null @@ -1,299 +0,0 @@ -export const tokens = { - colors: { - inherit: 'inherit', - current: 'currentColor', - transparent: 'transparent', - black: '#000000', - white: '#ffffff', - neutral: { - 50: '#f9fafb', - 100: '#f2f4f7', - 200: '#eaecf0', - 300: '#d0d5dd', - 400: '#98a2b3', - 500: '#667085', - 600: '#475467', - 700: '#344054', - 800: '#1d2939', - 900: '#101828', - }, - darkGray: { - 50: '#525c7a', - 100: '#49536e', - 200: '#414962', - 300: '#394056', - 400: '#313749', - 500: '#292e3d', - 600: '#212530', - 700: '#191c24', - 800: '#111318', - 900: '#0b0d10', - }, - gray: { - 50: '#f9fafb', - 100: '#f2f4f7', - 200: '#eaecf0', - 300: '#d0d5dd', - 400: '#98a2b3', - 500: '#667085', - 600: '#475467', - 700: '#344054', - 800: '#1d2939', - 900: '#101828', - }, - blue: { - 25: '#F5FAFF', - 50: '#EFF8FF', - 100: '#D1E9FF', - 200: '#B2DDFF', - 300: '#84CAFF', - 400: '#53B1FD', - 500: '#2E90FA', - 600: '#1570EF', - 700: '#175CD3', - 800: '#1849A9', - 900: '#194185', - }, - green: { - 25: '#F6FEF9', - 50: '#ECFDF3', - 100: '#D1FADF', - 200: '#A6F4C5', - 300: '#6CE9A6', - 400: '#32D583', - 500: '#12B76A', - 600: '#039855', - 700: '#027A48', - 800: '#05603A', - 900: '#054F31', - }, - red: { - 50: '#fef2f2', - 100: '#fee2e2', - 200: '#fecaca', - 300: '#fca5a5', - 400: '#f87171', - 500: '#ef4444', - 600: '#dc2626', - 700: '#b91c1c', - 800: '#991b1b', - 900: '#7f1d1d', - 950: '#450a0a', - }, - yellow: { - 25: '#FFFCF5', - 50: '#FFFAEB', - 100: '#FEF0C7', - 200: '#FEDF89', - 300: '#FEC84B', - 400: '#FDB022', - 500: '#F79009', - 600: '#DC6803', - 700: '#B54708', - 800: '#93370D', - 900: '#7A2E0E', - }, - purple: { - 25: '#FAFAFF', - 50: '#F4F3FF', - 100: '#EBE9FE', - 200: '#D9D6FE', - 300: '#BDB4FE', - 400: '#9B8AFB', - 500: '#7A5AF8', - 600: '#6938EF', - 700: '#5925DC', - 800: '#4A1FB8', - 900: '#3E1C96', - }, - teal: { - 25: '#F6FEFC', - 50: '#F0FDF9', - 100: '#CCFBEF', - 200: '#99F6E0', - 300: '#5FE9D0', - 400: '#2ED3B7', - 500: '#15B79E', - 600: '#0E9384', - 700: '#107569', - 800: '#125D56', - 900: '#134E48', - }, - pink: { - 25: '#fdf2f8', - 50: '#fce7f3', - 100: '#fbcfe8', - 200: '#f9a8d4', - 300: '#f472b6', - 400: '#ec4899', - 500: '#db2777', - 600: '#be185d', - 700: '#9d174d', - 800: '#831843', - 900: '#500724', - }, - cyan: { - 25: '#ecfeff', - 50: '#cffafe', - 100: '#a5f3fc', - 200: '#67e8f9', - 300: '#22d3ee', - 400: '#06b6d4', - 500: '#0891b2', - 600: '#0e7490', - 700: '#155e75', - 800: '#164e63', - 900: '#083344', - }, - }, - alpha: { - 100: 'ff', - 90: 'e5', - 80: 'cc', - 70: 'b3', - 60: '99', - 50: '80', - 40: '66', - 30: '4d', - 20: '33', - 10: '1a', - 0: '00', - }, - font: { - size: { - '2xs': 'calc(var(--tsdb-font-size) * 0.625)', - xs: 'calc(var(--tsdb-font-size) * 0.75)', - sm: 'calc(var(--tsdb-font-size) * 0.875)', - md: 'var(--tsdb-font-size)', - lg: 'calc(var(--tsdb-font-size) * 1.125)', - xl: 'calc(var(--tsdb-font-size) * 1.25)', - '2xl': 'calc(var(--tsdb-font-size) * 1.5)', - '3xl': 'calc(var(--tsdb-font-size) * 1.875)', - '4xl': 'calc(var(--tsdb-font-size) * 2.25)', - '5xl': 'calc(var(--tsdb-font-size) * 3)', - '6xl': 'calc(var(--tsdb-font-size) * 3.75)', - '7xl': 'calc(var(--tsdb-font-size) * 4.5)', - '8xl': 'calc(var(--tsdb-font-size) * 6)', - '9xl': 'calc(var(--tsdb-font-size) * 8)', - }, - lineHeight: { - xs: 'calc(var(--tsdb-font-size) * 1)', - sm: 'calc(var(--tsdb-font-size) * 1.25)', - md: 'calc(var(--tsdb-font-size) * 1.5)', - lg: 'calc(var(--tsdb-font-size) * 1.75)', - xl: 'calc(var(--tsdb-font-size) * 2)', - '2xl': 'calc(var(--tsdb-font-size) * 2.25)', - '3xl': 'calc(var(--tsdb-font-size) * 2.5)', - '4xl': 'calc(var(--tsdb-font-size) * 2.75)', - '5xl': 'calc(var(--tsdb-font-size) * 3)', - '6xl': 'calc(var(--tsdb-font-size) * 3.25)', - '7xl': 'calc(var(--tsdb-font-size) * 3.5)', - '8xl': 'calc(var(--tsdb-font-size) * 3.75)', - '9xl': 'calc(var(--tsdb-font-size) * 4)', - }, - weight: { - thin: '100', - extralight: '200', - light: '300', - normal: '400', - medium: '500', - semibold: '600', - bold: '700', - extrabold: '800', - black: '900', - }, - }, - breakpoints: { - xs: '320px', - sm: '640px', - md: '768px', - lg: '1024px', - xl: '1280px', - '2xl': '1536px', - }, - border: { - radius: { - none: '0px', - xs: 'calc(var(--tsdb-font-size) * 0.125)', - sm: 'calc(var(--tsdb-font-size) * 0.25)', - md: 'calc(var(--tsdb-font-size) * 0.375)', - lg: 'calc(var(--tsdb-font-size) * 0.5)', - xl: 'calc(var(--tsdb-font-size) * 0.75)', - '2xl': 'calc(var(--tsdb-font-size) * 1)', - '3xl': 'calc(var(--tsdb-font-size) * 1.5)', - full: '9999px', - }, - }, - size: { - 0: '0px', - 0.25: 'calc(var(--tsdb-font-size) * 0.0625)', - 0.5: 'calc(var(--tsdb-font-size) * 0.125)', - 1: 'calc(var(--tsdb-font-size) * 0.25)', - 1.5: 'calc(var(--tsdb-font-size) * 0.375)', - 2: 'calc(var(--tsdb-font-size) * 0.5)', - 2.5: 'calc(var(--tsdb-font-size) * 0.625)', - 3: 'calc(var(--tsdb-font-size) * 0.75)', - 3.5: 'calc(var(--tsdb-font-size) * 0.875)', - 4: 'calc(var(--tsdb-font-size) * 1)', - 4.5: 'calc(var(--tsdb-font-size) * 1.125)', - 5: 'calc(var(--tsdb-font-size) * 1.25)', - 5.5: 'calc(var(--tsdb-font-size) * 1.375)', - 6: 'calc(var(--tsdb-font-size) * 1.5)', - 6.5: 'calc(var(--tsdb-font-size) * 1.625)', - 7: 'calc(var(--tsdb-font-size) * 1.75)', - 8: 'calc(var(--tsdb-font-size) * 2)', - 9: 'calc(var(--tsdb-font-size) * 2.25)', - 10: 'calc(var(--tsdb-font-size) * 2.5)', - 11: 'calc(var(--tsdb-font-size) * 2.75)', - 12: 'calc(var(--tsdb-font-size) * 3)', - 14: 'calc(var(--tsdb-font-size) * 3.5)', - 16: 'calc(var(--tsdb-font-size) * 4)', - 20: 'calc(var(--tsdb-font-size) * 5)', - 24: 'calc(var(--tsdb-font-size) * 6)', - 28: 'calc(var(--tsdb-font-size) * 7)', - 32: 'calc(var(--tsdb-font-size) * 8)', - 36: 'calc(var(--tsdb-font-size) * 9)', - 40: 'calc(var(--tsdb-font-size) * 10)', - 44: 'calc(var(--tsdb-font-size) * 11)', - 48: 'calc(var(--tsdb-font-size) * 12)', - 52: 'calc(var(--tsdb-font-size) * 13)', - 56: 'calc(var(--tsdb-font-size) * 14)', - 60: 'calc(var(--tsdb-font-size) * 15)', - 64: 'calc(var(--tsdb-font-size) * 16)', - 72: 'calc(var(--tsdb-font-size) * 18)', - 80: 'calc(var(--tsdb-font-size) * 20)', - 96: 'calc(var(--tsdb-font-size) * 24)', - }, - shadow: { - xs: (_: string = 'rgb(0 0 0 / 0.1)') => - `0 1px 2px 0 rgb(0 0 0 / 0.05)` as const, - sm: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}` as const, - md: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}` as const, - lg: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}` as const, - xl: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}` as const, - '2xl': (color: string = 'rgb(0 0 0 / 0.25)') => - `0 25px 50px -12px ${color}` as const, - inner: (color: string = 'rgb(0 0 0 / 0.05)') => - `inset 0 2px 4px 0 ${color}` as const, - none: () => `none` as const, - }, - zIndices: { - hide: -1, - auto: 'auto', - base: 0, - docked: 10, - dropdown: 1000, - sticky: 1100, - banner: 1200, - overlay: 1300, - modal: 1400, - popover: 1500, - skipLink: 1600, - toast: 1700, - tooltip: 1800, - }, -} as const \ No newline at end of file diff --git a/packages/db-devtools/src/useLocalStorage.ts b/packages/db-devtools/src/useLocalStorage.ts index bd4456542..70bbe2dc2 100644 --- a/packages/db-devtools/src/useLocalStorage.ts +++ b/packages/db-devtools/src/useLocalStorage.ts @@ -13,7 +13,7 @@ export function useLocalStorage( try { const item = window.localStorage.getItem(key) - return item ? JSON.parse(item) : defaultValue + return item ? JSON.parse(item) : (defaultValue as T) } catch (error) { console.warn(`Error reading localStorage key "${key}":`, error) return defaultValue as T diff --git a/packages/db-devtools/src/useStyles.tsx b/packages/db-devtools/src/useStyles.tsx index 39299b30f..7687987c1 100644 --- a/packages/db-devtools/src/useStyles.tsx +++ b/packages/db-devtools/src/useStyles.tsx @@ -5,8 +5,8 @@ import { ShadowDomTargetContext } from './contexts' import type { Accessor } from 'solid-js' const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { - const { colors, font, size, alpha, shadow, border } = tokens - const { fontFamily, lineHeight, size: fontSize } = font + const { colors, font, size, alpha, border } = tokens + const { fontFamily, size: fontSize } = font const css = shadowDOMTarget ? goober.css.bind({ target: shadowDOMTarget }) : goober.css @@ -364,6 +364,42 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { collectionsExplorer: css` padding: ${size[2]}; `, + tabNav: css` + display: flex; + border-bottom: 1px solid ${colors.gray[700]}; + background: ${colors.darkGray[600]}; + `, + tabBtn: css` + flex: 1; + padding: ${size[2]} ${size[3]}; + background: transparent; + border: none; + color: ${colors.gray[400]}; + cursor: pointer; + font-size: ${fontSize.sm}; + font-weight: ${font.weight.medium}; + + &:hover { + background: ${colors.darkGray[500]}; + } + `, + tabBtnActive: css` + background: ${colors.blue[500]}; + color: ${colors.white}; + + &:hover { + background: ${colors.blue[600]}; + } + `, + sidebarContent: css` + flex: 1; + overflow-y: auto; + `, + transactionsExplorer: css` + display: flex; + flex-direction: column; + flex: 1; + `, } } diff --git a/packages/db-devtools/src/utils.tsx b/packages/db-devtools/src/utils.tsx index 995ec769d..1f555de2d 100644 --- a/packages/db-devtools/src/utils.tsx +++ b/packages/db-devtools/src/utils.tsx @@ -15,7 +15,7 @@ export function multiSortBy( items: T[], sorters: ((item: T) => any)[], ): T[] { - return items.sort((a, b) => { + return [...items].sort((a, b) => { for (let i = 0; i < sorters.length; i++) { const sorter = sorters[i] if (!sorter) continue @@ -25,7 +25,7 @@ export function multiSortBy( if (aVal < bVal) return -1 if (aVal > bVal) return 1 - } + } return 0 }) } @@ -54,8 +54,8 @@ export function displayValue(value: any, space?: number): string { if (typeof value === 'number' || typeof value === 'boolean') { return String(value) - } - +} + if (value === null) { return 'null' } @@ -69,7 +69,7 @@ export function displayValue(value: any, space?: number): string { } return String(value) -} + } export function formatTimestamp(timestamp: number): string { const date = new Date(timestamp) @@ -98,7 +98,7 @@ export function sortBy( items: T[], sorter: (item: T) => any, ): T[] { - return items.sort((a, b) => { + return [...items].sort((a, b) => { const aVal = sorter(a) const bVal = sorter(b) diff --git a/packages/db/src/collection.ts b/packages/db/src/collection.ts index 2989044de..5109fc767 100644 --- a/packages/db/src/collection.ts +++ b/packages/db/src/collection.ts @@ -25,19 +25,11 @@ export const collectionsStore = new Map>() // Check for devtools registry and register collection if available function registerWithDevtools(collection: CollectionImpl): void { if (typeof window !== `undefined`) { - console.log('Collection created, checking for devtools registration:', { - collectionId: collection.id, - registryAvailable: !!(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__, - registryExists: !!(window as any).__TANSTACK_DB_DEVTOOLS__ - }) - if ((window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { (window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__(collection) ;(collection as any).isRegisteredWithDevtools = true - console.log('Collection registered with devtools:', collection.id) } else { ;(collection as any).isRegisteredWithDevtools = false - console.warn('Devtools registry not available for collection:', collection.id) } } } diff --git a/packages/react-db-devtools/src/ReactDbDevtools.tsx b/packages/react-db-devtools/src/ReactDbDevtools.tsx index 3b0c044e2..ae5dacc55 100644 --- a/packages/react-db-devtools/src/ReactDbDevtools.tsx +++ b/packages/react-db-devtools/src/ReactDbDevtools.tsx @@ -31,7 +31,6 @@ export function TanStackReactDbDevtools(props: TanStackReactDbDevtoolsProps = {} devtoolsInstance.mount(ref.current) setDevtools(devtoolsInstance) } catch (error) { - console.error('ReactDbDevtools: Failed to mount DB devtools:', error) initializingRef.current = false // Reset flag on error } @@ -43,7 +42,6 @@ export function TanStackReactDbDevtools(props: TanStackReactDbDevtoolsProps = {} } } catch (error) { // Ignore unmount errors if devtools weren't mounted - console.warn('ReactDbDevtools: Error unmounting DB devtools:', error) } initializingRef.current = false } @@ -56,111 +54,31 @@ export function TanStackReactDbDevtools(props: TanStackReactDbDevtoolsProps = {} if (props.initialIsOpen !== undefined) { devtools.setInitialIsOpen(props.initialIsOpen) } - - if (props.position !== undefined) { - devtools.setPosition(props.position) - } - - if (props.panelProps !== undefined) { - devtools.setPanelProps(props.panelProps) - } - - if (props.toggleButtonProps !== undefined) { - devtools.setToggleButtonProps(props.toggleButtonProps) - } - - if (props.closeButtonProps !== undefined) { - devtools.setCloseButtonProps(props.closeButtonProps) - } - - if (props.storageKey !== undefined) { - devtools.setStorageKey(props.storageKey) - } - - if (props.panelState !== undefined) { - devtools.setPanelState(props.panelState) - } - - if (props.onPanelStateChange !== undefined) { - devtools.setOnPanelStateChange(props.onPanelStateChange) - } - }, [ - devtools, - props.initialIsOpen, - props.position, - props.panelProps, - props.toggleButtonProps, - props.closeButtonProps, - props.storageKey, - props.panelState, - props.onPanelStateChange, - ]) - // Render a container div for the devtools - return
-} - -export function TanStackReactDbDevtoolsPanel(props: TanStackReactDbDevtoolsProps = {}) { - const ref = useRef(null) - const [devtools, setDevtools] = useState(null) - - // Initialize devtools only on client side - useEffect(() => { - if (typeof window === 'undefined' || !ref.current) return - - const devtoolsInstance = new TanstackDbDevtools(props) - - try { - // Mount the devtools to the DOM element - devtoolsInstance.mount(ref.current) - setDevtools(devtoolsInstance) - } catch (error) { - console.error('Failed to mount DB devtools panel:', error) - } - - return () => { - try { - // Only unmount if the devtools were successfully mounted - devtoolsInstance.unmount() - } catch (error) { - // Ignore unmount errors if devtools weren't mounted - console.warn('Error unmounting DB devtools panel:', error) - } - } - }, []) - - // Update devtools when props change - useEffect(() => { - if (!devtools) return - - if (props.initialIsOpen !== undefined) { - devtools.setInitialIsOpen(props.initialIsOpen) - } - if (props.position !== undefined) { devtools.setPosition(props.position) } - + if (props.panelProps !== undefined) { devtools.setPanelProps(props.panelProps) } - + if (props.toggleButtonProps !== undefined) { devtools.setToggleButtonProps(props.toggleButtonProps) } - + if (props.closeButtonProps !== undefined) { devtools.setCloseButtonProps(props.closeButtonProps) } - + if (props.storageKey !== undefined) { devtools.setStorageKey(props.storageKey) } - + if (props.panelState !== undefined) { devtools.setPanelState(props.panelState) } - + if (props.onPanelStateChange !== undefined) { devtools.setOnPanelStateChange(props.onPanelStateChange) } @@ -176,6 +94,6 @@ export function TanStackReactDbDevtoolsPanel(props: TanStackReactDbDevtoolsProps props.onPanelStateChange, ]) - // Render a container div for the devtools panel + // Render a container div for the devtools return
} diff --git a/packages/react-db-devtools/src/index.ts b/packages/react-db-devtools/src/index.ts index b36bf9787..2d3090b1a 100644 --- a/packages/react-db-devtools/src/index.ts +++ b/packages/react-db-devtools/src/index.ts @@ -24,195 +24,25 @@ function DevtoolsWrapper(props: any) { return React.createElement(DevtoolsComponent, props) } -function DevtoolsPanelWrapper(props: any) { - const [isClient, setIsClient] = React.useState(false) - const [DevtoolsComponent, setDevtoolsComponent] = React.useState | null>(null) - - React.useEffect(() => { - setIsClient(true) - - import('./ReactDbDevtools').then((module) => { - setDevtoolsComponent(() => module.TanStackReactDbDevtoolsPanel) - }) - }, []) - - if (!isClient || !DevtoolsComponent) { - return null - } - - return React.createElement(DevtoolsComponent, props) -} - // Follow TanStack Query devtools pattern exactly export const TanStackReactDbDevtools: React.ComponentType = typeof window === 'undefined' || process.env.NODE_ENV !== 'development' ? () => null : DevtoolsWrapper -export const TanStackReactDbDevtoolsPanel: React.ComponentType = - typeof window === 'undefined' || process.env.NODE_ENV !== 'development' - ? () => null - : DevtoolsPanelWrapper - export type { TanStackReactDbDevtoolsProps } from './ReactDbDevtools' -// SSR-safe initialization function - implement directly to avoid importing from the SolidJS package +// SSR-safe initialization function - just call the core devtools export function initializeDbDevtools(): void { // SSR safety check if (typeof window === 'undefined') { return } - // Idempotent check - if already initialized, skip - if ((window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { - return - } - - // Create the registry directly without importing SolidJS code to avoid SSR issues - try { - // Import and call the core initialization asynchronously, but ensure registry exists first - import('@tanstack/db-devtools').then((module) => { - module.initializeDbDevtools() - }).catch((error) => { - console.warn('DbDevtools: Failed to load core devtools module:', error) - }) - - // Create immediate registry that works with the SolidJS UI while core loads - if (!(window as any).__TANSTACK_DB_DEVTOOLS__) { - - const collections = new Map() - - const registry = { - collections, - registerCollection: (collection: any) => { - const metadata = { - id: collection.id, - type: collection.id.startsWith('live-query-') ? 'live-query' : 'collection', - status: collection.status || 'idle', - size: collection.size || 0, - hasTransactions: collection.transactions?.size > 0 || false, - transactionCount: collection.transactions?.size || 0, - createdAt: new Date(), - lastUpdated: new Date(), - gcTime: collection.config?.gcTime, - timings: collection.id.startsWith('live-query-') ? { - totalIncrementalRuns: 0, - } : undefined, - } - - const entry = { - weakRef: new WeakRef(collection), - metadata, - isActive: false, - } - - collections.set(collection.id, entry) - }, - unregisterCollection: (id: string) => { - collections.delete(id) - }, - getCollectionMetadata: (id: string) => { - const entry = collections.get(id) - if (!entry) return undefined - - // Try to get fresh data from the collection if it's still alive - const collection = entry.weakRef.deref() - if (collection) { - entry.metadata.status = collection.status - entry.metadata.size = collection.size - entry.metadata.hasTransactions = collection.transactions?.size > 0 || false - entry.metadata.transactionCount = collection.transactions?.size || 0 - entry.metadata.lastUpdated = new Date() - } - - return { ...entry.metadata } - }, - getAllCollectionMetadata: () => { - const results = [] - for (const [, entry] of collections) { - const collection = entry.weakRef.deref() - if (collection) { - // Collection is still alive, update metadata - entry.metadata.status = collection.status - entry.metadata.size = collection.size - entry.metadata.hasTransactions = collection.transactions?.size > 0 || false - entry.metadata.transactionCount = collection.transactions?.size || 0 - entry.metadata.lastUpdated = new Date() - results.push({ ...entry.metadata }) - } else { - // Collection was garbage collected - entry.metadata.status = 'cleaned-up' - entry.metadata.lastUpdated = new Date() - results.push({ ...entry.metadata }) - } - } - - return results - }, - getCollection: (id: string) => { - const entry = collections.get(id) - if (!entry) return undefined - - const collection = entry.weakRef.deref() - if (collection && !entry.isActive) { - // Create hard reference - entry.hardRef = collection - entry.isActive = true - } - - return collection - }, - releaseCollection: (id: string) => { - const entry = collections.get(id) - if (entry && entry.isActive) { - // Release hard reference - entry.hardRef = undefined - entry.isActive = false - } - }, - getTransactions: () => [], - getTransaction: () => undefined, - cleanup: () => { - for (const [_id, entry] of collections) { - if (entry.isActive) { - entry.hardRef = undefined - entry.isActive = false - } - } - }, - garbageCollect: () => { - for (const [id, entry] of collections) { - const collection = entry.weakRef.deref() - if (!collection) { - collections.delete(id) - } - } - }, - } - - // Set up the registry on window - ;(window as any).__TANSTACK_DB_DEVTOOLS__ = registry - } - - // Set up automatic collection registration - if (!(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { - ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { - const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ - if (registry) { - registry.registerCollection(collection) - } - } - } - } catch (error) { - console.warn('DbDevtools: Failed to initialize devtools:', error) - - // Final fallback: set up a basic registration function so collections don't fail - if (!(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { - ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { - // Silent fallback registration - } - } - } - - console.log('DbDevtools: Initialization complete') + // Just import and call the core devtools initialization + import('@tanstack/db-devtools').then((module) => { + module.initializeDbDevtools() + }).catch((error) => { + // Silently fail if core devtools module can't be loaded + }) } From 4b6dd178b01d2e702b3405346f41b4c1e30fd414 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Tue, 15 Jul 2025 13:18:29 +0100 Subject: [PATCH 13/25] wip --- .../src/BaseTanStackDbDevtoolsPanel.tsx | 191 ++++++++++++++---- packages/db-devtools/src/useStyles.tsx | 66 +++++- 2 files changed, 204 insertions(+), 53 deletions(-) diff --git a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx index c2e48dafe..d050a274a 100644 --- a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx +++ b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx @@ -50,6 +50,67 @@ function Logo(props: any) { ) } +function formatTime(ms: number): string { + if (ms === 0) return '0s' + + const units = ['s', 'min', 'h', 'd'] + const values = [ms / 1000, ms / 60000, ms / 3600000, ms / 86400000] + + let chosenUnitIndex = 0 + for (let i = 1; i < values.length; i++) { + if (values[i]! < 1) break + chosenUnitIndex = i + } + + const formatter = new Intl.NumberFormat(navigator.language, { + compactDisplay: 'short', + notation: 'compact', + maximumFractionDigits: 0, + }) + + return formatter.format(values[chosenUnitIndex]!) + units[chosenUnitIndex] +} + +function CollectionStats({ collection }: { collection: CollectionMetadata }) { + const styles = useStyles() + + if (collection.type === 'collection') { + // Standard collection stats + return ( +
+
{collection.size}
+
/
+
{collection.transactionCount}
+
/
+
{formatTime(collection.gcTime || 0)}
+
/
+
+ {collection.status} +
+
+ ) + } else { + // Live query collection stats + return ( +
+
{collection.size}
+
/
+
{formatTime(collection.gcTime || 0)}
+
/
+
+ {collection.status} +
+
+ ) + } +} + function CollectionItem({ collection, isActive, @@ -70,13 +131,7 @@ function CollectionItem({ onClick={() => onSelect(collection)} >
{collection.id}
-
({collection.size})
-
- {collection.status} -
+
) } @@ -112,8 +167,13 @@ export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel( const updateCollections = () => { if (typeof window === 'undefined') return try { - const collections = registry().getAllCollectionMetadata() - setCollections(collections) + const newCollections = registry().getAllCollectionMetadata() + const currentCollections = collections() + + // Only update if collections data actually changed + if (hasCollectionsChanged(currentCollections, newCollections)) { + setCollections(newCollections) + } } catch (error) { // Silently handle errors when fetching collections metadata } @@ -179,6 +239,14 @@ export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel( ) }) + // Group collections by type + const standardCollections = createMemo(() => + sortedCollections().filter(c => c.type === 'collection') + ) + + const liveCollections = createMemo(() => + sortedCollections().filter(c => c.type === 'live-query') + ) return ( @@ -224,39 +292,36 @@ export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel(
- +
+ + {/* Tab Navigation */} +
+ + +
+
- {/* Tab Navigation */} -
- - -
- {/* Content based on selected view */}
-
-
Collections ({collections().length})
-
-
0} @@ -266,13 +331,53 @@ export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel(
} > - {(collection) => - collection.id === activeCollectionId()} - onSelect={(c) => setActiveCollectionId(c.id)} - /> - } + {/* Standard Collections */} + 0}> +
+
+
Standard Collections ({standardCollections().length})
+
+ Items + / + Txn + / + GC + / + Status +
+
+ {(collection) => + collection.id === activeCollectionId()} + onSelect={(c) => setActiveCollectionId(c.id)} + /> + } +
+
+ + {/* Live Collections */} + 0}> +
+
+
Live Collections ({liveCollections().length})
+
+ Items + / + GC + / + Status +
+
+ {(collection) => + collection.id === activeCollectionId()} + onSelect={(c) => setActiveCollectionId(c.id)} + /> + } +
+
diff --git a/packages/db-devtools/src/useStyles.tsx b/packages/db-devtools/src/useStyles.tsx index 7687987c1..f8108ffe9 100644 --- a/packages/db-devtools/src/useStyles.tsx +++ b/packages/db-devtools/src/useStyles.tsx @@ -121,7 +121,7 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { } `, firstContainer: css` - flex: 1 1 500px; + flex: 0 0 35%; min-height: 40%; max-height: 100%; overflow: auto; @@ -303,7 +303,7 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { `, collectionStatus: css` font-size: ${fontSize.xs}; - padding: ${size[1]} ${size[2]}; + padding: ${size[0.5]} ${size[1]}; border-radius: ${border.radius.sm}; font-weight: ${font.weight.medium}; background-color: ${colors.green[900]}; @@ -320,6 +320,15 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { color: ${colors.gray[400]}; margin-left: ${size[2]}; `, + collectionStats: css` + display: flex; + gap: ${size[1]}; + font-size: ${fontSize.xs}; + color: ${colors.gray[400]}; + font-variant-numeric: tabular-nums; + line-height: ${font.lineHeight.xs}; + align-items: center; + `, detailsPanel: css` display: flex; flex-direction: column; @@ -354,41 +363,78 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { align-items: center; padding: ${size[2]} ${size[2.5]}; gap: ${size[2.5]}; - border-bottom: ${colors.darkGray[500]} 1px solid; + border-bottom: ${colors.gray[700]} 1px solid; align-items: center; `, + headerContainer: css` + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + padding: ${size[0.5]} ${size[2]}; + `, collectionsExplorerContainer: css` overflow-y: auto; flex: 1; `, collectionsExplorer: css` - padding: ${size[2]}; + /* Removed padding to use full width and height */ + `, + collectionGroup: css` + /* Removed margin to eliminate extra spacing */ + `, + collectionGroupHeader: css` + padding: ${size[1.5]} ${size[2]}; + font-size: ${fontSize.xs}; + font-weight: ${font.weight.semibold}; + color: ${colors.gray[400]}; + background: ${colors.darkGray[600]}; + border-bottom: 1px solid ${colors.gray[700]}; + text-transform: uppercase; + letter-spacing: 0.5px; + display: flex; + justify-content: space-between; + align-items: center; + `, + collectionGroupStats: css` + display: flex; + gap: ${size[1]}; + font-size: ${fontSize.xs}; + color: ${colors.gray[500]}; + font-variant-numeric: tabular-nums; + line-height: ${font.lineHeight.xs}; + align-items: center; + font-weight: ${font.weight.normal}; + text-transform: none; + letter-spacing: normal; `, tabNav: css` display: flex; - border-bottom: 1px solid ${colors.gray[700]}; - background: ${colors.darkGray[600]}; + gap: ${size[1]}; `, tabBtn: css` - flex: 1; - padding: ${size[2]} ${size[3]}; + padding: ${size[1]} ${size[2]}; background: transparent; - border: none; + border: 1px solid ${colors.gray[600]}; + border-radius: ${border.radius.sm}; color: ${colors.gray[400]}; cursor: pointer; - font-size: ${fontSize.sm}; + font-size: ${fontSize.xs}; font-weight: ${font.weight.medium}; &:hover { background: ${colors.darkGray[500]}; + border-color: ${colors.gray[500]}; } `, tabBtnActive: css` background: ${colors.blue[500]}; color: ${colors.white}; + border-color: ${colors.blue[400]}; &:hover { background: ${colors.blue[600]}; + border-color: ${colors.blue[500]}; } `, sidebarContent: css` From d1e00a2580c15cd069518c4e61d00a3dc6c18bf0 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Tue, 15 Jul 2025 14:39:35 +0100 Subject: [PATCH 14/25] refactor --- .../src/BaseTanStackDbDevtoolsPanel.tsx | 358 ++++-------------- .../src/components/CollectionItem.tsx | 32 ++ .../src/components/CollectionStats.tsx | 48 +++ .../src/components/CollectionsPanel.tsx | 102 +++++ .../src/components/DetailsPanel.tsx | 138 +++++++ packages/db-devtools/src/components/Logo.tsx | 18 + .../src/components/TabNavigation.tsx | 46 +++ .../src/components/TransactionItem.tsx | 33 ++ .../src/components/TransactionStats.tsx | 31 ++ .../src/components/TransactionsPanel.tsx | 56 +++ packages/db-devtools/src/components/index.ts | 9 + .../src/contexts/NavigationContext.tsx | 94 +++++ packages/db-devtools/src/contexts/index.tsx | 5 +- packages/db-devtools/src/useStyles.tsx | 3 + packages/db-devtools/src/utils/formatTime.ts | 20 + packages/db-devtools/src/utils/index.ts | 1 + 16 files changed, 702 insertions(+), 292 deletions(-) create mode 100644 packages/db-devtools/src/components/CollectionItem.tsx create mode 100644 packages/db-devtools/src/components/CollectionStats.tsx create mode 100644 packages/db-devtools/src/components/CollectionsPanel.tsx create mode 100644 packages/db-devtools/src/components/DetailsPanel.tsx create mode 100644 packages/db-devtools/src/components/Logo.tsx create mode 100644 packages/db-devtools/src/components/TabNavigation.tsx create mode 100644 packages/db-devtools/src/components/TransactionItem.tsx create mode 100644 packages/db-devtools/src/components/TransactionStats.tsx create mode 100644 packages/db-devtools/src/components/TransactionsPanel.tsx create mode 100644 packages/db-devtools/src/components/index.ts create mode 100644 packages/db-devtools/src/contexts/NavigationContext.tsx create mode 100644 packages/db-devtools/src/utils/formatTime.ts create mode 100644 packages/db-devtools/src/utils/index.ts diff --git a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx index d050a274a..a5da8dce2 100644 --- a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx +++ b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx @@ -1,12 +1,18 @@ import { clsx as cx } from 'clsx' -import { Show, createMemo, createSignal, onMount, For } from 'solid-js' +import { Show, createMemo, onMount, createSignal } from 'solid-js' import { useDevtoolsOnClose } from './contexts' import { useStyles } from './useStyles' import { useLocalStorage } from './useLocalStorage' -import { multiSortBy } from './utils' import { POLLING_INTERVAL_MS } from './constants' +import { + Logo, + CollectionsPanel, + TransactionsPanel, + UnifiedDetailsPanel, + TabNavigation, +} from './components' import type { Accessor, JSX } from 'solid-js' -import type { DbDevtoolsRegistry, CollectionMetadata } from './types' +import type { DbDevtoolsRegistry, CollectionMetadata, TransactionDetails } from './types' export interface BaseDbDevtoolsPanelOptions { /** @@ -39,103 +45,6 @@ export interface BaseDbDevtoolsPanelOptions { shadowDOMTarget?: ShadowRoot } -function Logo(props: any) { - const { className, ...rest } = props - const styles = useStyles() - return ( - - ) -} - -function formatTime(ms: number): string { - if (ms === 0) return '0s' - - const units = ['s', 'min', 'h', 'd'] - const values = [ms / 1000, ms / 60000, ms / 3600000, ms / 86400000] - - let chosenUnitIndex = 0 - for (let i = 1; i < values.length; i++) { - if (values[i]! < 1) break - chosenUnitIndex = i - } - - const formatter = new Intl.NumberFormat(navigator.language, { - compactDisplay: 'short', - notation: 'compact', - maximumFractionDigits: 0, - }) - - return formatter.format(values[chosenUnitIndex]!) + units[chosenUnitIndex] -} - -function CollectionStats({ collection }: { collection: CollectionMetadata }) { - const styles = useStyles() - - if (collection.type === 'collection') { - // Standard collection stats - return ( -
-
{collection.size}
-
/
-
{collection.transactionCount}
-
/
-
{formatTime(collection.gcTime || 0)}
-
/
-
- {collection.status} -
-
- ) - } else { - // Live query collection stats - return ( -
-
{collection.size}
-
/
-
{formatTime(collection.gcTime || 0)}
-
/
-
- {collection.status} -
-
- ) - } -} - -function CollectionItem({ - collection, - isActive, - onSelect, -}: { - collection: CollectionMetadata - isActive: Accessor - onSelect: (collection: CollectionMetadata) => void -}) { - const styles = useStyles() - - return ( -
onSelect(collection)} - > -
{collection.id}
- -
- ) -} - export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel({ ...props }: BaseDbDevtoolsPanelOptions): JSX.Element { @@ -152,34 +61,52 @@ export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel( const styles = useStyles() const { className, style, ...otherPanelProps } = panelProps - const [activeCollectionId, setActiveCollectionId] = useLocalStorage( - 'tanstackDbDevtoolsActiveCollectionId', - '', - ) - + // Simple local state - no navigation store complexity const [selectedView, setSelectedView] = createSignal<'collections' | 'transactions'>('collections') + const [activeCollectionId, setActiveCollectionId] = useLocalStorage('tanstackDbDevtoolsActiveCollectionId', '') const [selectedTransaction, setSelectedTransaction] = createSignal(null) - const [collections, setCollections] = createSignal([]) + const [transactions, setTransactions] = createSignal([]) + + // Computed values + const activeCollection = createMemo(() => { + const found = collections().find(c => c.id === activeCollectionId()) + return found + }) + + const activeTransaction = createMemo(() => { + const found = transactions().find(t => t.id === selectedTransaction()) + return found + }) - // Poll for collections data + // Poll for collections and transactions data onMount(() => { - const updateCollections = () => { + const updateData = () => { if (typeof window === 'undefined') return try { + // Update collections const newCollections = registry().getAllCollectionMetadata() const currentCollections = collections() // Only update if collections data actually changed if (hasCollectionsChanged(currentCollections, newCollections)) { setCollections(newCollections) + + // Simple auto-selection: if no collection is selected and we have collections, select the first one + if (activeCollectionId() === '' && newCollections.length > 0) { + setActiveCollectionId(newCollections[0]?.id ?? '') + } } + + // Update transactions + const newTransactions = registry().getTransactions() + setTransactions(newTransactions) } catch (error) { - // Silently handle errors when fetching collections metadata + console.error('Error updating collections:', error) } } - updateCollections() - const intervalId = setInterval(updateCollections, POLLING_INTERVAL_MS) + updateData() + const intervalId = setInterval(updateData, POLLING_INTERVAL_MS) return () => clearInterval(intervalId) }) @@ -210,45 +137,6 @@ export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel( return false } - // --- Fix: Ensure selection is always valid and highlight updates instantly --- - // If the selected collection disappears, auto-select the first available one - createMemo(() => { - const ids = collections().map(c => c.id) - if (ids.length === 0) { - setActiveCollectionId('') // always a string - return - } - if (!ids.includes(activeCollectionId())) { - setActiveCollectionId(ids[0] ?? '') - } - }) - // --- End fix --- - - const activeCollection = createMemo(() => { - const active = collections().find(c => c.id === activeCollectionId()) - return active || collections()[0] - }) - - const sortedCollections = createMemo(() => { - return multiSortBy( - collections(), - [ - (c) => c.status === 'error' ? 0 : 1, // Errors first - (c) => c.id.toLowerCase(), // Then alphabetically by ID - ] - ) - }) - - // Group collections by type - const standardCollections = createMemo(() => - sortedCollections().filter(c => c.type === 'collection') - ) - - const liveCollections = createMemo(() => - sortedCollections().filter(c => c.type === 'live-query') - ) - - return (
- {/* Tab Navigation */} -
- - -
+ collections().length} + transactionsCount={() => transactions().length} + onSelectView={setSelectedView} + />
{/* Content based on selected view */}
-
-
- 0} - fallback={ -
- No collections found -
- } - > - {/* Standard Collections */} - 0}> -
-
-
Standard Collections ({standardCollections().length})
-
- Items - / - Txn - / - GC - / - Status -
-
- {(collection) => - collection.id === activeCollectionId()} - onSelect={(c) => setActiveCollectionId(c.id)} - /> - } -
-
- - {/* Live Collections */} - 0}> -
-
-
Live Collections ({liveCollections().length})
-
- Items - / - GC - / - Status -
-
- {(collection) => - collection.id === activeCollectionId()} - onSelect={(c) => setActiveCollectionId(c.id)} - /> - } -
-
-
-
-
+ setActiveCollectionId(c.id)} + />
-
-
-
Transactions ({registry().getTransactions().length})
-
- -
- 0} - fallback={ -
- No transactions found -
- } - > - {registry().getTransactions().map((transaction) => ( -
setSelectedTransaction(transaction.id)} - > -
- Transaction {transaction.id.slice(0, 8)}... -
-
- {transaction.mutations.length} mutations -
-
- {transaction.state} -
-
- ))} -
-
-
+
- -
- Select a collection to view details -
-
- } - > - {(collection) => ( -
-
- {collection().id} -
-
-
{JSON.stringify(collection(), null, 2)}
-
-
- )} - + {(() => { + // If these are placed directly in the attributes it breaks navigation + const currentSelectedView = selectedView() + const currentActiveCollection = activeCollection() + const currentActiveTransaction = activeTransaction() + return ( + + ) + })()}
) diff --git a/packages/db-devtools/src/components/CollectionItem.tsx b/packages/db-devtools/src/components/CollectionItem.tsx new file mode 100644 index 000000000..4fdb46093 --- /dev/null +++ b/packages/db-devtools/src/components/CollectionItem.tsx @@ -0,0 +1,32 @@ +import { clsx as cx } from 'clsx' +import { useStyles } from '../useStyles' +import { CollectionStats } from './CollectionStats' +import type { Accessor } from 'solid-js' +import type { CollectionMetadata } from '../types' + +interface CollectionItemProps { + collection: CollectionMetadata + isActive: Accessor + onSelect: (collection: CollectionMetadata) => void +} + +export function CollectionItem({ + collection, + isActive, + onSelect, +}: CollectionItemProps) { + const styles = useStyles() + + return ( +
onSelect(collection)} + > +
{collection.id}
+ +
+ ) +} \ No newline at end of file diff --git a/packages/db-devtools/src/components/CollectionStats.tsx b/packages/db-devtools/src/components/CollectionStats.tsx new file mode 100644 index 000000000..42e3b241a --- /dev/null +++ b/packages/db-devtools/src/components/CollectionStats.tsx @@ -0,0 +1,48 @@ +import { clsx as cx } from 'clsx' +import { useStyles } from '../useStyles' +import { formatTime } from '../utils/formatTime' +import type { CollectionMetadata } from '../types' + +interface CollectionStatsProps { + collection: CollectionMetadata +} + +export function CollectionStats({ collection }: CollectionStatsProps) { + const styles = useStyles() + + if (collection.type === 'collection') { + // Standard collection stats + return ( +
+
{collection.size}
+
/
+
{collection.transactionCount}
+
/
+
{formatTime(collection.gcTime || 0)}
+
/
+
+ {collection.status} +
+
+ ) + } else { + // Live query collection stats + return ( +
+
{collection.size}
+
/
+
{formatTime(collection.gcTime || 0)}
+
/
+
+ {collection.status} +
+
+ ) + } +} \ No newline at end of file diff --git a/packages/db-devtools/src/components/CollectionsPanel.tsx b/packages/db-devtools/src/components/CollectionsPanel.tsx new file mode 100644 index 000000000..fc4e1dd0e --- /dev/null +++ b/packages/db-devtools/src/components/CollectionsPanel.tsx @@ -0,0 +1,102 @@ +import { Show, For, createMemo } from 'solid-js' +import { useStyles } from '../useStyles' +import { CollectionItem } from './CollectionItem' +import { multiSortBy } from '../utils' +import type { Accessor } from 'solid-js' +import type { CollectionMetadata } from '../types' + +interface CollectionsPanelProps { + collections: Accessor + activeCollectionId: Accessor + onSelectCollection: (collection: CollectionMetadata) => void +} + +export function CollectionsPanel({ + collections, + activeCollectionId, + onSelectCollection, +}: CollectionsPanelProps) { + const styles = useStyles() + + const sortedCollections = createMemo(() => { + return multiSortBy( + collections(), + [ + (c) => c.status === 'error' ? 0 : 1, // Errors first + (c) => c.id.toLowerCase(), // Then alphabetically by ID + ] + ) + }) + + // Group collections by type + const standardCollections = createMemo(() => + sortedCollections().filter(c => c.type === 'collection') + ) + + const liveCollections = createMemo(() => + sortedCollections().filter(c => c.type === 'live-query') + ) + + return ( +
+
+ 0} + fallback={ +
+ No collections found +
+ } + > + {/* Standard Collections */} + 0}> +
+
+
Standard Collections ({standardCollections().length})
+
+ Items + / + Txn + / + GC + / + Status +
+
+ {(collection) => + collection.id === activeCollectionId()} + onSelect={onSelectCollection} + /> + } +
+
+ + {/* Live Collections */} + 0}> +
+
+
Live Collections ({liveCollections().length})
+
+ Items + / + GC + / + Status +
+
+ {(collection) => + collection.id === activeCollectionId()} + onSelect={onSelectCollection} + /> + } +
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/packages/db-devtools/src/components/DetailsPanel.tsx b/packages/db-devtools/src/components/DetailsPanel.tsx new file mode 100644 index 000000000..c2a8c6b69 --- /dev/null +++ b/packages/db-devtools/src/components/DetailsPanel.tsx @@ -0,0 +1,138 @@ +import { Show } from 'solid-js' +import { useStyles } from '../useStyles' +import type { CollectionMetadata, TransactionDetails } from '../types' + +interface DetailsPanelProps { + selectedView: 'collections' | 'transactions' + activeCollection?: CollectionMetadata + activeTransaction?: TransactionDetails +} + +export function DetailsPanel({ + selectedView, + activeCollection, + activeTransaction, +}: DetailsPanelProps) { + const styles = useStyles() + + return ( + + +
+ Select a collection to view details +
+
+ } + > + {(collection) => ( +
+
+ {collection().id} +
+
+
{JSON.stringify(collection(), null, 2)}
+
+
+ )} + + + ) +} + +export function TransactionDetailsPanel({ + selectedView, + activeTransaction, +}: DetailsPanelProps) { + const styles = useStyles() + + return ( + + +
+ Select a transaction to view details +
+
+ } + > + {(transaction) => ( +
+
+ Transaction {transaction().id} +
+
+
{JSON.stringify(transaction(), null, 2)}
+
+
+ )} + + + ) +} + +export function UnifiedDetailsPanel({ + selectedView, + activeCollection, + activeTransaction, +}: DetailsPanelProps) { + const styles = useStyles() + + // Simple conditional rendering + if (selectedView === 'collections') { + if (activeCollection) { + return ( +
+
+ {activeCollection.id} +
+
+
{JSON.stringify(activeCollection, null, 2)}
+
+
+ ) + } else { + return ( +
+
+ Select a collection to view details +
+
+ ) + } + } else if (selectedView === 'transactions') { + if (activeTransaction) { + return ( +
+
+ Transaction {activeTransaction.id} +
+
+
{JSON.stringify(activeTransaction, null, 2)}
+
+
+ ) + } else { + return ( +
+
+ Select a transaction to view details +
+
+ ) + } + } + + // Fallback + return ( +
+
+ Unknown view: {selectedView} +
+
+ ) +} \ No newline at end of file diff --git a/packages/db-devtools/src/components/Logo.tsx b/packages/db-devtools/src/components/Logo.tsx new file mode 100644 index 000000000..8ca3cba7e --- /dev/null +++ b/packages/db-devtools/src/components/Logo.tsx @@ -0,0 +1,18 @@ +import { clsx as cx } from 'clsx' +import { useStyles } from '../useStyles' + +interface LogoProps { + className?: () => string + [key: string]: any +} + +export function Logo(props: LogoProps) { + const { className, ...rest } = props + const styles = useStyles() + return ( + + ) +} \ No newline at end of file diff --git a/packages/db-devtools/src/components/TabNavigation.tsx b/packages/db-devtools/src/components/TabNavigation.tsx new file mode 100644 index 000000000..e7309bc6c --- /dev/null +++ b/packages/db-devtools/src/components/TabNavigation.tsx @@ -0,0 +1,46 @@ +import { clsx as cx } from 'clsx' +import { useStyles } from '../useStyles' +import type { Accessor } from 'solid-js' + +interface TabNavigationProps { + selectedView: Accessor<'collections' | 'transactions'> + collectionsCount: Accessor + transactionsCount: Accessor + onSelectView: (view: 'collections' | 'transactions') => void +} + +export function TabNavigation({ + selectedView, + collectionsCount, + transactionsCount, + onSelectView, +}: TabNavigationProps) { + const styles = useStyles() + + return ( +
+ + +
+ ) +} \ No newline at end of file diff --git a/packages/db-devtools/src/components/TransactionItem.tsx b/packages/db-devtools/src/components/TransactionItem.tsx new file mode 100644 index 000000000..c413495fd --- /dev/null +++ b/packages/db-devtools/src/components/TransactionItem.tsx @@ -0,0 +1,33 @@ +import { clsx as cx } from 'clsx' +import { useStyles } from '../useStyles' +import { TransactionStats } from './TransactionStats' +import type { TransactionDetails } from '../types' + +interface TransactionItemProps { + transaction: TransactionDetails + isActive: boolean + onSelect: (transactionId: string) => void +} + +export function TransactionItem({ + transaction, + isActive, + onSelect, +}: TransactionItemProps) { + const styles = useStyles() + + return ( +
onSelect(transaction.id)} + > +
+ {transaction.id} +
+ +
+ ) +} \ No newline at end of file diff --git a/packages/db-devtools/src/components/TransactionStats.tsx b/packages/db-devtools/src/components/TransactionStats.tsx new file mode 100644 index 000000000..5f47ca521 --- /dev/null +++ b/packages/db-devtools/src/components/TransactionStats.tsx @@ -0,0 +1,31 @@ +import { clsx as cx } from 'clsx' +import { useStyles } from '../useStyles' +import { formatTime } from '../utils/formatTime' +import type { TransactionDetails } from '../types' + +interface TransactionStatsProps { + transaction: TransactionDetails +} + +export function TransactionStats({ transaction }: TransactionStatsProps) { + const styles = useStyles() + + const age = Date.now() - transaction.createdAt.getTime() + + return ( +
+
{transaction.mutations.length}
+
/
+
1
+
/
+
{formatTime(age)}
+
/
+
+ {transaction.state} +
+
+ ) +} \ No newline at end of file diff --git a/packages/db-devtools/src/components/TransactionsPanel.tsx b/packages/db-devtools/src/components/TransactionsPanel.tsx new file mode 100644 index 000000000..4d6634936 --- /dev/null +++ b/packages/db-devtools/src/components/TransactionsPanel.tsx @@ -0,0 +1,56 @@ +import { Show, For } from 'solid-js' +import { useStyles } from '../useStyles' +import { TransactionItem } from './TransactionItem' +import type { Accessor } from 'solid-js' +import type { TransactionDetails } from '../types' + +interface TransactionsPanelProps { + transactions: Accessor + selectedTransaction: Accessor + onSelectTransaction: (transactionId: string) => void +} + +export function TransactionsPanel({ + transactions, + selectedTransaction, + onSelectTransaction, +}: TransactionsPanelProps) { + const styles = useStyles() + + return ( +
+
+
+
+
Transactions
+
+ Mutations + / + Collections + / + Age + / + Status +
+
+ 0} + fallback={ +
+ No transactions found +
+ } + > + {(transaction) => ( + + )} +
+
+
+
+ ) +} \ No newline at end of file diff --git a/packages/db-devtools/src/components/index.ts b/packages/db-devtools/src/components/index.ts new file mode 100644 index 000000000..f3d857d8a --- /dev/null +++ b/packages/db-devtools/src/components/index.ts @@ -0,0 +1,9 @@ +export { Logo } from './Logo' +export { CollectionStats } from './CollectionStats' +export { TransactionStats } from './TransactionStats' +export { CollectionItem } from './CollectionItem' +export { TransactionItem } from './TransactionItem' +export { CollectionsPanel } from './CollectionsPanel' +export { TransactionsPanel } from './TransactionsPanel' +export { DetailsPanel, TransactionDetailsPanel, UnifiedDetailsPanel } from './DetailsPanel' +export { TabNavigation } from './TabNavigation' \ No newline at end of file diff --git a/packages/db-devtools/src/contexts/NavigationContext.tsx b/packages/db-devtools/src/contexts/NavigationContext.tsx new file mode 100644 index 000000000..1cb023273 --- /dev/null +++ b/packages/db-devtools/src/contexts/NavigationContext.tsx @@ -0,0 +1,94 @@ +import { createContext, createSignal, useContext, type Accessor, type Setter } from 'solid-js' +import type { CollectionMetadata, TransactionDetails } from '../types' + +export interface NavigationState { + selectedView: Accessor<'collections' | 'transactions'> + setSelectedView: Setter<'collections' | 'transactions'> + activeCollectionId: Accessor + setActiveCollectionId: Setter + selectedTransaction: Accessor + setSelectedTransaction: Setter + activeCollection: Accessor + activeTransaction: Accessor + collections: Accessor + setCollections: Setter + transactions: Accessor + setTransactions: Setter +} + +const NavigationContext = createContext() + +export function createNavigationStore(): NavigationState { + const [selectedView, setSelectedView] = createSignal<'collections' | 'transactions'>('collections') + const [activeCollectionId, setActiveCollectionId] = createSignal('') + const [selectedTransaction, setSelectedTransaction] = createSignal(null) + + // These will be set by the parent component + const [collections, setCollections] = createSignal([]) + const [transactions, setTransactions] = createSignal([]) + + const activeCollection = () => { + const active = collections().find(c => c.id === activeCollectionId()) + return active + } + + const activeTransaction = () => { + const active = transactions().find(t => t.id === selectedTransaction()) + return active + } + + // Debug logging + const debugSetSelectedView: Setter<'collections' | 'transactions'> = (value) => { + setSelectedView(value) + } + + const debugSetActiveCollectionId: Setter = (value) => { + setActiveCollectionId(value) + } + + const debugSetSelectedTransaction: Setter = (value) => { + setSelectedTransaction(value) + } + + const debugSetCollections: Setter = (value) => { + setCollections(value) + } + + const debugSetTransactions: Setter = (value) => { + setTransactions(value) + } + + const store: NavigationState = { + selectedView, + setSelectedView: debugSetSelectedView, + activeCollectionId, + setActiveCollectionId: debugSetActiveCollectionId, + selectedTransaction, + setSelectedTransaction: debugSetSelectedTransaction, + activeCollection, + activeTransaction, + // Internal state setters for parent component + collections, + setCollections: debugSetCollections, + transactions, + setTransactions: debugSetTransactions, + } + + return store +} + +export function useNavigation() { + const context = useContext(NavigationContext) + if (!context) { + throw new Error('useNavigation must be used within a NavigationProvider') + } + return context +} + +export function NavigationProvider(props: { children: any; store: NavigationState }) { + return ( + + {props.children} + + ) +} \ No newline at end of file diff --git a/packages/db-devtools/src/contexts/index.tsx b/packages/db-devtools/src/contexts/index.tsx index 5ff3fbaff..5737bd95e 100644 --- a/packages/db-devtools/src/contexts/index.tsx +++ b/packages/db-devtools/src/contexts/index.tsx @@ -8,4 +8,7 @@ export const DevtoolsOnCloseContext = createContext<{ onCloseClick: (e: any) => export const useDevtoolsOnClose = () => useContext(DevtoolsOnCloseContext) // Shadow DOM Target Context - matches Router devtools pattern -export const ShadowDomTargetContext = createContext(undefined) \ No newline at end of file +export const ShadowDomTargetContext = createContext(undefined) + +// Navigation Context +export * from './NavigationContext' \ No newline at end of file diff --git a/packages/db-devtools/src/useStyles.tsx b/packages/db-devtools/src/useStyles.tsx index f8108ffe9..67a931147 100644 --- a/packages/db-devtools/src/useStyles.tsx +++ b/packages/db-devtools/src/useStyles.tsx @@ -300,6 +300,9 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { font-weight: ${font.weight.medium}; color: ${colors.gray[200]}; flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; `, collectionStatus: css` font-size: ${fontSize.xs}; diff --git a/packages/db-devtools/src/utils/formatTime.ts b/packages/db-devtools/src/utils/formatTime.ts new file mode 100644 index 000000000..7b74d8bdf --- /dev/null +++ b/packages/db-devtools/src/utils/formatTime.ts @@ -0,0 +1,20 @@ +export function formatTime(ms: number): string { + if (ms === 0) return '0s' + + const units = ['s', 'min', 'h', 'd'] + const values = [ms / 1000, ms / 60000, ms / 3600000, ms / 86400000] + + let chosenUnitIndex = 0 + for (let i = 1; i < values.length; i++) { + if (values[i]! < 1) break + chosenUnitIndex = i + } + + const formatter = new Intl.NumberFormat(navigator.language, { + compactDisplay: 'short', + notation: 'compact', + maximumFractionDigits: 0, + }) + + return formatter.format(values[chosenUnitIndex]!) + units[chosenUnitIndex] +} \ No newline at end of file diff --git a/packages/db-devtools/src/utils/index.ts b/packages/db-devtools/src/utils/index.ts new file mode 100644 index 000000000..f3cdbea4c --- /dev/null +++ b/packages/db-devtools/src/utils/index.ts @@ -0,0 +1 @@ +export { formatTime } from './formatTime' \ No newline at end of file From cddceff164ad419a077b831a1e3553a4d9a55e20 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Tue, 15 Jul 2025 15:34:22 +0100 Subject: [PATCH 15/25] wip --- examples/react/todo/src/lib/collections.ts | 10 +- packages/db-devtools/eslint.config.js | 46 +- packages/db-devtools/package.json | 1 + .../src/BaseTanStackDbDevtoolsPanel.tsx | 438 +++++++++-------- .../src/FloatingTanStackDbDevtools.tsx | 88 ++-- .../db-devtools/src/TanstackDbDevtools.tsx | 50 +- .../src/components/CollectionItem.tsx | 16 +- .../src/components/CollectionStats.tsx | 34 +- .../src/components/CollectionsPanel.tsx | 71 +-- .../src/components/DetailsPanel.tsx | 154 +++--- .../db-devtools/src/components/Explorer.tsx | 351 ++++++++++++++ packages/db-devtools/src/components/Logo.tsx | 8 +- .../src/components/TabNavigation.tsx | 20 +- .../src/components/TransactionItem.tsx | 16 +- .../src/components/TransactionStats.tsx | 24 +- .../src/components/TransactionsPanel.tsx | 32 +- packages/db-devtools/src/components/index.ts | 22 +- packages/db-devtools/src/constants.ts | 27 +- .../src/contexts/NavigationContext.tsx | 58 ++- packages/db-devtools/src/contexts/index.tsx | 12 +- packages/db-devtools/src/devtools.ts | 34 +- packages/db-devtools/src/index.ts | 11 +- packages/db-devtools/src/logo.tsx | 2 +- packages/db-devtools/src/registry.ts | 26 +- packages/db-devtools/src/tokens.ts | 440 +++++++++--------- packages/db-devtools/src/useLocalStorage.ts | 23 +- packages/db-devtools/src/useStyles.tsx | 50 +- packages/db-devtools/src/utils.tsx | 83 ++-- packages/db-devtools/src/utils/formatTime.ts | 12 +- packages/db-devtools/src/utils/index.ts | 2 +- packages/db-devtools/tsup.config.ts | 18 +- packages/db-devtools/vite.config.ts | 26 +- packages/db/src/collection.ts | 13 +- packages/react-db-devtools/package.json | 1 + .../react-db-devtools/src/ReactDbDevtools.tsx | 30 +- packages/react-db-devtools/src/index.ts | 29 +- packages/react-db-devtools/tsup.config.ts | 30 +- 37 files changed, 1413 insertions(+), 895 deletions(-) create mode 100644 packages/db-devtools/src/components/Explorer.tsx diff --git a/examples/react/todo/src/lib/collections.ts b/examples/react/todo/src/lib/collections.ts index 8f7e886c6..343d36cf1 100644 --- a/examples/react/todo/src/lib/collections.ts +++ b/examples/react/todo/src/lib/collections.ts @@ -17,7 +17,7 @@ initializeDbDevtools() // Electric Todo Collection export const electricTodoCollection = createCollection( electricCollectionOptions({ - id: `todos`, + id: `electric-todos`, shapeOptions: { url: `http://localhost:3003/v1/shape`, params: { @@ -65,7 +65,7 @@ export const electricTodoCollection = createCollection( // Query Todo Collection export const queryTodoCollection = createCollection( queryCollectionOptions({ - id: `todos`, + id: `query-todos`, queryKey: [`todos`], refetchInterval: 3000, queryFn: async () => { @@ -110,7 +110,7 @@ export const queryTodoCollection = createCollection( // Electric Config Collection export const electricConfigCollection = createCollection( electricCollectionOptions({ - id: `config`, + id: `electric-config`, shapeOptions: { url: `http://localhost:3003/v1/shape`, params: { @@ -143,7 +143,7 @@ export const electricConfigCollection = createCollection( // Query Config Collection export const queryConfigCollection = createCollection( queryCollectionOptions({ - id: `config`, + id: `query-config`, queryKey: [`config`], refetchInterval: 3000, queryFn: async () => { @@ -174,5 +174,3 @@ export const queryConfigCollection = createCollection( }, }) ) - - diff --git a/packages/db-devtools/eslint.config.js b/packages/db-devtools/eslint.config.js index abeeb6348..0c7505c86 100644 --- a/packages/db-devtools/eslint.config.js +++ b/packages/db-devtools/eslint.config.js @@ -1,23 +1,33 @@ +import prettierPlugin from "eslint-plugin-prettier" +import prettierConfig from "eslint-config-prettier" +import stylisticPlugin from "@stylistic/eslint-plugin" +import { tanstackConfig } from "@tanstack/config/eslint" + export default [ + ...tanstackConfig, + { ignores: [`dist/`, 'build/**', 'coverage/**', 'eslint.config.js'] }, { - ignores: ['build/**', 'dist/**', 'node_modules/**', 'coverage/**'] - }, - { - files: ['src/**/*.{ts,tsx}'], - languageOptions: { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - ecmaFeatures: { - jsx: true - } - } + plugins: { + stylistic: stylisticPlugin, + prettier: prettierPlugin, }, rules: { - 'no-console': 'warn', - 'no-unused-vars': 'warn', - '@typescript-eslint/no-unused-vars': 'warn' - } - } + "prettier/prettier": `error`, + "stylistic/quotes": [`error`, `backtick`], + ...prettierConfig.rules, + "no-console": "warn", + "@typescript-eslint/no-unused-vars": [ + `error`, + { argsIgnorePattern: `^_`, varsIgnorePattern: `^_` }, + ], + "@typescript-eslint/naming-convention": [ + "error", + { + selector: "typeParameter", + format: ["PascalCase"], + leadingUnderscore: `allow`, + }, + ], + }, + }, ] \ No newline at end of file diff --git a/packages/db-devtools/package.json b/packages/db-devtools/package.json index 23330d39a..c04c67c58 100644 --- a/packages/db-devtools/package.json +++ b/packages/db-devtools/package.json @@ -70,6 +70,7 @@ "test:lib": "vitest", "test:lib:dev": "pnpm run test:lib --watch", "test:build": "publint --strict && attw --pack", + "lint": "eslint . --fix", "build": "vite build", "build:dev": "tsup --watch" }, diff --git a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx index a5da8dce2..a5cad2fb6 100644 --- a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx +++ b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx @@ -1,18 +1,22 @@ -import { clsx as cx } from 'clsx' -import { Show, createMemo, onMount, createSignal } from 'solid-js' -import { useDevtoolsOnClose } from './contexts' -import { useStyles } from './useStyles' -import { useLocalStorage } from './useLocalStorage' -import { POLLING_INTERVAL_MS } from './constants' +import { clsx as cx } from "clsx" +import { Show, createMemo, createSignal, onMount } from "solid-js" +import { useDevtoolsOnClose } from "./contexts" +import { useStyles } from "./useStyles" +import { useLocalStorage } from "./useLocalStorage" +import { POLLING_INTERVAL_MS } from "./constants" import { - Logo, CollectionsPanel, + Logo, + TabNavigation, TransactionsPanel, UnifiedDetailsPanel, - TabNavigation, -} from './components' -import type { Accessor, JSX } from 'solid-js' -import type { DbDevtoolsRegistry, CollectionMetadata, TransactionDetails } from './types' +} from "./components" +import type { Accessor, JSX } from "solid-js" +import type { + CollectionMetadata, + DbDevtoolsRegistry, + TransactionDetails, +} from "./types" export interface BaseDbDevtoolsPanelOptions { /** @@ -45,190 +49,260 @@ export interface BaseDbDevtoolsPanelOptions { shadowDOMTarget?: ShadowRoot } -export const BaseTanStackDbDevtoolsPanel = function BaseTanStackDbDevtoolsPanel({ - ...props -}: BaseDbDevtoolsPanelOptions): JSX.Element { - const { - isOpen = true, - setIsOpen, - handleDragStart, - registry, - shadowDOMTarget, - ...panelProps - } = props - - const { onCloseClick } = useDevtoolsOnClose() - const styles = useStyles() - const { className, style, ...otherPanelProps } = panelProps - - // Simple local state - no navigation store complexity - const [selectedView, setSelectedView] = createSignal<'collections' | 'transactions'>('collections') - const [activeCollectionId, setActiveCollectionId] = useLocalStorage('tanstackDbDevtoolsActiveCollectionId', '') - const [selectedTransaction, setSelectedTransaction] = createSignal(null) - const [collections, setCollections] = createSignal([]) - const [transactions, setTransactions] = createSignal([]) - - // Computed values - const activeCollection = createMemo(() => { - const found = collections().find(c => c.id === activeCollectionId()) - return found - }) - - const activeTransaction = createMemo(() => { - const found = transactions().find(t => t.id === selectedTransaction()) - return found - }) - - // Poll for collections and transactions data - onMount(() => { - const updateData = () => { - if (typeof window === 'undefined') return - try { - // Update collections - const newCollections = registry().getAllCollectionMetadata() - const currentCollections = collections() - - // Only update if collections data actually changed - if (hasCollectionsChanged(currentCollections, newCollections)) { - setCollections(newCollections) - - // Simple auto-selection: if no collection is selected and we have collections, select the first one - if (activeCollectionId() === '' && newCollections.length > 0) { - setActiveCollectionId(newCollections[0]?.id ?? '') +export const BaseTanStackDbDevtoolsPanel = + function BaseTanStackDbDevtoolsPanel({ + ...props + }: BaseDbDevtoolsPanelOptions): JSX.Element { + const { setIsOpen, handleDragStart, registry, ...panelProps } = props + + const { onCloseClick } = useDevtoolsOnClose() + const styles = useStyles() + const { className, style, ...otherPanelProps } = panelProps + + // Simple local state - no navigation store complexity + const [selectedView, setSelectedView] = createSignal< + `collections` | `transactions` + >(`collections`) + const [activeCollectionId, setActiveCollectionId] = useLocalStorage( + `tanstackDbDevtoolsActiveCollectionId`, + `` + ) + const [selectedTransaction, setSelectedTransaction] = createSignal< + string | null + >(null) + const [collections, setCollections] = createSignal< + Array + >([]) + const [transactions, setTransactions] = createSignal< + Array + >([]) + + // Computed values + const activeCollection = createMemo(() => { + const found = collections().find((c) => c.id === activeCollectionId()) + return found + }) + + const activeTransaction = createMemo(() => { + const found = transactions().find((t) => t.id === selectedTransaction()) + return found + }) + + // Poll for collections and transactions data + onMount(() => { + const updateData = () => { + if (typeof window === `undefined`) return + try { + // Update collections + const newCollections = registry().getAllCollectionMetadata() + const currentCollections = collections() + + // Only update if collections data actually changed + if (hasCollectionsChanged(currentCollections, newCollections)) { + // Patch/update instead of replace: preserve references for unchanged collections + setCollections((prev) => + newCollections.map((newCol) => { + const oldCol = prev.find((c) => c.id === newCol.id) + if ( + oldCol && + oldCol.status === newCol.status && + oldCol.size === newCol.size && + oldCol.hasTransactions === newCol.hasTransactions && + oldCol.transactionCount === newCol.transactionCount && + oldCol.type === newCol.type && + oldCol.gcTime === newCol.gcTime + // Note: We intentionally ignore lastUpdated since it changes on every poll + ) { + return oldCol // preserve reference + } else { + return newCol // use new object if changed + } + }) + ) + // Simple auto-selection: if no collection is selected and we have collections, select the first one + if (activeCollectionId() === `` && newCollections.length > 0) { + setActiveCollectionId(newCollections[0]?.id ?? ``) + } } + + // Update transactions + const newTransactions = registry().getTransactions() + const currentTransactions = transactions() + + // Only update if transactions data actually changed + if (hasTransactionsChanged(currentTransactions, newTransactions)) { + // Patch/update instead of replace: preserve references for unchanged transactions + setTransactions((prev) => + newTransactions.map((newTx) => { + const oldTx = prev.find((t) => t.id === newTx.id) + if ( + oldTx && + oldTx.state === newTx.state && + oldTx.isPersisted === newTx.isPersisted && + oldTx.mutations.length === newTx.mutations.length && + oldTx.collectionId === newTx.collectionId + // Note: We intentionally ignore updatedAt since it might change + ) { + return oldTx // preserve reference + } else { + return newTx // use new object if changed + } + }) + ) + } + } catch { + // console.error(`Error updating collections:`, error) } + } + updateData() + const intervalId = setInterval(updateData, POLLING_INTERVAL_MS) + return () => clearInterval(intervalId) + }) + + // Helper function to detect if collections data actually changed + const hasCollectionsChanged = ( + oldCollections: Array, + newCollections: Array + ): boolean => { + if (oldCollections.length !== newCollections.length) return true + + // Create maps for O(1) lookup by ID + const oldMap = new Map(oldCollections.map((c) => [c.id, c])) + const newMap = new Map(newCollections.map((c) => [c.id, c])) - // Update transactions - const newTransactions = registry().getTransactions() - setTransactions(newTransactions) - } catch (error) { - console.error('Error updating collections:', error) + // Check if any collection data changed by comparing by ID + for (const [id, old] of oldMap) { + const new_ = newMap.get(id) + if (!new_) return true // Collection was removed + + if (old.status !== new_.status) return true + if (old.size !== new_.size) return true + if (old.hasTransactions !== new_.hasTransactions) return true + if (old.transactionCount !== new_.transactionCount) return true } + + // Check if any new collections were added + for (const [id] of newMap) { + if (!oldMap.has(id)) return true + } + + return false } - updateData() - const intervalId = setInterval(updateData, POLLING_INTERVAL_MS) - return () => clearInterval(intervalId) - }) - - // Helper function to detect if collections data actually changed - const hasCollectionsChanged = (oldCollections: CollectionMetadata[], newCollections: CollectionMetadata[]): boolean => { - if (oldCollections.length !== newCollections.length) return true - - // Create maps for O(1) lookup by ID - const oldMap = new Map(oldCollections.map(c => [c.id, c])) - const newMap = new Map(newCollections.map(c => [c.id, c])) - - // Check if any collection data changed by comparing by ID - for (const [id, old] of oldMap) { - const new_ = newMap.get(id) - if (!new_) return true // Collection was removed - - if (old.status !== new_.status) return true - if (old.size !== new_.size) return true - if (old.hasTransactions !== new_.hasTransactions) return true - if (old.transactionCount !== new_.transactionCount) return true - } - - // Check if any new collections were added - for (const [id] of newMap) { - if (!oldMap.has(id)) return true + + // Helper function to detect if transactions data actually changed + const hasTransactionsChanged = ( + oldTransactions: Array, + newTransactions: Array + ): boolean => { + if (oldTransactions.length !== newTransactions.length) return true + + // Create maps for O(1) lookup by ID + const oldMap = new Map(oldTransactions.map((t) => [t.id, t])) + const newMap = new Map(newTransactions.map((t) => [t.id, t])) + + // Check if any transaction data changed by comparing by ID + for (const [id, old] of oldMap) { + const new_ = newMap.get(id) + if (!new_) return true // Transaction was removed + + if (old.state !== new_.state) return true + if (old.isPersisted !== new_.isPersisted) return true + if (old.mutations.length !== new_.mutations.length) return true + if (old.collectionId !== new_.collectionId) return true + } + + // Check if any new transactions were added + for (const [id] of newMap) { + if (!oldMap.has(id)) return true + } + + return false } - - return false - } - return ( -
- {handleDragStart ? ( -
- ) : null} - - - -
-
-
- - collections().length} - transactionsCount={() => transactions().length} - onSelectView={setSelectedView} - /> -
-
-
- {/* Content based on selected view */} -
- - setActiveCollectionId(c.id)} - /> - + + + + - - +
+
+ + collections().length} + transactionsCount={() => transactions().length} + onSelectView={setSelectedView} /> - +
+
+
+ {/* Content based on selected view */} +
+ + setActiveCollectionId(c.id)} + /> + + + + + +
-
-
- {(() => { - // If these are placed directly in the attributes it breaks navigation - const currentSelectedView = selectedView() - const currentActiveCollection = activeCollection() - const currentActiveTransaction = activeTransaction() - return ( - - ) - })()} +
+ +
-
- ) -} + ) + } -export default BaseTanStackDbDevtoolsPanel \ No newline at end of file +export default BaseTanStackDbDevtoolsPanel diff --git a/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx b/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx index a7e692f6c..7dc489d8a 100644 --- a/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx +++ b/packages/db-devtools/src/FloatingTanStackDbDevtools.tsx @@ -1,13 +1,13 @@ -import { clsx as cx } from 'clsx' -import { createEffect, createMemo, createSignal } from 'solid-js' -import { Dynamic } from 'solid-js/web' -import { DevtoolsOnCloseContext } from './contexts' -import { BaseTanStackDbDevtoolsPanel } from './BaseTanStackDbDevtoolsPanel' -import { useLocalStorage } from './useLocalStorage' -import { TanStackLogo } from './logo' -import { useStyles } from './useStyles' -import type { Accessor, JSX } from 'solid-js' -import type { DbDevtoolsRegistry } from './types' +import { clsx as cx } from "clsx" +import { createEffect, createMemo, createSignal } from "solid-js" +import { Dynamic } from "solid-js/web" +import { DevtoolsOnCloseContext } from "./contexts" +import { BaseTanStackDbDevtoolsPanel } from "./BaseTanStackDbDevtoolsPanel" +import { useLocalStorage } from "./useLocalStorage" +import { TanStackLogo } from "./logo" +import { useStyles } from "./useStyles" +import type { Accessor, JSX } from "solid-js" +import type { DbDevtoolsRegistry } from "./types" export interface FloatingDbDevtoolsOptions { /** @@ -36,7 +36,7 @@ export interface FloatingDbDevtoolsOptions { * The position of the TanStack DB logo to open and close the devtools panel. * Defaults to 'bottom-left'. */ - position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + position?: `top-left` | `top-right` | `bottom-left` | `bottom-right` /** * Use this to render the devtools inside a different type of container element for a11y purposes. * Any string which corresponds to a valid intrinsic JSX element is allowed. @@ -58,8 +58,8 @@ export function FloatingTanStackDbDevtools({ panelProps = {}, closeButtonProps = {}, toggleButtonProps = {}, - position = 'bottom-left', - containerElement: Container = 'footer', + position = `bottom-left`, + containerElement: Container = `footer`, registry, shadowDOMTarget, }: FloatingDbDevtoolsOptions): JSX.Element | null { @@ -69,13 +69,13 @@ export function FloatingTanStackDbDevtools({ let panelRef: HTMLDivElement | undefined = undefined const [isOpen, setIsOpen] = useLocalStorage( - 'tanstackDbDevtoolsOpen', - initialIsOpen, + `tanstackDbDevtoolsOpen`, + initialIsOpen ) const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage( - 'tanstackDbDevtoolsHeight', - null, + `tanstackDbDevtoolsHeight`, + null ) const [isResolvedOpen, setIsResolvedOpen] = createSignal(false) @@ -84,14 +84,14 @@ export function FloatingTanStackDbDevtools({ const handleDragStart = ( panelElement: HTMLDivElement | undefined, - startEvent: any, + startEvent: any ) => { if (startEvent.button !== 0) return // Only allow left click for drag setIsResizing(true) const dragInfo = { - originalHeight: panelElement?.getBoundingClientRect().height ?? 0, + originalHeight: panelElement?.getBoundingClientRect().height || 0, pageY: startEvent.pageY, } @@ -110,18 +110,16 @@ export function FloatingTanStackDbDevtools({ const unsub = () => { setIsResizing(false) - document.removeEventListener('mousemove', run) - document.removeEventListener('mouseUp', unsub) + document.removeEventListener(`mousemove`, run) + document.removeEventListener(`mouseUp`, unsub) } - document.addEventListener('mousemove', run) - document.addEventListener('mouseup', unsub) + document.addEventListener(`mousemove`, run) + document.addEventListener(`mouseup`, unsub) } - - createEffect(() => { - setIsResolvedOpen(isOpen() ?? false) + setIsResolvedOpen(isOpen()) }) createEffect(() => { @@ -142,12 +140,12 @@ export function FloatingTanStackDbDevtools({ run() - if (typeof window !== 'undefined') { - window.addEventListener('resize', run) + if (typeof window !== `undefined`) { + window.addEventListener(`resize`, run) return () => { - window.removeEventListener('resize', run) - if (rootEl()?.parentElement && typeof previousValue === 'string') { + window.removeEventListener(`resize`, run) + if (rootEl()?.parentElement && typeof previousValue === `string`) { setRootEl((prev) => { prev!.parentElement!.style.paddingBottom = previousValue return prev @@ -160,7 +158,7 @@ export function FloatingTanStackDbDevtools({ if (rootEl()?.parentElement) { setRootEl((prev) => { if (prev?.parentElement) { - prev.parentElement.removeAttribute('style') + prev.parentElement.removeAttribute(`style`) } return prev }) @@ -173,7 +171,7 @@ export function FloatingTanStackDbDevtools({ if (rootEl()) { const el = rootEl() const fontSize = getComputedStyle(el!).fontSize - el?.style.setProperty('--tsdb-font-size', fontSize) + el?.style.setProperty(`--tsdb-font-size`, fontSize) } }) @@ -181,9 +179,7 @@ export function FloatingTanStackDbDevtools({ style?: Record } - const { - onClick: onCloseClick, - } = closeButtonProps + const { onClick: onCloseClick } = closeButtonProps const { onClick: onToggleClick, @@ -195,7 +191,10 @@ export function FloatingTanStackDbDevtools({ // The original isMounted() check was preventing rendering when embedded in React // if (!isMounted()) return null - const resolvedHeight = createMemo(() => devtoolsHeight() ?? 500) + const resolvedHeight = createMemo(() => { + const h = devtoolsHeight() + return typeof h === `number` ? h : 500 + }) const basePanelClass = createMemo(() => { return cx( @@ -204,8 +203,8 @@ export function FloatingTanStackDbDevtools({ styles().devtoolsPanelContainerResizing(isResizing), styles().devtoolsPanelContainerAnimation( isResolvedOpen(), - resolvedHeight() + 16, - ), + resolvedHeight() + 16 + ) ) }) @@ -222,19 +221,16 @@ export function FloatingTanStackDbDevtools({ styles().mainCloseBtn, styles().mainCloseBtnPosition(position), styles().mainCloseBtnAnimation(!!isOpen()), - toggleButtonClassName, + toggleButtonClassName ) }) return ( - + {}), + onCloseClick: + typeof onCloseClick === `function` ? onCloseClick : () => {}, }} > - #position: Signal + #position: Signal #panelProps: Signal | undefined> #toggleButtonProps: Signal | undefined> #closeButtonProps: Signal | undefined> #storageKey: Signal - #panelState: Signal + #panelState: Signal #onPanelStateChange: Signal<((isOpen: boolean) => void) | undefined> #dispose?: () => void @@ -56,7 +55,7 @@ class TanstackDbDevtools { this.#initialIsOpen[1](isOpen) } - setPosition(position: DbDevtoolsConfig["position"]) { + setPosition(position: DbDevtoolsConfig[`position`]) { this.#position[1](position) } @@ -76,7 +75,7 @@ class TanstackDbDevtools { this.#storageKey[1](key) } - setPanelState(state: DbDevtoolsConfig["panelState"]) { + setPanelState(state: DbDevtoolsConfig[`panelState`]) { this.#panelState[1](state) } @@ -86,27 +85,30 @@ class TanstackDbDevtools { mount(el: T) { if (this.#isMounted) { - throw new Error("DB Devtools is already mounted") + throw new Error(`DB Devtools is already mounted`) } - const getValidPosition = (pos: DbDevtoolsConfig["position"]) => { - if (pos === 'relative' || pos === undefined) { - return 'bottom-left' as const + const getValidPosition = (pos: DbDevtoolsConfig[`position`]) => { + if (pos === `relative` || pos === undefined) { + return `bottom-left` as const } - return pos as 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' + return pos } - const dispose = render(() => ( - this.#registry} - shadowDOMTarget={this.#shadowDOMTarget} - /> - ), el) + const dispose = render( + () => ( + this.#registry} + shadowDOMTarget={this.#shadowDOMTarget} + /> + ), + el + ) this.#isMounted = true this.#dispose = dispose @@ -114,11 +116,11 @@ class TanstackDbDevtools { unmount() { if (!this.#isMounted) { - throw new Error("DB Devtools is not mounted") + throw new Error(`DB Devtools is not mounted`) } this.#dispose?.() this.#isMounted = false } } -export { TanstackDbDevtools } \ No newline at end of file +export { TanstackDbDevtools } diff --git a/packages/db-devtools/src/components/CollectionItem.tsx b/packages/db-devtools/src/components/CollectionItem.tsx index 4fdb46093..a3d7fd148 100644 --- a/packages/db-devtools/src/components/CollectionItem.tsx +++ b/packages/db-devtools/src/components/CollectionItem.tsx @@ -1,8 +1,8 @@ -import { clsx as cx } from 'clsx' -import { useStyles } from '../useStyles' -import { CollectionStats } from './CollectionStats' -import type { Accessor } from 'solid-js' -import type { CollectionMetadata } from '../types' +import { clsx as cx } from "clsx" +import { useStyles } from "../useStyles" +import { CollectionStats } from "./CollectionStats" +import type { Accessor } from "solid-js" +import type { CollectionMetadata } from "../types" interface CollectionItemProps { collection: CollectionMetadata @@ -16,12 +16,12 @@ export function CollectionItem({ onSelect, }: CollectionItemProps) { const styles = useStyles() - + return (
onSelect(collection)} > @@ -29,4 +29,4 @@ export function CollectionItem({
) -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/components/CollectionStats.tsx b/packages/db-devtools/src/components/CollectionStats.tsx index 42e3b241a..eb1abcc83 100644 --- a/packages/db-devtools/src/components/CollectionStats.tsx +++ b/packages/db-devtools/src/components/CollectionStats.tsx @@ -1,7 +1,7 @@ -import { clsx as cx } from 'clsx' -import { useStyles } from '../useStyles' -import { formatTime } from '../utils/formatTime' -import type { CollectionMetadata } from '../types' +import { clsx as cx } from "clsx" +import { useStyles } from "../useStyles" +import { formatTime } from "../utils/formatTime" +import type { CollectionMetadata } from "../types" interface CollectionStatsProps { collection: CollectionMetadata @@ -9,8 +9,8 @@ interface CollectionStatsProps { export function CollectionStats({ collection }: CollectionStatsProps) { const styles = useStyles() - - if (collection.type === 'collection') { + + if (collection.type === `collection`) { // Standard collection stats return (
@@ -20,10 +20,12 @@ export function CollectionStats({ collection }: CollectionStatsProps) {
/
{formatTime(collection.gcTime || 0)}
/
-
+
{collection.status}
@@ -36,13 +38,15 @@ export function CollectionStats({ collection }: CollectionStatsProps) {
/
{formatTime(collection.gcTime || 0)}
/
-
+
{collection.status}
) } -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/components/CollectionsPanel.tsx b/packages/db-devtools/src/components/CollectionsPanel.tsx index fc4e1dd0e..5e3b907ee 100644 --- a/packages/db-devtools/src/components/CollectionsPanel.tsx +++ b/packages/db-devtools/src/components/CollectionsPanel.tsx @@ -1,12 +1,12 @@ -import { Show, For, createMemo } from 'solid-js' -import { useStyles } from '../useStyles' -import { CollectionItem } from './CollectionItem' -import { multiSortBy } from '../utils' -import type { Accessor } from 'solid-js' -import type { CollectionMetadata } from '../types' +import { For, Show, createMemo } from "solid-js" +import { useStyles } from "../useStyles" +import { multiSortBy } from "../utils" +import { CollectionItem } from "./CollectionItem" +import type { Accessor } from "solid-js" +import type { CollectionMetadata } from "../types" interface CollectionsPanelProps { - collections: Accessor + collections: Accessor> activeCollectionId: Accessor onSelectCollection: (collection: CollectionMetadata) => void } @@ -19,22 +19,19 @@ export function CollectionsPanel({ const styles = useStyles() const sortedCollections = createMemo(() => { - return multiSortBy( - collections(), - [ - (c) => c.status === 'error' ? 0 : 1, // Errors first - (c) => c.id.toLowerCase(), // Then alphabetically by ID - ] - ) + return multiSortBy(collections(), [ + (c) => (c.status === `error` ? 0 : 1), // Errors first + (c) => c.id.toLowerCase(), // Then alphabetically by ID + ]) }) // Group collections by type - const standardCollections = createMemo(() => - sortedCollections().filter(c => c.type === 'collection') + const standardCollections = createMemo(() => + sortedCollections().filter((c) => c.type === `collection`) ) - - const liveCollections = createMemo(() => - sortedCollections().filter(c => c.type === 'live-query') + + const liveCollections = createMemo(() => + sortedCollections().filter((c) => c.type === `live-query`) ) return ( @@ -43,7 +40,7 @@ export function CollectionsPanel({ 0} fallback={ -
+
No collections found
} @@ -63,13 +60,15 @@ export function CollectionsPanel({ Status
- {(collection) => - collection.id === activeCollectionId()} - onSelect={onSelectCollection} - /> - } + + {(collection) => ( + collection.id === activeCollectionId()} + onSelect={onSelectCollection} + /> + )} +
@@ -86,17 +85,19 @@ export function CollectionsPanel({ Status
- {(collection) => - collection.id === activeCollectionId()} - onSelect={onSelectCollection} - /> - } + + {(collection) => ( + collection.id === activeCollectionId()} + onSelect={onSelectCollection} + /> + )} + ) -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/components/DetailsPanel.tsx b/packages/db-devtools/src/components/DetailsPanel.tsx index c2a8c6b69..8d6f5869e 100644 --- a/packages/db-devtools/src/components/DetailsPanel.tsx +++ b/packages/db-devtools/src/components/DetailsPanel.tsx @@ -1,24 +1,26 @@ -import { Show } from 'solid-js' -import { useStyles } from '../useStyles' -import type { CollectionMetadata, TransactionDetails } from '../types' +import { Show, createMemo } from "solid-js" +import { useStyles } from "../useStyles" +import { Explorer } from "./Explorer" +import type { CollectionMetadata, TransactionDetails } from "../types" +import type { Accessor } from "solid-js" -interface DetailsPanelProps { - selectedView: 'collections' | 'transactions' - activeCollection?: CollectionMetadata - activeTransaction?: TransactionDetails +export interface DetailsPanelProps { + selectedView: Accessor<`collections` | `transactions`> + activeCollection: Accessor + activeTransaction: Accessor } export function DetailsPanel({ selectedView, activeCollection, - activeTransaction, + activeTransaction: _activeTransaction, }: DetailsPanelProps) { const styles = useStyles() return ( - +
@@ -29,11 +31,13 @@ export function DetailsPanel({ > {(collection) => (
-
- {collection().id} -
+
{collection().id}
-
{JSON.stringify(collection(), null, 2)}
+ collection()} + defaultExpanded={{}} + />
)} @@ -44,14 +48,14 @@ export function DetailsPanel({ export function TransactionDetailsPanel({ selectedView, - activeTransaction, + activeTransaction: _activeTransaction, }: DetailsPanelProps) { const styles = useStyles() return ( - +
@@ -66,7 +70,11 @@ export function TransactionDetailsPanel({ Transaction {transaction().id}
-
{JSON.stringify(transaction(), null, 2)}
+ transaction()} + defaultExpanded={{}} + />
)} @@ -82,57 +90,65 @@ export function UnifiedDetailsPanel({ }: DetailsPanelProps) { const styles = useStyles() - // Simple conditional rendering - if (selectedView === 'collections') { - if (activeCollection) { - return ( -
-
- {activeCollection.id} -
-
-
{JSON.stringify(activeCollection, null, 2)}
-
-
- ) - } else { - return ( -
-
- Select a collection to view details -
-
- ) - } - } else if (selectedView === 'transactions') { - if (activeTransaction) { - return ( -
-
- Transaction {activeTransaction.id} -
-
-
{JSON.stringify(activeTransaction, null, 2)}
-
-
- ) - } else { - return ( -
-
- Select a transaction to view details -
-
- ) - } - } + // Create stable value functions using createMemo to prevent unnecessary re-renders + const collectionValue = createMemo(() => activeCollection()) + const transactionValue = createMemo(() => activeTransaction()) - // Fallback return ( -
-
- Unknown view: {selectedView} -
-
+ <> + + +
+ Select a collection to view details +
+ + } + > + {(collection) => ( +
+
{collection().id}
+
+ +
+
+ )} +
+
+ + + +
+ Select a transaction to view details +
+ + } + > + {(transaction) => ( +
+
+ Transaction {transaction().id} +
+
+ +
+
+ )} +
+
+ ) -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/components/Explorer.tsx b/packages/db-devtools/src/components/Explorer.tsx new file mode 100644 index 000000000..cab1ec490 --- /dev/null +++ b/packages/db-devtools/src/components/Explorer.tsx @@ -0,0 +1,351 @@ +/* eslint-disable @typescript-eslint/no-unnecessary-condition */ +import { clsx as cx } from "clsx" +import * as goober from "goober" +import { createMemo, createSignal, useContext } from "solid-js" +import { tokens } from "../tokens" +import { ShadowDomTargetContext } from "../contexts" +import type { Accessor, JSX } from "solid-js" + +type ExpanderProps = { + expanded: boolean + style?: JSX.CSSProperties +} + +export const Expander = ({ expanded, style: _style = {} }: ExpanderProps) => { + const styles = useStyles() + return ( + + + + + + ) +} + +type Entry = { + label: string +} + +type RendererProps = { + handleEntry: HandleEntryFn + label?: JSX.Element + value: Accessor + subEntries: Array + subEntryPages: Array> + type: string + expanded: Accessor + toggleExpanded: () => void + pageSize: number + filterSubEntries?: (subEntries: Array) => Array +} + +/** + * Chunk elements in the array by size + * + * when the array cannot be chunked evenly by size, the last chunk will be + * filled with the remaining elements + * + * @example + * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']] + */ +export function chunkArray(array: Array, size: number): Array> { + if (size < 1) return [] + let i = 0 + const result: Array> = [] + while (i < array.length) { + result.push(array.slice(i, i + size)) + i = i + size + } + return result +} + +type HandleEntryFn = (entry: Entry) => JSX.Element + +type ExplorerProps = Partial & { + defaultExpanded?: true | Record + value: Accessor +} + +type Property = { + defaultExpanded?: boolean | Record + label: string + value: unknown +} + +function isIterable(x: any): x is Iterable { + return Symbol.iterator in x +} + +function displayValue(value: unknown): string { + if (value === null) return `null` + if (value === undefined) return `undefined` + if (typeof value === `string`) return `"${value}"` + if (typeof value === `number`) return value.toString() + if (typeof value === `boolean`) return value.toString() + if (typeof value === `function`) return `function` + if (Array.isArray(value)) return `Array(${value.length})` + if (typeof value === `object`) return `Object` + return String(value) +} + +export function Explorer({ + value, + defaultExpanded, + pageSize = 100, + filterSubEntries, + ...rest +}: ExplorerProps) { + const [expanded, setExpanded] = createSignal(Boolean(defaultExpanded)) + const toggleExpanded = () => setExpanded((old) => !old) + + const type = createMemo(() => typeof value()) + const subEntries = createMemo(() => { + let entries: Array = [] + + const makeProperty = (sub: { label: string; value: unknown }): Property => { + const subDefaultExpanded = + defaultExpanded === true + ? { [sub.label]: true } + : defaultExpanded?.[sub.label] + return { + ...sub, + value: () => sub.value, + defaultExpanded: subDefaultExpanded, + } + } + + if (Array.isArray(value())) { + // any[] + entries = (value() as Array).map((d, i) => + makeProperty({ + label: i.toString(), + value: d, + }) + ) + } else if ( + value() !== null && + typeof value() === `object` && + isIterable(value()) && + typeof (value() as Iterable)[Symbol.iterator] === `function` + ) { + // Iterable + entries = Array.from(value() as Iterable, (val, i) => + makeProperty({ + label: i.toString(), + value: val, + }) + ) + } else if (typeof value() === `object` && value() !== null) { + // object + entries = Object.entries(value() as object).map(([key, val]) => + makeProperty({ + label: key, + value: val, + }) + ) + } + + return filterSubEntries ? filterSubEntries(entries) : entries + }) + + const subEntryPages = createMemo(() => chunkArray(subEntries(), pageSize)) + + const [expandedPages, setExpandedPages] = createSignal>([]) + const [valueSnapshot, setValueSnapshot] = createSignal(undefined) + const styles = useStyles() + + const refreshValueSnapshot = () => { + setValueSnapshot((value() as () => any)()) + } + + const handleEntry = (entry: Entry) => ( + + ) + + return ( +
+ {subEntryPages().length ? ( + <> + + {(expanded() ?? false) ? ( + subEntryPages().length === 1 ? ( +
+ {subEntries().map((entry, _index) => handleEntry(entry))} +
+ ) : ( +
+ {subEntryPages().map((entries, index) => { + return ( +
+
+ + {expandedPages().includes(index) ? ( +
+ {entries.map((entry) => handleEntry(entry))} +
+ ) : null} +
+
+ ) + })} +
+ ) + ) : null} + + ) : type() === `function` ? ( + <> + + {rest.label} 🔄{` `} + + } + value={valueSnapshot} + defaultExpanded={{}} + /> + + ) : ( + <> + {rest.label}: + {` `} + {displayValue(value())} + + )} +
+ ) +} + +const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { + const { colors, font, size } = tokens + const { fontFamily, lineHeight, size: fontSize } = font + const css = shadowDOMTarget + ? goober.css.bind({ target: shadowDOMTarget }) + : goober.css + + return { + entry: css` + font-family: ${fontFamily.mono}; + font-size: ${fontSize.xs}; + line-height: ${lineHeight.sm}; + outline: none; + word-break: break-word; + `, + labelButton: css` + cursor: pointer; + color: inherit; + font: inherit; + outline: inherit; + background: transparent; + border: none; + padding: 0; + `, + expander: css` + display: inline-flex; + align-items: center; + justify-content: center; + width: ${size[3]}; + height: ${size[3]}; + padding-left: 3px; + box-sizing: content-box; + `, + expanderIcon: (expanded: boolean) => { + if (expanded) { + return css` + transform: rotate(90deg); + transition: transform 0.1s ease; + ` + } + return css` + transform: rotate(0deg); + transition: transform 0.1s ease; + ` + }, + expandButton: css` + display: flex; + gap: ${size[1]}; + align-items: center; + cursor: pointer; + color: inherit; + font: inherit; + outline: inherit; + background: transparent; + border: none; + padding: 0; + `, + value: css` + color: ${colors.purple[400]}; + `, + subEntries: css` + margin-left: ${size[2]}; + padding-left: ${size[2]}; + border-left: 2px solid ${colors.darkGray[400]}; + `, + info: css` + color: ${colors.gray[500]}; + font-size: ${fontSize.xs}; + padding-left: ${size[1]}; + `, + refreshValueBtn: css` + appearance: none; + border: 0; + cursor: pointer; + background: transparent; + color: inherit; + padding: 0; + font-family: ${fontFamily.mono}; + font-size: ${fontSize.xs}; + `, + } +} + +function useStyles() { + const shadowDOMTarget = useContext(ShadowDomTargetContext) + const styles = stylesFactory(shadowDOMTarget) + return () => styles +} diff --git a/packages/db-devtools/src/components/Logo.tsx b/packages/db-devtools/src/components/Logo.tsx index 8ca3cba7e..6087c9578 100644 --- a/packages/db-devtools/src/components/Logo.tsx +++ b/packages/db-devtools/src/components/Logo.tsx @@ -1,5 +1,5 @@ -import { clsx as cx } from 'clsx' -import { useStyles } from '../useStyles' +import { clsx as cx } from "clsx" +import { useStyles } from "../useStyles" interface LogoProps { className?: () => string @@ -10,9 +10,9 @@ export function Logo(props: LogoProps) { const { className, ...rest } = props const styles = useStyles() return ( - ) -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/components/TabNavigation.tsx b/packages/db-devtools/src/components/TabNavigation.tsx index e7309bc6c..ebb8d49e5 100644 --- a/packages/db-devtools/src/components/TabNavigation.tsx +++ b/packages/db-devtools/src/components/TabNavigation.tsx @@ -1,12 +1,12 @@ -import { clsx as cx } from 'clsx' -import { useStyles } from '../useStyles' -import type { Accessor } from 'solid-js' +import { clsx as cx } from "clsx" +import { useStyles } from "../useStyles" +import type { Accessor } from "solid-js" interface TabNavigationProps { - selectedView: Accessor<'collections' | 'transactions'> + selectedView: Accessor<`collections` | `transactions`> collectionsCount: Accessor transactionsCount: Accessor - onSelectView: (view: 'collections' | 'transactions') => void + onSelectView: (view: `collections` | `transactions`) => void } export function TabNavigation({ @@ -21,26 +21,26 @@ export function TabNavigation({
) -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/components/TransactionItem.tsx b/packages/db-devtools/src/components/TransactionItem.tsx index c413495fd..0eb0ad31e 100644 --- a/packages/db-devtools/src/components/TransactionItem.tsx +++ b/packages/db-devtools/src/components/TransactionItem.tsx @@ -1,7 +1,7 @@ -import { clsx as cx } from 'clsx' -import { useStyles } from '../useStyles' -import { TransactionStats } from './TransactionStats' -import type { TransactionDetails } from '../types' +import { clsx as cx } from "clsx" +import { useStyles } from "../useStyles" +import { TransactionStats } from "./TransactionStats" +import type { TransactionDetails } from "../types" interface TransactionItemProps { transaction: TransactionDetails @@ -15,7 +15,7 @@ export function TransactionItem({ onSelect, }: TransactionItemProps) { const styles = useStyles() - + return (
onSelect(transaction.id)} > -
- {transaction.id} -
+
{transaction.id}
) -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/components/TransactionStats.tsx b/packages/db-devtools/src/components/TransactionStats.tsx index 5f47ca521..92b363be7 100644 --- a/packages/db-devtools/src/components/TransactionStats.tsx +++ b/packages/db-devtools/src/components/TransactionStats.tsx @@ -1,7 +1,7 @@ -import { clsx as cx } from 'clsx' -import { useStyles } from '../useStyles' -import { formatTime } from '../utils/formatTime' -import type { TransactionDetails } from '../types' +import { clsx as cx } from "clsx" +import { useStyles } from "../useStyles" +import { formatTime } from "../utils/formatTime" +import type { TransactionDetails } from "../types" interface TransactionStatsProps { transaction: TransactionDetails @@ -9,9 +9,9 @@ interface TransactionStatsProps { export function TransactionStats({ transaction }: TransactionStatsProps) { const styles = useStyles() - + const age = Date.now() - transaction.createdAt.getTime() - + return (
{transaction.mutations.length}
@@ -20,12 +20,14 @@ export function TransactionStats({ transaction }: TransactionStatsProps) {
/
{formatTime(age)}
/
-
+
{transaction.state}
) -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/components/TransactionsPanel.tsx b/packages/db-devtools/src/components/TransactionsPanel.tsx index 4d6634936..8fe20fcd2 100644 --- a/packages/db-devtools/src/components/TransactionsPanel.tsx +++ b/packages/db-devtools/src/components/TransactionsPanel.tsx @@ -1,11 +1,11 @@ -import { Show, For } from 'solid-js' -import { useStyles } from '../useStyles' -import { TransactionItem } from './TransactionItem' -import type { Accessor } from 'solid-js' -import type { TransactionDetails } from '../types' +import { For, Show } from "solid-js" +import { useStyles } from "../useStyles" +import { TransactionItem } from "./TransactionItem" +import type { Accessor } from "solid-js" +import type { TransactionDetails } from "../types" interface TransactionsPanelProps { - transactions: Accessor + transactions: Accessor> selectedTransaction: Accessor onSelectTransaction: (transactionId: string) => void } @@ -36,21 +36,23 @@ export function TransactionsPanel({ 0} fallback={ -
+
No transactions found
} > - {(transaction) => ( - - )} + + {(transaction) => ( + + )} +
) -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/components/index.ts b/packages/db-devtools/src/components/index.ts index f3d857d8a..8ae980b9b 100644 --- a/packages/db-devtools/src/components/index.ts +++ b/packages/db-devtools/src/components/index.ts @@ -1,9 +1,13 @@ -export { Logo } from './Logo' -export { CollectionStats } from './CollectionStats' -export { TransactionStats } from './TransactionStats' -export { CollectionItem } from './CollectionItem' -export { TransactionItem } from './TransactionItem' -export { CollectionsPanel } from './CollectionsPanel' -export { TransactionsPanel } from './TransactionsPanel' -export { DetailsPanel, TransactionDetailsPanel, UnifiedDetailsPanel } from './DetailsPanel' -export { TabNavigation } from './TabNavigation' \ No newline at end of file +export { Logo } from "./Logo" +export { CollectionStats } from "./CollectionStats" +export { TransactionStats } from "./TransactionStats" +export { CollectionItem } from "./CollectionItem" +export { TransactionItem } from "./TransactionItem" +export { CollectionsPanel } from "./CollectionsPanel" +export { TransactionsPanel } from "./TransactionsPanel" +export { + DetailsPanel, + TransactionDetailsPanel, + UnifiedDetailsPanel, +} from "./DetailsPanel" +export { TabNavigation } from "./TabNavigation" diff --git a/packages/db-devtools/src/constants.ts b/packages/db-devtools/src/constants.ts index 974f905e6..b3486b973 100644 --- a/packages/db-devtools/src/constants.ts +++ b/packages/db-devtools/src/constants.ts @@ -1,18 +1,31 @@ export const DEFAULT_HEIGHT = 500 export const DEFAULT_WIDTH = 500 -export const POSITION = 'bottom-right' -export const BUTTON_POSITION = 'bottom-right' +export const POSITION = `bottom-right` +export const BUTTON_POSITION = `bottom-right` export const INITIAL_IS_OPEN = false export const DEFAULT_SORT_ORDER = 1 -export const DEFAULT_SORT_FN_NAME = 'Status > Last Updated' -export const DEFAULT_MUTATION_SORT_FN_NAME = 'Status > Last Updated' +export const DEFAULT_SORT_FN_NAME = `Status > Last Updated` +export const DEFAULT_MUTATION_SORT_FN_NAME = `Status > Last Updated` export const POLLING_INTERVAL_MS = 1000 // Poll every second for metadata updates export const firstBreakpoint = 1024 export const secondBreakpoint = 796 export const thirdBreakpoint = 700 -export type DevtoolsPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top' | 'bottom' | 'left' | 'right' -export type DevtoolsButtonPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'relative' +export type DevtoolsPosition = + | `top-left` + | `top-right` + | `bottom-left` + | `bottom-right` + | `top` + | `bottom` + | `left` + | `right` +export type DevtoolsButtonPosition = + | `top-left` + | `top-right` + | `bottom-left` + | `bottom-right` + | `relative` -export const isServer = typeof window === 'undefined' \ No newline at end of file +export const isServer = typeof window === `undefined` diff --git a/packages/db-devtools/src/contexts/NavigationContext.tsx b/packages/db-devtools/src/contexts/NavigationContext.tsx index 1cb023273..839e26bf9 100644 --- a/packages/db-devtools/src/contexts/NavigationContext.tsx +++ b/packages/db-devtools/src/contexts/NavigationContext.tsx @@ -1,44 +1,55 @@ -import { createContext, createSignal, useContext, type Accessor, type Setter } from 'solid-js' -import type { CollectionMetadata, TransactionDetails } from '../types' +import { createContext, createSignal, useContext } from "solid-js" +import type { Accessor, Setter } from "solid-js" +import type { CollectionMetadata, TransactionDetails } from "../types" export interface NavigationState { - selectedView: Accessor<'collections' | 'transactions'> - setSelectedView: Setter<'collections' | 'transactions'> + selectedView: Accessor<`collections` | `transactions`> + setSelectedView: Setter<`collections` | `transactions`> activeCollectionId: Accessor setActiveCollectionId: Setter selectedTransaction: Accessor setSelectedTransaction: Setter activeCollection: Accessor activeTransaction: Accessor - collections: Accessor - setCollections: Setter - transactions: Accessor - setTransactions: Setter + collections: Accessor> + setCollections: Setter> + transactions: Accessor> + setTransactions: Setter> } const NavigationContext = createContext() export function createNavigationStore(): NavigationState { - const [selectedView, setSelectedView] = createSignal<'collections' | 'transactions'>('collections') - const [activeCollectionId, setActiveCollectionId] = createSignal('') - const [selectedTransaction, setSelectedTransaction] = createSignal(null) - + const [selectedView, setSelectedView] = createSignal< + `collections` | `transactions` + >(`collections`) + const [activeCollectionId, setActiveCollectionId] = createSignal(``) + const [selectedTransaction, setSelectedTransaction] = createSignal< + string | null + >(null) + // These will be set by the parent component - const [collections, setCollections] = createSignal([]) - const [transactions, setTransactions] = createSignal([]) + const [collections, setCollections] = createSignal>( + [] + ) + const [transactions, setTransactions] = createSignal< + Array + >([]) const activeCollection = () => { - const active = collections().find(c => c.id === activeCollectionId()) + const active = collections().find((c) => c.id === activeCollectionId()) return active } const activeTransaction = () => { - const active = transactions().find(t => t.id === selectedTransaction()) + const active = transactions().find((t) => t.id === selectedTransaction()) return active } // Debug logging - const debugSetSelectedView: Setter<'collections' | 'transactions'> = (value) => { + const debugSetSelectedView: Setter<`collections` | `transactions`> = ( + value + ) => { setSelectedView(value) } @@ -50,11 +61,11 @@ export function createNavigationStore(): NavigationState { setSelectedTransaction(value) } - const debugSetCollections: Setter = (value) => { + const debugSetCollections: Setter> = (value) => { setCollections(value) } - const debugSetTransactions: Setter = (value) => { + const debugSetTransactions: Setter> = (value) => { setTransactions(value) } @@ -80,15 +91,18 @@ export function createNavigationStore(): NavigationState { export function useNavigation() { const context = useContext(NavigationContext) if (!context) { - throw new Error('useNavigation must be used within a NavigationProvider') + throw new Error(`useNavigation must be used within a NavigationProvider`) } return context } -export function NavigationProvider(props: { children: any; store: NavigationState }) { +export function NavigationProvider(props: { + children: any + store: NavigationState +}) { return ( {props.children} ) -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/contexts/index.tsx b/packages/db-devtools/src/contexts/index.tsx index 5737bd95e..518b202ff 100644 --- a/packages/db-devtools/src/contexts/index.tsx +++ b/packages/db-devtools/src/contexts/index.tsx @@ -1,14 +1,18 @@ -import { createContext, useContext } from 'solid-js' +import { createContext, useContext } from "solid-js" // Devtools On Close Context - matches Router devtools pattern -export const DevtoolsOnCloseContext = createContext<{ onCloseClick: (e: any) => void }>({ +export const DevtoolsOnCloseContext = createContext<{ + onCloseClick: (e: any) => void +}>({ onCloseClick: () => {}, }) export const useDevtoolsOnClose = () => useContext(DevtoolsOnCloseContext) // Shadow DOM Target Context - matches Router devtools pattern -export const ShadowDomTargetContext = createContext(undefined) +export const ShadowDomTargetContext = createContext( + undefined +) // Navigation Context -export * from './NavigationContext' \ No newline at end of file +export * from "./NavigationContext" diff --git a/packages/db-devtools/src/devtools.ts b/packages/db-devtools/src/devtools.ts index a75dfdd68..c931affbe 100644 --- a/packages/db-devtools/src/devtools.ts +++ b/packages/db-devtools/src/devtools.ts @@ -9,7 +9,7 @@ import type { DbDevtoolsRegistry } from "./types" */ export function initializeDbDevtools(): void { // SSR safety check - if (typeof window === 'undefined') { + if (typeof window === `undefined`) { return } @@ -42,9 +42,11 @@ export function initializeDbDevtools(): void { export function registerCollection( collection: CollectionImpl ): void { - if (typeof window === 'undefined') return - - const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (typeof window === `undefined`) return + + const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as + | DbDevtoolsRegistry + | undefined if (registry) { registry.registerCollection(collection) } @@ -55,9 +57,11 @@ export function registerCollection( * This is automatically called when collections are garbage collected. */ export function unregisterCollection(id: string): void { - if (typeof window === 'undefined') return - - const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (typeof window === `undefined`) return + + const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as + | DbDevtoolsRegistry + | undefined if (registry) { registry.unregisterCollection(id) } @@ -67,7 +71,7 @@ export function unregisterCollection(id: string): void { * Check if devtools are currently enabled (registry is present). */ export function isDevtoolsEnabled(): boolean { - if (typeof window === 'undefined') return false + if (typeof window === `undefined`) return false return !!(window as any).__TANSTACK_DB_DEVTOOLS__ } @@ -75,8 +79,10 @@ export function isDevtoolsEnabled(): boolean { * Get the current devtools registry instance. */ export function getDevtoolsRegistry(): DbDevtoolsRegistry | undefined { - if (typeof window === 'undefined') return undefined - return (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (typeof window === `undefined`) return undefined + return (window as any).__TANSTACK_DB_DEVTOOLS__ as + | DbDevtoolsRegistry + | undefined } /** @@ -84,9 +90,11 @@ export function getDevtoolsRegistry(): DbDevtoolsRegistry | undefined { * This is useful for testing or when you want to completely reset the devtools state. */ export function cleanupDevtools(): void { - if (typeof window === 'undefined') return - - const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry | undefined + if (typeof window === `undefined`) return + + const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as + | DbDevtoolsRegistry + | undefined if (registry) { registry.cleanup() delete (window as any).__TANSTACK_DB_DEVTOOLS__ diff --git a/packages/db-devtools/src/index.ts b/packages/db-devtools/src/index.ts index 46b149c28..af09fec3d 100644 --- a/packages/db-devtools/src/index.ts +++ b/packages/db-devtools/src/index.ts @@ -1,8 +1,11 @@ // Core exports -export * from './types' -export * from './constants' -export * from './devtools' -export * from './registry' +export * from "./types" +export * from "./constants" +export * from "./devtools" +export * from "./registry" + +// Components +export { Explorer } from "./components/Explorer" // Main Devtools Class (follows TanStack pattern) export { TanstackDbDevtools } from "./TanstackDbDevtools" diff --git a/packages/db-devtools/src/logo.tsx b/packages/db-devtools/src/logo.tsx index c5a0b79a0..09ca2fb5f 100644 --- a/packages/db-devtools/src/logo.tsx +++ b/packages/db-devtools/src/logo.tsx @@ -1,4 +1,4 @@ -import { createUniqueId } from 'solid-js' +import { createUniqueId } from "solid-js" export function TanStackLogo() { const id = createUniqueId() diff --git a/packages/db-devtools/src/registry.ts b/packages/db-devtools/src/registry.ts index 6fd13c783..810c40bce 100644 --- a/packages/db-devtools/src/registry.ts +++ b/packages/db-devtools/src/registry.ts @@ -1,10 +1,10 @@ +import { POLLING_INTERVAL_MS } from "./constants" import type { CollectionMetadata, CollectionRegistryEntry, DbDevtoolsRegistry, TransactionDetails, } from "./types" -import { POLLING_INTERVAL_MS } from "./constants" class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { public collections = new Map() @@ -78,7 +78,7 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { getAllCollectionMetadata = (): Array => { const results: Array = [] - for (const [id, entry] of this.collections) { + for (const [_id, entry] of this.collections) { const collection = entry.weakRef.deref() if (collection) { // Collection is still alive, update metadata @@ -125,8 +125,8 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { getTransactions = (collectionId?: string): Array => { const transactions: Array = [] - for (const [id, entry] of this.collections) { - if (collectionId && id !== collectionId) continue + for (const [_id, entry] of this.collections) { + if (collectionId && _id !== collectionId) continue const collection = entry.weakRef.deref() if (!collection) continue @@ -134,7 +134,7 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { for (const [txId, transaction] of collection.transactions) { transactions.push({ id: txId, - collectionId: id, + collectionId: _id, state: transaction.state, mutations: transaction.mutations.map((m: any) => ({ id: m.mutationId, @@ -159,7 +159,7 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { } getTransaction = (id: string): TransactionDetails | undefined => { - for (const [collectionId, entry] of this.collections) { + for (const [_collectionId, entry] of this.collections) { const collection = entry.weakRef.deref() if (!collection) continue @@ -167,7 +167,7 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { if (transaction) { return { id, - collectionId, + collectionId: _collectionId, state: transaction.state, mutations: transaction.mutations.map((m: any) => ({ id: m.mutationId, @@ -254,9 +254,7 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { return `collection` } - private isLiveQuery = ( - collection: any - ): boolean => { + private isLiveQuery = (collection: any): boolean => { return this.detectCollectionType(collection) === `live-query` } @@ -283,7 +281,7 @@ export function createDbDevtoolsRegistry(): DbDevtoolsRegistry { // Initialize the global registry if not already present export function initializeDevtoolsRegistry(): DbDevtoolsRegistry { // SSR safety check - if (typeof window === 'undefined') { + if (typeof window === `undefined`) { // Return a no-op registry for server-side rendering return { collections: new Map(), @@ -303,11 +301,9 @@ export function initializeDevtoolsRegistry(): DbDevtoolsRegistry { garbageCollect: () => {}, } as DbDevtoolsRegistry } - + if (!(window as any).__TANSTACK_DB_DEVTOOLS__) { - (window as any).__TANSTACK_DB_DEVTOOLS__ = createDbDevtoolsRegistry() + ;(window as any).__TANSTACK_DB_DEVTOOLS__ = createDbDevtoolsRegistry() } return (window as any).__TANSTACK_DB_DEVTOOLS__ as DbDevtoolsRegistry } - - diff --git a/packages/db-devtools/src/tokens.ts b/packages/db-devtools/src/tokens.ts index b9a606793..655bd7936 100644 --- a/packages/db-devtools/src/tokens.ts +++ b/packages/db-devtools/src/tokens.ts @@ -1,264 +1,264 @@ export const tokens = { colors: { - inherit: 'inherit', - current: 'currentColor', - transparent: 'transparent', - black: '#000000', - white: '#ffffff', + inherit: `inherit`, + current: `currentColor`, + transparent: `transparent`, + black: `#000000`, + white: `#ffffff`, neutral: { - 50: '#f9fafb', - 100: '#f2f4f7', - 200: '#eaecf0', - 300: '#d0d5dd', - 400: '#98a2b3', - 500: '#667085', - 600: '#475467', - 700: '#344054', - 800: '#1d2939', - 900: '#101828', + 50: `#f9fafb`, + 100: `#f2f4f7`, + 200: `#eaecf0`, + 300: `#d0d5dd`, + 400: `#98a2b3`, + 500: `#667085`, + 600: `#475467`, + 700: `#344054`, + 800: `#1d2939`, + 900: `#101828`, }, darkGray: { - 50: '#525c7a', - 100: '#49536e', - 200: '#414962', - 300: '#394056', - 400: '#313749', - 500: '#292e3d', - 600: '#212530', - 700: '#191c24', - 800: '#111318', - 900: '#0b0d10', + 50: `#525c7a`, + 100: `#49536e`, + 200: `#414962`, + 300: `#394056`, + 400: `#313749`, + 500: `#292e3d`, + 600: `#212530`, + 700: `#191c24`, + 800: `#111318`, + 900: `#0b0d10`, }, gray: { - 50: '#f9fafb', - 100: '#f2f4f7', - 200: '#eaecf0', - 300: '#d0d5dd', - 400: '#98a2b3', - 500: '#667085', - 600: '#475467', - 700: '#344054', - 800: '#1d2939', - 900: '#101828', + 50: `#f9fafb`, + 100: `#f2f4f7`, + 200: `#eaecf0`, + 300: `#d0d5dd`, + 400: `#98a2b3`, + 500: `#667085`, + 600: `#475467`, + 700: `#344054`, + 800: `#1d2939`, + 900: `#101828`, }, blue: { - 25: '#F5FAFF', - 50: '#EFF8FF', - 100: '#D1E9FF', - 200: '#B2DDFF', - 300: '#84CAFF', - 400: '#53B1FD', - 500: '#2E90FA', - 600: '#1570EF', - 700: '#175CD3', - 800: '#1849A9', - 900: '#194185', + 25: `#F5FAFF`, + 50: `#EFF8FF`, + 100: `#D1E9FF`, + 200: `#B2DDFF`, + 300: `#84CAFF`, + 400: `#53B1FD`, + 500: `#2E90FA`, + 600: `#1570EF`, + 700: `#175CD3`, + 800: `#1849A9`, + 900: `#194185`, }, green: { - 25: '#F6FEF9', - 50: '#ECFDF3', - 100: '#D1FADF', - 200: '#A6F4C5', - 300: '#6CE9A6', - 400: '#32D583', - 500: '#12B76A', - 600: '#039855', - 700: '#027A48', - 800: '#05603A', - 900: '#054F31', + 25: `#F6FEF9`, + 50: `#ECFDF3`, + 100: `#D1FADF`, + 200: `#A6F4C5`, + 300: `#6CE9A6`, + 400: `#32D583`, + 500: `#12B76A`, + 600: `#039855`, + 700: `#027A48`, + 800: `#05603A`, + 900: `#054F31`, }, red: { - 50: '#fef2f2', - 100: '#fee2e2', - 200: '#fecaca', - 300: '#fca5a5', - 400: '#f87171', - 500: '#ef4444', - 600: '#dc2626', - 700: '#b91c1c', - 800: '#991b1b', - 900: '#7f1d1d', - 950: '#450a0a', + 50: `#fef2f2`, + 100: `#fee2e2`, + 200: `#fecaca`, + 300: `#fca5a5`, + 400: `#f87171`, + 500: `#ef4444`, + 600: `#dc2626`, + 700: `#b91c1c`, + 800: `#991b1b`, + 900: `#7f1d1d`, + 950: `#450a0a`, }, yellow: { - 25: '#FFFCF5', - 50: '#FFFAEB', - 100: '#FEF0C7', - 200: '#FEDF89', - 300: '#FEC84B', - 400: '#FDB022', - 500: '#F79009', - 600: '#DC6803', - 700: '#B54708', - 800: '#93370D', - 900: '#7A2E0E', + 25: `#FFFCF5`, + 50: `#FFFAEB`, + 100: `#FEF0C7`, + 200: `#FEDF89`, + 300: `#FEC84B`, + 400: `#FDB022`, + 500: `#F79009`, + 600: `#DC6803`, + 700: `#B54708`, + 800: `#93370D`, + 900: `#7A2E0E`, }, purple: { - 25: '#FAFAFF', - 50: '#F4F3FF', - 100: '#EBE9FE', - 200: '#D9D6FE', - 300: '#BDB4FE', - 400: '#9B8AFB', - 500: '#7A5AF8', - 600: '#6328EF', - 700: '#5912D3', - 800: '#4A0FB0', - 900: '#3E0C8E', + 25: `#FAFAFF`, + 50: `#F4F3FF`, + 100: `#EBE9FE`, + 200: `#D9D6FE`, + 300: `#BDB4FE`, + 400: `#9B8AFB`, + 500: `#7A5AF8`, + 600: `#6328EF`, + 700: `#5912D3`, + 800: `#4A0FB0`, + 900: `#3E0C8E`, }, orange: { - 25: '#FFFAF5', - 50: '#FFF4ED', - 100: '#FFE6D5', - 200: '#FFD6AE', - 300: '#FF9C66', - 400: '#FF692E', - 500: '#FF4405', - 600: '#E62E05', - 700: '#BC1B06', - 800: '#97180C', - 900: '#771A0D', + 25: `#FFFAF5`, + 50: `#FFF4ED`, + 100: `#FFE6D5`, + 200: `#FFD6AE`, + 300: `#FF9C66`, + 400: `#FF692E`, + 500: `#FF4405`, + 600: `#E62E05`, + 700: `#BC1B06`, + 800: `#97180C`, + 900: `#771A0D`, }, }, size: { - px: '1px', - 0: '0px', - 0.5: '0.125rem', - 1: '0.25rem', - 1.5: '0.375rem', - 2: '0.5rem', - 2.5: '0.625rem', - 3: '0.75rem', - 3.5: '0.875rem', - 4: '1rem', - 5: '1.25rem', - 6: '1.5rem', - 7: '1.75rem', - 8: '2rem', - 9: '2.25rem', - 10: '2.5rem', - 11: '2.75rem', - 12: '3rem', - 14: '3.5rem', - 16: '4rem', - 20: '5rem', - 24: '6rem', - 28: '7rem', - 32: '8rem', - 36: '9rem', - 40: '10rem', - 44: '11rem', - 48: '12rem', - 52: '13rem', - 56: '14rem', - 60: '15rem', - 64: '16rem', - 72: '18rem', - 80: '20rem', - 96: '24rem', + px: `1px`, + 0: `0px`, + 0.5: `0.125rem`, + 1: `0.25rem`, + 1.5: `0.375rem`, + 2: `0.5rem`, + 2.5: `0.625rem`, + 3: `0.75rem`, + 3.5: `0.875rem`, + 4: `1rem`, + 5: `1.25rem`, + 6: `1.5rem`, + 7: `1.75rem`, + 8: `2rem`, + 9: `2.25rem`, + 10: `2.5rem`, + 11: `2.75rem`, + 12: `3rem`, + 14: `3.5rem`, + 16: `4rem`, + 20: `5rem`, + 24: `6rem`, + 28: `7rem`, + 32: `8rem`, + 36: `9rem`, + 40: `10rem`, + 44: `11rem`, + 48: `12rem`, + 52: `13rem`, + 56: `14rem`, + 60: `15rem`, + 64: `16rem`, + 72: `18rem`, + 80: `20rem`, + 96: `24rem`, }, alpha: { - 5: '0D', - 10: '1A', - 20: '33', - 30: '4D', - 40: '66', - 50: '80', - 60: '99', - 70: 'B3', - 80: 'CC', - 90: 'E6', - 95: 'F2', + 5: `0D`, + 10: `1A`, + 20: `33`, + 30: `4D`, + 40: `66`, + 50: `80`, + 60: `99`, + 70: `B3`, + 80: `CC`, + 90: `E6`, + 95: `F2`, }, font: { size: { - xs: '0.75rem', - sm: '0.875rem', - md: '1rem', - lg: '1.125rem', - xl: '1.25rem', - '2xl': '1.5rem', - '3xl': '1.875rem', - '4xl': '2.25rem', + xs: `0.75rem`, + sm: `0.875rem`, + md: `1rem`, + lg: `1.125rem`, + xl: `1.25rem`, + "2xl": `1.5rem`, + "3xl": `1.875rem`, + "4xl": `2.25rem`, }, lineHeight: { - xs: '1rem', - sm: '1.25rem', - md: '1.5rem', - lg: '1.75rem', - xl: '1.75rem', - '2xl': '2rem', - '3xl': '2.25rem', - '4xl': '2.5rem', + xs: `1rem`, + sm: `1.25rem`, + md: `1.5rem`, + lg: `1.75rem`, + xl: `1.75rem`, + "2xl": `2rem`, + "3xl": `2.25rem`, + "4xl": `2.5rem`, }, weight: { - thin: '100', - extralight: '200', - light: '300', - normal: '400', - medium: '500', - semibold: '600', - bold: '700', - extrabold: '800', - black: '900', + thin: `100`, + extralight: `200`, + light: `300`, + normal: `400`, + medium: `500`, + semibold: `600`, + bold: `700`, + extrabold: `800`, + black: `900`, }, fontFamily: { sans: [ - 'ui-sans-serif', - 'system-ui', - '-apple-system', - 'BlinkMacSystemFont', - '"Segoe UI"', - 'Roboto', - '"Helvetica Neue"', - 'Arial', - '"Noto Sans"', - 'sans-serif', - '"Apple Color Emoji"', - '"Segoe UI Emoji"', - '"Segoe UI Symbol"', - '"Noto Color Emoji"', - ].join(', '), + `ui-sans-serif`, + `system-ui`, + `-apple-system`, + `BlinkMacSystemFont`, + `"Segoe UI"`, + `Roboto`, + `"Helvetica Neue"`, + `Arial`, + `"Noto Sans"`, + `sans-serif`, + `"Apple Color Emoji"`, + `"Segoe UI Emoji"`, + `"Segoe UI Symbol"`, + `"Noto Color Emoji"`, + ].join(`, `), serif: [ - 'ui-serif', - 'Georgia', - 'Cambria', - '"Times New Roman"', - 'Times', - 'serif', - ].join(', '), + `ui-serif`, + `Georgia`, + `Cambria`, + `"Times New Roman"`, + `Times`, + `serif`, + ].join(`, `), mono: [ - 'ui-monospace', - 'SFMono-Regular', - '"Menlo"', - 'Monaco', - 'Consolas', - '"Liberation Mono"', - '"Courier New"', - 'monospace', - ].join(', '), + `ui-monospace`, + `SFMono-Regular`, + `"Menlo"`, + `Monaco`, + `Consolas`, + `"Liberation Mono"`, + `"Courier New"`, + `monospace`, + ].join(`, `), }, }, shadow: { - xs: '0 1px 2px 0 rgb(0 0 0 / 0.05)', - sm: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)', - md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', - lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)', - xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)', - '2xl': '0 25px 50px -12px rgb(0 0 0 / 0.25)', - inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)', + xs: `0 1px 2px 0 rgb(0 0 0 / 0.05)`, + sm: `0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)`, + md: `0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)`, + lg: `0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)`, + xl: `0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)`, + "2xl": `0 25px 50px -12px rgb(0 0 0 / 0.25)`, + inner: `inset 0 2px 4px 0 rgb(0 0 0 / 0.05)`, }, border: { radius: { - none: '0px', - sm: '0.125rem', - md: '0.375rem', - lg: '0.5rem', - xl: '0.75rem', - '2xl': '1rem', - '3xl': '1.5rem', - full: '9999px', - xs: '0.0625rem', + none: `0px`, + sm: `0.125rem`, + md: `0.375rem`, + lg: `0.5rem`, + xl: `0.75rem`, + "2xl": `1rem`, + "3xl": `1.5rem`, + full: `9999px`, + xs: `0.0625rem`, }, }, -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/useLocalStorage.ts b/packages/db-devtools/src/useLocalStorage.ts index 70bbe2dc2..6359c36b7 100644 --- a/packages/db-devtools/src/useLocalStorage.ts +++ b/packages/db-devtools/src/useLocalStorage.ts @@ -1,21 +1,20 @@ -import { createSignal, createEffect } from 'solid-js' -import type { Accessor, Setter } from 'solid-js' +import { createEffect, createSignal } from "solid-js" +import type { Accessor, Setter } from "solid-js" export function useLocalStorage( key: string, - defaultValue?: T, + defaultValue?: T ): [Accessor, Setter] { // Initialize with default value or try to get from localStorage const getInitialValue = (): T => { - if (typeof window === 'undefined') { + if (typeof window === `undefined`) { return defaultValue as T } - + try { const item = window.localStorage.getItem(key) return item ? JSON.parse(item) : (defaultValue as T) - } catch (error) { - console.warn(`Error reading localStorage key "${key}":`, error) + } catch { return defaultValue as T } } @@ -24,8 +23,8 @@ export function useLocalStorage( // Update localStorage when value changes createEffect(() => { - if (typeof window === 'undefined') return - + if (typeof window === `undefined`) return + try { const currentValue = value() if (currentValue === undefined) { @@ -33,12 +32,10 @@ export function useLocalStorage( } else { window.localStorage.setItem(key, JSON.stringify(currentValue)) } - } catch (error) { - console.warn(`Error setting localStorage key "${key}":`, error) - } + } catch {} }) return [value, setValue] } -export default useLocalStorage \ No newline at end of file +export default useLocalStorage diff --git a/packages/db-devtools/src/useStyles.tsx b/packages/db-devtools/src/useStyles.tsx index 67a931147..b54d326f7 100644 --- a/packages/db-devtools/src/useStyles.tsx +++ b/packages/db-devtools/src/useStyles.tsx @@ -1,8 +1,8 @@ -import * as goober from 'goober' -import { createSignal, useContext } from 'solid-js' -import { tokens } from './tokens' -import { ShadowDomTargetContext } from './contexts' -import type { Accessor } from 'solid-js' +import * as goober from "goober" +import { createSignal, useContext } from "solid-js" +import { tokens } from "./tokens" +import { ShadowDomTargetContext } from "./contexts" +import type { Accessor } from "solid-js" const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { const { colors, font, size, alpha, border } = tokens @@ -25,7 +25,7 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { `, devtoolsPanelContainerVisibility: (isOpen: boolean) => { return css` - visibility: ${isOpen ? 'visible' : 'hidden'}; + visibility: ${isOpen ? `visible` : `hidden`}; ` }, devtoolsPanelContainerResizing: (isResizing: Accessor) => { @@ -83,7 +83,11 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { dbLogo: css` font-weight: ${font.weight.semibold}; font-size: ${font.size.xs}; - background: linear-gradient(to right, rgb(249, 115, 22), rgb(194, 65, 12)); + background: linear-gradient( + to right, + rgb(249, 115, 22), + rgb(194, 65, 12) + ); background-clip: text; -webkit-background-clip: text; line-height: 1; @@ -172,17 +176,17 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { } `, mainCloseBtnPosition: ( - position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right', + position: `top-left` | `top-right` | `bottom-left` | `bottom-right` ) => { const base = css` - ${position === 'top-left' ? `top: ${size[2]}; left: ${size[2]};` : ''} - ${position === 'top-right' ? `top: ${size[2]}; right: ${size[2]};` : ''} - ${position === 'bottom-left' + ${position === `top-left` ? `top: ${size[2]}; left: ${size[2]};` : ``} + ${position === `top-right` ? `top: ${size[2]}; right: ${size[2]};` : ``} + ${position === `bottom-left` ? `bottom: ${size[2]}; left: ${size[2]};` - : ''} - ${position === 'bottom-right' + : ``} + ${position === `bottom-right` ? `bottom: ${size[2]}; right: ${size[2]};` - : ''} + : ``} ` return base }, @@ -203,7 +207,11 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { dbLogoCloseButton: css` font-weight: ${font.weight.semibold}; font-size: ${font.size.xs}; - background: linear-gradient(to right, rgb(249, 115, 22), rgb(194, 65, 12)); + background: linear-gradient( + to right, + rgb(249, 115, 22), + rgb(194, 65, 12) + ); background-clip: text; -webkit-background-clip: text; line-height: 1; @@ -266,7 +274,7 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { padding: ${size[1]} ${size[1.5]} ${size[0.5]} ${size[1.5]}; &::after { - content: ' '; + content: " "; position: absolute; top: 100%; left: -${size[2.5]}; @@ -287,7 +295,7 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { cursor: pointer; background-color: ${colors.darkGray[700]}; transition: all 0.2s ease; - + &:hover { background-color: ${colors.darkGray[600]}; } @@ -424,7 +432,7 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { cursor: pointer; font-size: ${fontSize.xs}; font-weight: ${font.weight.medium}; - + &:hover { background: ${colors.darkGray[500]}; border-color: ${colors.gray[500]}; @@ -434,7 +442,7 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { background: ${colors.blue[500]}; color: ${colors.white}; border-color: ${colors.blue[400]}; - + &:hover { background: ${colors.blue[600]}; border-color: ${colors.blue[500]}; @@ -454,6 +462,6 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { export function useStyles() { const shadowDomTarget = useContext(ShadowDomTargetContext) - const [_styles] = createSignal(stylesFactory(shadowDomTarget as ShadowRoot | undefined)) + const [_styles] = createSignal(stylesFactory(shadowDomTarget)) return _styles -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/utils.tsx b/packages/db-devtools/src/utils.tsx index 1f555de2d..a2116a068 100644 --- a/packages/db-devtools/src/utils.tsx +++ b/packages/db-devtools/src/utils.tsx @@ -1,75 +1,71 @@ -import { createSignal, onMount } from 'solid-js' -import type { Accessor } from 'solid-js' +import { createSignal, onMount } from "solid-js" +import type { Accessor } from "solid-js" export function useIsMounted(): Accessor { const [isMounted, setIsMounted] = createSignal(false) - + onMount(() => { setIsMounted(true) }) - + return isMounted } export function multiSortBy( - items: T[], - sorters: ((item: T) => any)[], -): T[] { + items: Array, + sorters: Array<(item: T) => any> +): Array { return [...items].sort((a, b) => { - for (let i = 0; i < sorters.length; i++) { - const sorter = sorters[i] - if (!sorter) continue - + for (const sorter of sorters) { const aVal = sorter(a) const bVal = sorter(b) - if (aVal < bVal) return -1 if (aVal > bVal) return 1 - } + } return 0 }) } export function getStatusColor(status: string): string { switch (status) { - case 'active': - case 'success': - return 'green' - case 'error': - case 'failed': - return 'red' - case 'pending': - case 'loading': - return 'yellow' - case 'idle': + case `active`: + case `success`: + return `green` + case `error`: + case `failed`: + return `red` + case `pending`: + case `loading`: + return `yellow` + case `idle`: default: - return 'gray' + return `gray` } } export function displayValue(value: any, space?: number): string { - if (typeof value === 'string') { + if (typeof value === `string`) { return JSON.stringify(value) } - - if (typeof value === 'number' || typeof value === 'boolean') { + + if (typeof value === `number` || typeof value === `boolean`) { return String(value) -} + } if (value === null) { - return 'null' + return `null` } - + if (value === undefined) { - return 'undefined' + return `undefined` } - - if (typeof value === 'object') { + + if (typeof value === `object`) { return JSON.stringify(value, null, space) } - + return String(value) - } +} export function formatTimestamp(timestamp: number): string { const date = new Date(timestamp) @@ -78,32 +74,29 @@ export function formatTimestamp(timestamp: number): string { export function truncate(str: string, length: number): string { if (str.length <= length) return str - return str.slice(0, length) + '...' + return str.slice(0, length) + `...` } export function isObject(value: any): value is object { - return value !== null && typeof value === 'object' + return value !== null && typeof value === `object` } -export function isArray(value: any): value is any[] { +export function isArray(value: any): value is Array { return Array.isArray(value) } -export function getKeys(obj: any): string[] { +export function getKeys(obj: any): Array { if (!isObject(obj)) return [] return Object.keys(obj) } -export function sortBy( - items: T[], - sorter: (item: T) => any, -): T[] { +export function sortBy(items: Array, sorter: (item: T) => any): Array { return [...items].sort((a, b) => { const aVal = sorter(a) const bVal = sorter(b) - + if (aVal < bVal) return -1 if (aVal > bVal) return 1 return 0 }) -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/utils/formatTime.ts b/packages/db-devtools/src/utils/formatTime.ts index 7b74d8bdf..0e591e07d 100644 --- a/packages/db-devtools/src/utils/formatTime.ts +++ b/packages/db-devtools/src/utils/formatTime.ts @@ -1,7 +1,7 @@ export function formatTime(ms: number): string { - if (ms === 0) return '0s' - - const units = ['s', 'min', 'h', 'd'] + if (ms === 0) return `0s` + + const units = [`s`, `min`, `h`, `d`] const values = [ms / 1000, ms / 60000, ms / 3600000, ms / 86400000] let chosenUnitIndex = 0 @@ -11,10 +11,10 @@ export function formatTime(ms: number): string { } const formatter = new Intl.NumberFormat(navigator.language, { - compactDisplay: 'short', - notation: 'compact', + compactDisplay: `short`, + notation: `compact`, maximumFractionDigits: 0, }) return formatter.format(values[chosenUnitIndex]!) + units[chosenUnitIndex] -} \ No newline at end of file +} diff --git a/packages/db-devtools/src/utils/index.ts b/packages/db-devtools/src/utils/index.ts index f3cdbea4c..1e7072760 100644 --- a/packages/db-devtools/src/utils/index.ts +++ b/packages/db-devtools/src/utils/index.ts @@ -1 +1 @@ -export { formatTime } from './formatTime' \ No newline at end of file +export { formatTime } from "./formatTime" diff --git a/packages/db-devtools/tsup.config.ts b/packages/db-devtools/tsup.config.ts index f92a71523..ab62ae712 100644 --- a/packages/db-devtools/tsup.config.ts +++ b/packages/db-devtools/tsup.config.ts @@ -1,20 +1,20 @@ -import { defineConfig } from 'tsup' +import { defineConfig } from "tsup" export default defineConfig({ - entry: ['src/index.ts'], - format: ['esm', 'cjs'], + entry: [`src/index.ts`], + format: [`esm`, `cjs`], dts: true, sourcemap: true, clean: true, - outDir: 'build', - external: ['solid-js', 'solid-js/web', '@tanstack/db'], + outDir: `build`, + external: [`solid-js`, `solid-js/web`, `@tanstack/db`], esbuildOptions(options) { // Use SolidJS-compatible JSX settings - options.jsx = 'automatic' - options.jsxImportSource = 'solid-js' + options.jsx = `automatic` + options.jsxImportSource = `solid-js` // Add SolidJS runtime helpers options.banner = { - js: 'import{template as _$template,delegateEvents as _$delegateEvents,addEventListener as _$addEventListener,classList as _$classList,style as _$style,setAttribute as _$setAttribute,setProperty as _$setProperty,className as _$className,textContent as _$textContent,innerHTML as _$innerHTML}from"solid-js/web";' + js: `import{template as _$template,delegateEvents as _$delegateEvents,addEventListener as _$addEventListener,classList as _$classList,style as _$style,setAttribute as _$setAttribute,setProperty as _$setProperty,className as _$className,textContent as _$textContent,innerHTML as _$innerHTML}from"solid-js/web";`, } }, -}) \ No newline at end of file +}) diff --git a/packages/db-devtools/vite.config.ts b/packages/db-devtools/vite.config.ts index d32884354..7ff1ef8c4 100644 --- a/packages/db-devtools/vite.config.ts +++ b/packages/db-devtools/vite.config.ts @@ -1,25 +1,25 @@ -import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' -import dts from 'vite-plugin-dts' +import { defineConfig } from "vite" +import solid from "vite-plugin-solid" +import dts from "vite-plugin-dts" export default defineConfig({ plugins: [ - solid(), + solid(), dts({ insertTypesEntry: true, - include: ['src/**/*'], - exclude: ['src/**/*.test.*', 'src/__tests__/**/*'] - }) + include: [`src/**/*`], + exclude: [`src/**/*.test.*`, `src/__tests__/**/*`], + }), ], build: { - target: 'esnext', + target: `esnext`, lib: { - entry: 'src/index.ts', - formats: ['es', 'cjs'], - fileName: (format) => `index.${format === 'es' ? 'js' : 'cjs'}`, + entry: `src/index.ts`, + formats: [`es`, `cjs`], + fileName: (format) => `index.${format === `es` ? `js` : `cjs`}`, }, rollupOptions: { - external: ['solid-js', 'solid-js/web', '@tanstack/db'], + external: [`solid-js`, `solid-js/web`, `@tanstack/db`], }, }, -}) \ No newline at end of file +}) diff --git a/packages/db/src/collection.ts b/packages/db/src/collection.ts index 5109fc767..5d5291ecd 100644 --- a/packages/db/src/collection.ts +++ b/packages/db/src/collection.ts @@ -26,7 +26,7 @@ export const collectionsStore = new Map>() function registerWithDevtools(collection: CollectionImpl): void { if (typeof window !== `undefined`) { if ((window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { - (window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__(collection) + ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__(collection) ;(collection as any).isRegisteredWithDevtools = true } else { ;(collection as any).isRegisteredWithDevtools = false @@ -37,7 +37,9 @@ function registerWithDevtools(collection: CollectionImpl): void { // Declare the devtools registry on window declare global { interface Window { - __TANSTACK_DB_DEVTOOLS_REGISTER__?: (collection: CollectionImpl) => void + __TANSTACK_DB_DEVTOOLS_REGISTER__?: ( + collection: CollectionImpl + ) => void __TANSTACK_DB_DEVTOOLS_UNREGISTER__?: (id: string) => void } } @@ -552,8 +554,11 @@ export class CollectionImpl< } // Unregister from devtools if available - if (typeof window !== `undefined` && (window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__) { - (window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__(this.id) + if ( + typeof window !== `undefined` && + (window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__ + ) { + ;(window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__(this.id) this.isRegisteredWithDevtools = false } diff --git a/packages/react-db-devtools/package.json b/packages/react-db-devtools/package.json index 43c4117e0..3d706e8c9 100644 --- a/packages/react-db-devtools/package.json +++ b/packages/react-db-devtools/package.json @@ -75,6 +75,7 @@ "test:lib": "vitest", "test:lib:dev": "pnpm run test:lib --watch", "test:build": "publint --strict && attw --pack", + "lint": "eslint . --fix", "build": "tsup --tsconfig tsconfig.prod.json", "build:dev": "tsup --watch" }, diff --git a/packages/react-db-devtools/src/ReactDbDevtools.tsx b/packages/react-db-devtools/src/ReactDbDevtools.tsx index ae5dacc55..1214ee654 100644 --- a/packages/react-db-devtools/src/ReactDbDevtools.tsx +++ b/packages/react-db-devtools/src/ReactDbDevtools.tsx @@ -1,46 +1,50 @@ "use client" import { useEffect, useRef, useState } from "react" import { TanstackDbDevtools } from "@tanstack/db-devtools" -import type { TanstackDbDevtoolsConfig } from "@tanstack/db-devtools" import { initializeDbDevtools } from "./index" +import type { TanstackDbDevtoolsConfig } from "@tanstack/db-devtools" export interface TanStackReactDbDevtoolsProps extends TanstackDbDevtoolsConfig { // Additional React-specific props if needed } -export function TanStackReactDbDevtools(props: TanStackReactDbDevtoolsProps = {}) { +export function TanStackReactDbDevtools( + props: TanStackReactDbDevtoolsProps = {} +) { const ref = useRef(null) const [devtools, setDevtools] = useState(null) const initializingRef = useRef(false) // Initialize devtools only on client side useEffect(() => { - if (typeof window === 'undefined' || !ref.current || initializingRef.current) { + if ( + typeof window === `undefined` || + !ref.current || + initializingRef.current + ) { return } - + // Set flag to prevent multiple initializations initializingRef.current = true - + // Note: Devtools registry is now initialized in collections.ts before collections are created initializeDbDevtools() const devtoolsInstance = new TanstackDbDevtools(props) - + try { // Mount the devtools to the DOM element devtoolsInstance.mount(ref.current) setDevtools(devtoolsInstance) - } catch (error) { + } catch { initializingRef.current = false // Reset flag on error } - + return () => { try { // Only unmount if the devtools were successfully mounted - if (devtoolsInstance) { - devtoolsInstance.unmount() - } - } catch (error) { + devtoolsInstance.unmount() + } catch { // Ignore unmount errors if devtools weren't mounted } initializingRef.current = false @@ -50,7 +54,7 @@ export function TanStackReactDbDevtools(props: TanStackReactDbDevtoolsProps = {} // Update devtools when props change useEffect(() => { if (!devtools) return - + if (props.initialIsOpen !== undefined) { devtools.setInitialIsOpen(props.initialIsOpen) } diff --git a/packages/react-db-devtools/src/index.ts b/packages/react-db-devtools/src/index.ts index 2d3090b1a..c86e6d77f 100644 --- a/packages/react-db-devtools/src/index.ts +++ b/packages/react-db-devtools/src/index.ts @@ -1,17 +1,18 @@ -'use client' +"use client" -import * as React from 'react' +import * as React from "react" function DevtoolsWrapper(props: any) { const [isClient, setIsClient] = React.useState(false) - const [DevtoolsComponent, setDevtoolsComponent] = React.useState | null>(null) + const [DevtoolsComponent, setDevtoolsComponent] = + React.useState | null>(null) React.useEffect(() => { // Only run on client after hydration setIsClient(true) - + // Dynamically import the devtools component - import('./ReactDbDevtools').then((module) => { + import(`./ReactDbDevtools`).then((module) => { setDevtoolsComponent(() => module.TanStackReactDbDevtools) }) }, []) @@ -26,23 +27,25 @@ function DevtoolsWrapper(props: any) { // Follow TanStack Query devtools pattern exactly export const TanStackReactDbDevtools: React.ComponentType = - typeof window === 'undefined' || process.env.NODE_ENV !== 'development' + typeof window === `undefined` || process.env.NODE_ENV !== `development` ? () => null : DevtoolsWrapper -export type { TanStackReactDbDevtoolsProps } from './ReactDbDevtools' +export type { TanStackReactDbDevtoolsProps } from "./ReactDbDevtools" // SSR-safe initialization function - just call the core devtools export function initializeDbDevtools(): void { // SSR safety check - if (typeof window === 'undefined') { + if (typeof window === `undefined`) { return } // Just import and call the core devtools initialization - import('@tanstack/db-devtools').then((module) => { - module.initializeDbDevtools() - }).catch((error) => { - // Silently fail if core devtools module can't be loaded - }) + import(`@tanstack/db-devtools`) + .then((module) => { + module.initializeDbDevtools() + }) + .catch(() => { + // Silently fail if core devtools module can't be loaded + }) } diff --git a/packages/react-db-devtools/tsup.config.ts b/packages/react-db-devtools/tsup.config.ts index 16ffb879c..c9becf00f 100644 --- a/packages/react-db-devtools/tsup.config.ts +++ b/packages/react-db-devtools/tsup.config.ts @@ -1,22 +1,32 @@ -import { defineConfig } from 'tsup' +import { defineConfig } from "tsup" export default defineConfig([ { - entry: ['src/*.ts', 'src/*.tsx'], - format: ['esm', 'cjs'], + entry: [`src/*.ts`, `src/*.tsx`], + format: [`esm`, `cjs`], dts: true, sourcemap: true, clean: true, - external: ['react', 'react-dom', '@tanstack/react-db', '@tanstack/db-devtools'], - outDir: 'build/modern', + external: [ + `react`, + `react-dom`, + `@tanstack/react-db`, + `@tanstack/db-devtools`, + ], + outDir: `build/modern`, }, { - entry: ['src/*.ts', 'src/*.tsx'], - format: ['esm', 'cjs'], + entry: [`src/*.ts`, `src/*.tsx`], + format: [`esm`, `cjs`], dts: true, sourcemap: true, clean: false, - external: ['react', 'react-dom', '@tanstack/react-db', '@tanstack/db-devtools'], - outDir: 'build/legacy', + external: [ + `react`, + `react-dom`, + `@tanstack/react-db`, + `@tanstack/db-devtools`, + ], + outDir: `build/legacy`, }, -]) \ No newline at end of file +]) From e0140f88ceb9fd8728237c6923d09ebb0aea99c3 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Tue, 15 Jul 2025 15:46:29 +0100 Subject: [PATCH 16/25] wip --- packages/db-collections/src/electric.ts | 1 + packages/db-collections/src/local-only.ts | 1 + packages/db-collections/src/local-storage.ts | 1 + packages/db-collections/src/query.ts | 6 +- .../src/components/CollectionsPanel.tsx | 159 ++++++++++++------ packages/db-devtools/src/registry.ts | 19 +-- packages/db-devtools/src/types.ts | 2 +- .../db/src/query/live-query-collection.ts | 2 +- packages/db/src/types.ts | 4 +- 9 files changed, 121 insertions(+), 74 deletions(-) diff --git a/packages/db-collections/src/electric.ts b/packages/db-collections/src/electric.ts index 9205fcd3f..0a4fc2be3 100644 --- a/packages/db-collections/src/electric.ts +++ b/packages/db-collections/src/electric.ts @@ -424,6 +424,7 @@ export function electricCollectionOptions< utils: { awaitTxId, }, + collectionType: `electric` as const, } } diff --git a/packages/db-collections/src/local-only.ts b/packages/db-collections/src/local-only.ts index 74bf974b1..5723438cb 100644 --- a/packages/db-collections/src/local-only.ts +++ b/packages/db-collections/src/local-only.ts @@ -211,6 +211,7 @@ export function localOnlyCollectionOptions< utils: {} as LocalOnlyCollectionUtils, startSync: true, gcTime: 0, + collectionType: `local-only` as const, } } diff --git a/packages/db-collections/src/local-storage.ts b/packages/db-collections/src/local-storage.ts index 0b0ebc634..d96b44332 100644 --- a/packages/db-collections/src/local-storage.ts +++ b/packages/db-collections/src/local-storage.ts @@ -432,6 +432,7 @@ export function localStorageCollectionOptions< clearStorage, getStorageSize, }, + collectionType: `local-storage` as const, } } diff --git a/packages/db-collections/src/query.ts b/packages/db-collections/src/query.ts index 5fe77f1f9..5a8946d67 100644 --- a/packages/db-collections/src/query.ts +++ b/packages/db-collections/src/query.ts @@ -232,7 +232,10 @@ export function queryCollectionOptions< TQueryKey extends QueryKey = QueryKey, >( config: QueryCollectionConfig -): CollectionConfig & { utils: QueryCollectionUtils } { +): CollectionConfig & { + utils: QueryCollectionUtils + collectionType: `query` +} { const { queryKey, queryFn, @@ -446,5 +449,6 @@ export function queryCollectionOptions< utils: { refetch, }, + collectionType: `query` as const, } } diff --git a/packages/db-devtools/src/components/CollectionsPanel.tsx b/packages/db-devtools/src/components/CollectionsPanel.tsx index 5e3b907ee..aa03731ea 100644 --- a/packages/db-devtools/src/components/CollectionsPanel.tsx +++ b/packages/db-devtools/src/components/CollectionsPanel.tsx @@ -26,13 +26,84 @@ export function CollectionsPanel({ }) // Group collections by type - const standardCollections = createMemo(() => - sortedCollections().filter((c) => c.type === `collection`) - ) + const groupedCollections = createMemo(() => { + const groups: Record> = { + "live-query": [], + electric: [], + query: [], + "local-only": [], + "local-storage": [], + generic: [], + } - const liveCollections = createMemo(() => - sortedCollections().filter((c) => c.type === `live-query`) - ) + sortedCollections().forEach((collection) => { + const type = collection.type + const targetGroup = (groups as any)[type] || groups[`generic`] + targetGroup.push(collection) + }) + + // Sort collections within each group alphabetically + Object.keys(groups).forEach((key) => { + const group = groups[key] + if (group) { + group.sort((a, b) => + a.id.toLowerCase().localeCompare(b.id.toLowerCase()) + ) + } + }) + + return groups + }) + + const getGroupDisplayName = (type: string): string => { + switch (type) { + case `live-query`: + return `Live Queries` + case `electric`: + return `Electric Collections` + case `query`: + return `Query Collections` + case `local-only`: + return `Local-Only Collections` + case `local-storage`: + return `Local Storage Collections` + case `generic`: + return `Generic Collections` + default: + return `${type.charAt(0).toUpperCase() + type.slice(1)} Collections` + } + } + + const getGroupStats = (type: string): Array => { + switch (type) { + case `live-query`: + return [`Items`, `/`, `GC`, `/`, `Status`] + case `electric`: + return [`Items`, `/`, `Txn`, `/`, `GC`, `/`, `Status`] + case `query`: + return [`Items`, `/`, `Txn`, `/`, `GC`, `/`, `Status`] + case `local-only`: + return [`Items`, `/`, `Txn`, `/`, `GC`, `/`, `Status`] + case `local-storage`: + return [`Items`, `/`, `Txn`, `/`, `GC`, `/`, `Status`] + case `generic`: + return [`Items`, `/`, `Txn`, `/`, `GC`, `/`, `Status`] + default: + return [`Items`, `/`, `Txn`, `/`, `GC`, `/`, `Status`] + } + } + + // Get sorted group entries with live-query first, then alphabetical + const sortedGroupEntries = createMemo(() => { + const entries = Object.entries(groupedCollections()) + return entries.sort(([a], [b]) => { + // Live-query always comes first + if (a === `live-query`) return -1 + if (b === `live-query`) return 1 + // Others are sorted alphabetically + return a.localeCompare(b) + }) + }) return (
@@ -45,57 +116,33 @@ export function CollectionsPanel({
} > - {/* Standard Collections */} - 0}> -
-
-
Standard Collections ({standardCollections().length})
-
- Items - / - Txn - / - GC - / - Status -
-
- - {(collection) => ( - collection.id === activeCollectionId()} - onSelect={onSelectCollection} - /> - )} - -
-
- - {/* Live Collections */} - 0}> -
-
-
Live Collections ({liveCollections().length})
-
- Items - / - GC - / - Status + + {([type, collections]) => ( + 0}> +
+
+
+ {getGroupDisplayName(type)} ({collections.length}) +
+
+ + {(stat) => {stat}} + +
+
+ + {(collection) => ( + collection.id === activeCollectionId()} + onSelect={onSelectCollection} + /> + )} +
-
- - {(collection) => ( - collection.id === activeCollectionId()} - onSelect={onSelectCollection} - /> - )} - -
- + + )} +
diff --git a/packages/db-devtools/src/registry.ts b/packages/db-devtools/src/registry.ts index 810c40bce..17de4083b 100644 --- a/packages/db-devtools/src/registry.ts +++ b/packages/db-devtools/src/registry.ts @@ -237,21 +237,14 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { }, POLLING_INTERVAL_MS) } - private detectCollectionType = ( - collection: any - ): `collection` | `live-query` => { - // Check the devtools type marker first - if (collection.config.__devtoolsType) { - return collection.config.__devtoolsType + private detectCollectionType = (collection: any): string => { + // Check the new collection type marker first + if (collection.config.collectionType) { + return collection.config.collectionType } - // Check if the collection ID suggests it's a live query - if (collection.id.startsWith(`live-query-`)) { - return `live-query` - } - - // Default to regular collection - return `collection` + // Default to generic collection + return `generic` } private isLiveQuery = (collection: any): boolean => { diff --git a/packages/db-devtools/src/types.ts b/packages/db-devtools/src/types.ts index 880fea31a..efcf817c1 100644 --- a/packages/db-devtools/src/types.ts +++ b/packages/db-devtools/src/types.ts @@ -48,7 +48,7 @@ export interface DbDevtoolsConfig { export interface CollectionMetadata { id: string - type: `collection` | `live-query` + type: string status: CollectionStatus size: number hasTransactions: boolean diff --git a/packages/db/src/query/live-query-collection.ts b/packages/db/src/query/live-query-collection.ts index 77d9edea8..85a1b1e2f 100644 --- a/packages/db/src/query/live-query-collection.ts +++ b/packages/db/src/query/live-query-collection.ts @@ -340,7 +340,7 @@ export function liveQueryCollectionOptions< onDelete: config.onDelete, startSync: config.startSync, // Mark as live query for devtools - __devtoolsType: `live-query` as const, + collectionType: `live-query` as const, } } diff --git a/packages/db/src/types.ts b/packages/db/src/types.ts index cb9e20b02..eb9140461 100644 --- a/packages/db/src/types.ts +++ b/packages/db/src/types.ts @@ -331,10 +331,10 @@ export interface CollectionConfig< */ compare?: (x: T, y: T) => number /** - * Internal field used by devtools to identify collection type + * Collection type for devtools grouping and identification * @internal */ - __devtoolsType?: `live-query` | `collection` + collectionType?: string /** * Optional asynchronous handler function called before an insert operation * @param params Object containing transaction and collection information From b852821e42542dfb8297d2a66b993cb6f773c487 Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Tue, 15 Jul 2025 16:38:36 +0100 Subject: [PATCH 17/25] wip --- .../query-devtools/eslint.config.js | 5 - .../query-devtools/package.json | 82 - .../query-devtools/root.eslint.config.js | 1 - .../query-devtools/src/Devtools.tsx | 3570 ----------------- .../query-devtools/src/DevtoolsComponent.tsx | 36 - .../src/DevtoolsPanelComponent.tsx | 47 - .../query-devtools/src/Explorer.tsx | 660 --- .../src/TanstackQueryDevtools.tsx | 141 - .../src/TanstackQueryDevtoolsPanel.tsx | 153 - .../src/__tests__/devtools.test.tsx | 7 - .../src/__tests__/utils.test.ts | 732 ---- .../query-devtools/src/constants.ts | 17 - .../src/contexts/PiPContext.tsx | 191 - .../src/contexts/QueryDevtoolsContext.ts | 44 - .../src/contexts/ThemeContext.ts | 10 - .../query-devtools/src/contexts/index.ts | 3 - .../query-devtools/src/icons/index.tsx | 1385 ------- .../query-devtools/src/index.ts | 13 - .../query-devtools/src/theme.ts | 299 -- .../query-devtools/src/utils.tsx | 323 -- .../query-devtools/tsconfig.json | 11 - .../query-devtools/tsconfig.prod.json | 8 - .../query-devtools/tsup.config.ts | 22 - .../query-devtools/vite.config.ts | 28 - .../react-query-devtools/.attw.json | 3 - .../react-query-devtools/eslint.config.js | 24 - .../react-query-devtools/package.json | 96 - .../root.eslint.config.js | 1 - .../react-query-devtools/root.tsup.config.js | 1 - .../src/ReactQueryDevtools.tsx | 110 - .../src/ReactQueryDevtoolsPanel.tsx | 91 - .../src/__tests__/devtools.test.tsx | 7 - .../src/__tests__/not-development.test.tsx | 9 - .../react-query-devtools/src/index.ts | 18 - .../react-query-devtools/src/production.ts | 7 - .../react-query-devtools/test-setup.ts | 12 - .../react-query-devtools/tsconfig.json | 16 - .../react-query-devtools/tsconfig.legacy.json | 10 - .../react-query-devtools/tsconfig.prod.json | 8 - .../react-query-devtools/tsup.config.ts | 7 - .../react-query-devtools/vite.config.ts | 29 - .../vue-query-devtools/.attw.json | 7 - .../vue-query-devtools/eslint.config.js | 7 - .../vue-query-devtools/package.json | 68 - .../vue-query-devtools/root.eslint.config.js | 1 - .../vue-query-devtools/src/devtools.vue | 42 - .../vue-query-devtools/src/index.ts | 11 - .../vue-query-devtools/src/production.ts | 3 - .../vue-query-devtools/src/types.ts | 41 - .../vue-query-devtools/tsconfig.json | 15 - .../vue-query-devtools/vite.config.ts | 26 - .../react-router-devtools/README.md | 5 - .../react-router-devtools/eslint.config.js | 31 - .../react-router-devtools/package.json | 77 - .../src/TanStackRouterDevtools.tsx | 126 - .../src/TanStackRouterDevtoolsPanel.tsx | 87 - .../react-router-devtools/src/index.ts | 22 - .../react-router-devtools/tsconfig.json | 8 - .../react-router-devtools/vite.config.ts | 24 - .../router-devtools-core/README.md | 5 - .../router-devtools-core/eslint.config.js | 20 - .../router-devtools-core/media/logo.sketch | Bin 353553 -> 0 bytes .../router-devtools-core/media/logo.svg | 16 - .../router-devtools-core/media/repo-dark.png | Bin 155546 -> 0 bytes .../router-devtools-core/package.json | 83 - .../router-devtools-core/src/AgeTicker.tsx | 59 - .../src/BaseTanStackRouterDevtoolsPanel.tsx | 632 --- .../router-devtools-core/src/Explorer.tsx | 339 -- .../src/FloatingTanStackRouterDevtools.tsx | 290 -- .../src/NavigateButton.tsx | 25 - .../src/TanStackRouterDevtoolsCore.tsx | 163 - .../src/TanStackRouterDevtoolsPanelCore.tsx | 131 - .../router-devtools-core/src/context.ts | 24 - .../router-devtools-core/src/index.tsx | 2 - .../router-devtools-core/src/logo.tsx | 817 ---- .../router-devtools-core/src/theme.tsx | 36 - .../router-devtools-core/src/tokens.ts | 305 -- .../src/useLocalStorage.ts | 52 - .../router-devtools-core/src/useMediaQuery.ts | 44 - .../router-devtools-core/src/useStyles.tsx | 614 --- .../router-devtools-core/src/utils.tsx | 185 - .../router-devtools-core/tsconfig.json | 8 - .../router-devtools-core/vite.config.ts | 16 - .../tanstack-router/router-devtools/README.md | 5 - .../router-devtools/eslint.config.js | 32 - .../router-devtools/package.json | 85 - .../router-devtools/src/index.tsx | 6 - .../router-devtools/tsconfig.json | 7 - .../router-devtools/vite.config.ts | 16 - .../src/BaseTanStackDbDevtoolsPanel.tsx | 148 +- .../src/components/CollectionsPanel.tsx | 8 +- packages/db-devtools/src/constants.ts | 1 - packages/db-devtools/src/devtools.ts | 117 +- packages/db-devtools/src/registry.ts | 143 +- packages/db-devtools/src/types.ts | 12 +- packages/db-devtools/tsconfig.json | 4 +- packages/db/src/collection.ts | 42 +- packages/db/tsconfig.json | 2 +- tsconfig.json | 2 +- 99 files changed, 270 insertions(+), 13064 deletions(-) delete mode 100644 devtools-reference/tanstack-query/query-devtools/eslint.config.js delete mode 100644 devtools-reference/tanstack-query/query-devtools/package.json delete mode 120000 devtools-reference/tanstack-query/query-devtools/root.eslint.config.js delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/Devtools.tsx delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/DevtoolsComponent.tsx delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/DevtoolsPanelComponent.tsx delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/Explorer.tsx delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtools.tsx delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtoolsPanel.tsx delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/__tests__/devtools.test.tsx delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/__tests__/utils.test.ts delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/constants.ts delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/contexts/PiPContext.tsx delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/contexts/QueryDevtoolsContext.ts delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/contexts/ThemeContext.ts delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/contexts/index.ts delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/icons/index.tsx delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/index.ts delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/theme.ts delete mode 100644 devtools-reference/tanstack-query/query-devtools/src/utils.tsx delete mode 100644 devtools-reference/tanstack-query/query-devtools/tsconfig.json delete mode 100644 devtools-reference/tanstack-query/query-devtools/tsconfig.prod.json delete mode 100644 devtools-reference/tanstack-query/query-devtools/tsup.config.ts delete mode 100644 devtools-reference/tanstack-query/query-devtools/vite.config.ts delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/.attw.json delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/eslint.config.js delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/package.json delete mode 120000 devtools-reference/tanstack-query/react-query-devtools/root.eslint.config.js delete mode 120000 devtools-reference/tanstack-query/react-query-devtools/root.tsup.config.js delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtools.tsx delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtoolsPanel.tsx delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/src/__tests__/devtools.test.tsx delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/src/__tests__/not-development.test.tsx delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/src/index.ts delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/src/production.ts delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/test-setup.ts delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/tsconfig.json delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/tsconfig.legacy.json delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/tsconfig.prod.json delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/tsup.config.ts delete mode 100644 devtools-reference/tanstack-query/react-query-devtools/vite.config.ts delete mode 100644 devtools-reference/tanstack-query/vue-query-devtools/.attw.json delete mode 100644 devtools-reference/tanstack-query/vue-query-devtools/eslint.config.js delete mode 100644 devtools-reference/tanstack-query/vue-query-devtools/package.json delete mode 120000 devtools-reference/tanstack-query/vue-query-devtools/root.eslint.config.js delete mode 100644 devtools-reference/tanstack-query/vue-query-devtools/src/devtools.vue delete mode 100644 devtools-reference/tanstack-query/vue-query-devtools/src/index.ts delete mode 100644 devtools-reference/tanstack-query/vue-query-devtools/src/production.ts delete mode 100644 devtools-reference/tanstack-query/vue-query-devtools/src/types.ts delete mode 100644 devtools-reference/tanstack-query/vue-query-devtools/tsconfig.json delete mode 100644 devtools-reference/tanstack-query/vue-query-devtools/vite.config.ts delete mode 100644 devtools-reference/tanstack-router/react-router-devtools/README.md delete mode 100644 devtools-reference/tanstack-router/react-router-devtools/eslint.config.js delete mode 100644 devtools-reference/tanstack-router/react-router-devtools/package.json delete mode 100644 devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtools.tsx delete mode 100644 devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtoolsPanel.tsx delete mode 100644 devtools-reference/tanstack-router/react-router-devtools/src/index.ts delete mode 100644 devtools-reference/tanstack-router/react-router-devtools/tsconfig.json delete mode 100644 devtools-reference/tanstack-router/react-router-devtools/vite.config.ts delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/README.md delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/eslint.config.js delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/media/logo.sketch delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/media/logo.svg delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/media/repo-dark.png delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/package.json delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/AgeTicker.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/BaseTanStackRouterDevtoolsPanel.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/Explorer.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/NavigateButton.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsPanelCore.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/context.ts delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/index.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/logo.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/theme.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/tokens.ts delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/useLocalStorage.ts delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/useMediaQuery.ts delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/useStyles.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/src/utils.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/tsconfig.json delete mode 100644 devtools-reference/tanstack-router/router-devtools-core/vite.config.ts delete mode 100644 devtools-reference/tanstack-router/router-devtools/README.md delete mode 100644 devtools-reference/tanstack-router/router-devtools/eslint.config.js delete mode 100644 devtools-reference/tanstack-router/router-devtools/package.json delete mode 100644 devtools-reference/tanstack-router/router-devtools/src/index.tsx delete mode 100644 devtools-reference/tanstack-router/router-devtools/tsconfig.json delete mode 100644 devtools-reference/tanstack-router/router-devtools/vite.config.ts diff --git a/devtools-reference/tanstack-query/query-devtools/eslint.config.js b/devtools-reference/tanstack-query/query-devtools/eslint.config.js deleted file mode 100644 index df75435c7..000000000 --- a/devtools-reference/tanstack-query/query-devtools/eslint.config.js +++ /dev/null @@ -1,5 +0,0 @@ -// @ts-check - -import rootConfig from './root.eslint.config.js' - -export default [...rootConfig] diff --git a/devtools-reference/tanstack-query/query-devtools/package.json b/devtools-reference/tanstack-query/query-devtools/package.json deleted file mode 100644 index 28d1c4e99..000000000 --- a/devtools-reference/tanstack-query/query-devtools/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "@tanstack/query-devtools", - "version": "5.81.2", - "description": "Developer tools to interact with and visualize the TanStack Query cache", - "author": "tannerlinsley", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/TanStack/query.git", - "directory": "packages/query-devtools" - }, - "homepage": "https://tanstack.com/query", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "scripts": { - "clean": "premove ./build ./coverage ./dist-ts", - "compile": "tsc --build", - "test:eslint": "eslint ./src", - "test:types": "npm-run-all --serial test:types:*", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js --build", - "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js --build", - "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js --build", - "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js --build", - "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js --build", - "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js --build", - "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js --build", - "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js --build", - "test:types:tscurrent": "tsc --build", - "test:lib": "vitest", - "test:lib:dev": "pnpm run test:lib --watch", - "test:build": "publint --strict && attw --pack", - "build": "tsup --tsconfig tsconfig.prod.json", - "build:dev": "tsup --watch" - }, - "type": "module", - "main": "./build/index.cjs", - "module": "./build/index.js", - "types": "./build/index.d.ts", - "browser": {}, - "exports": { - "@tanstack/custom-condition": "./src/index.ts", - "solid": { - "development": "./build/index.js", - "import": "./build/index.js" - }, - "development": { - "import": { - "types": "./build/index.d.ts", - "default": "./build/dev.js" - }, - "require": "./build/dev.cjs" - }, - "import": { - "types": "./build/index.d.ts", - "default": "./build/index.js" - }, - "require": "./build/index.cjs" - }, - "files": [ - "build", - "src", - "!src/__tests__" - ], - "devDependencies": { - "@kobalte/core": "^0.13.4", - "@solid-primitives/keyed": "^1.2.2", - "@solid-primitives/resize-observer": "^2.0.26", - "@solid-primitives/storage": "^1.3.11", - "@tanstack/match-sorter-utils": "^8.19.4", - "@tanstack/query-core": "workspace:*", - "clsx": "^2.1.1", - "goober": "^2.1.16", - "npm-run-all2": "^5.0.0", - "solid-js": "^1.9.5", - "solid-transition-group": "^0.2.3", - "superjson": "^2.2.1", - "tsup-preset-solid": "^2.2.0", - "vite-plugin-solid": "^2.11.6" - } -} diff --git a/devtools-reference/tanstack-query/query-devtools/root.eslint.config.js b/devtools-reference/tanstack-query/query-devtools/root.eslint.config.js deleted file mode 120000 index 35dedbe5a..000000000 --- a/devtools-reference/tanstack-query/query-devtools/root.eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -../../eslint.config.js \ No newline at end of file diff --git a/devtools-reference/tanstack-query/query-devtools/src/Devtools.tsx b/devtools-reference/tanstack-query/query-devtools/src/Devtools.tsx deleted file mode 100644 index e7e640a9d..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/Devtools.tsx +++ /dev/null @@ -1,3570 +0,0 @@ -import { - For, - Show, - batch, - createEffect, - createMemo, - createSignal, - on, - onCleanup, - onMount, -} from 'solid-js' -import { rankItem } from '@tanstack/match-sorter-utils' -import * as goober from 'goober' -import { clsx as cx } from 'clsx' -import { TransitionGroup } from 'solid-transition-group' -import { Key } from '@solid-primitives/keyed' -import { createResizeObserver } from '@solid-primitives/resize-observer' -import { DropdownMenu, RadioGroup } from '@kobalte/core' -import { Portal } from 'solid-js/web' -import { tokens } from './theme' -import { - convertRemToPixels, - displayValue, - getMutationStatusColor, - getQueryStatusColor, - getQueryStatusColorByLabel, - getQueryStatusLabel, - getSidedProp, - mutationSortFns, - sortFns, -} from './utils' -import { - ArrowDown, - ArrowLeft, - ArrowRight, - ArrowUp, - CheckCircle, - ChevronDown, - LoadingCircle, - Monitor, - Moon, - Offline, - PauseCircle, - PiPIcon, - Search, - Settings, - Sun, - TanstackLogo, - Trash, - Wifi, - XCircle, -} from './icons' -import Explorer from './Explorer' -import { usePiPWindow, useQueryDevtoolsContext, useTheme } from './contexts' -import { - BUTTON_POSITION, - DEFAULT_HEIGHT, - DEFAULT_MUTATION_SORT_FN_NAME, - DEFAULT_SORT_FN_NAME, - DEFAULT_SORT_ORDER, - DEFAULT_WIDTH, - INITIAL_IS_OPEN, - POSITION, - firstBreakpoint, - secondBreakpoint, - thirdBreakpoint, -} from './constants' -import type { - DevtoolsErrorType, - DevtoolsPosition, - QueryDevtoolsProps, -} from './contexts' -import type { - Mutation, - MutationCache, - Query, - QueryCache, - QueryCacheNotifyEvent, - QueryState, -} from '@tanstack/query-core' -import type { StorageObject, StorageSetter } from '@solid-primitives/storage' -import type { Accessor, Component, JSX, Setter } from 'solid-js' - -interface DevtoolsPanelProps { - localStore: StorageObject - setLocalStore: StorageSetter -} - -interface ContentViewProps { - localStore: StorageObject - setLocalStore: StorageSetter - showPanelViewOnly?: boolean - onClose?: () => unknown -} - -interface QueryStatusProps { - label: string - color: 'green' | 'yellow' | 'gray' | 'blue' | 'purple' | 'red' - count: number -} - -const [selectedQueryHash, setSelectedQueryHash] = createSignal( - null, -) -const [selectedMutationId, setSelectedMutationId] = createSignal( - null, -) -const [panelWidth, setPanelWidth] = createSignal(0) -const [offline, setOffline] = createSignal(false) - -export type DevtoolsComponentType = Component & { - shadowDOMTarget?: ShadowRoot -} - -export const Devtools: Component = (props) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - const onlineManager = createMemo( - () => useQueryDevtoolsContext().onlineManager, - ) - onMount(() => { - const unsubscribe = onlineManager().subscribe((online) => { - setOffline(!online) - }) - - onCleanup(() => { - unsubscribe() - }) - }) - - const pip = usePiPWindow() - - const buttonPosition = createMemo(() => { - return useQueryDevtoolsContext().buttonPosition || BUTTON_POSITION - }) - - const isOpen = createMemo(() => { - return props.localStore.open === 'true' - ? true - : props.localStore.open === 'false' - ? false - : useQueryDevtoolsContext().initialIsOpen || INITIAL_IS_OPEN - }) - - const position = createMemo(() => { - return ( - props.localStore.position || - useQueryDevtoolsContext().position || - POSITION - ) - }) - - let transitionsContainerRef!: HTMLDivElement - createEffect(() => { - const root = transitionsContainerRef.parentElement as HTMLElement - const height = props.localStore.height || DEFAULT_HEIGHT - const width = props.localStore.width || DEFAULT_WIDTH - const panelPosition = position() - root.style.setProperty( - '--tsqd-panel-height', - `${panelPosition === 'top' ? '-' : ''}${height}px`, - ) - root.style.setProperty( - '--tsqd-panel-width', - `${panelPosition === 'left' ? '-' : ''}${width}px`, - ) - }) - - // Calculates the inherited font size of the parent and sets it as a CSS variable - // All the design tokens are calculated based on this variable - onMount(() => { - // This is to make sure that the font size is updated when the stylesheet is updated - // and the user focuses back on the window - const onFocus = () => { - const root = transitionsContainerRef.parentElement as HTMLElement - const fontSize = getComputedStyle(root).fontSize - root.style.setProperty('--tsqd-font-size', fontSize) - } - onFocus() - window.addEventListener('focus', onFocus) - onCleanup(() => { - window.removeEventListener('focus', onFocus) - }) - }) - - const pip_open = createMemo( - () => (props.localStore.pip_open ?? 'false') as 'true' | 'false', - ) - - return ( - <> - - - - - - - -
- - - - - - - -
- - -
-
-
-
- - ) -} - -const PiPPanel: Component<{ - children: JSX.Element -}> = (props) => { - const pip = usePiPWindow() - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const getPanelDynamicStyles = () => { - const { colors } = tokens - const t = (light: string, dark: string) => - theme() === 'dark' ? dark : light - if (panelWidth() < secondBreakpoint) { - return css` - flex-direction: column; - background-color: ${t(colors.gray[300], colors.gray[600])}; - ` - } - return css` - flex-direction: row; - background-color: ${t(colors.gray[200], colors.darkGray[900])}; - ` - } - - createEffect(() => { - const win = pip().pipWindow - const resizeCB = () => { - if (!win) return - setPanelWidth(win.innerWidth) - } - if (win) { - win.addEventListener('resize', resizeCB) - resizeCB() - } - - onCleanup(() => { - if (win) { - win.removeEventListener('resize', resizeCB) - } - }) - }) - - return ( -
- {props.children} -
- ) -} - -export const ParentPanel: Component<{ - children: JSX.Element -}> = (props) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - let panelRef!: HTMLDivElement - - onMount(() => { - createResizeObserver(panelRef, ({ width }, el) => { - if (el === panelRef) { - setPanelWidth(width) - } - }) - }) - - const getPanelDynamicStyles = () => { - const { colors } = tokens - const t = (light: string, dark: string) => - theme() === 'dark' ? dark : light - if (panelWidth() < secondBreakpoint) { - return css` - flex-direction: column; - background-color: ${t(colors.gray[300], colors.gray[600])}; - ` - } - return css` - flex-direction: row; - background-color: ${t(colors.gray[200], colors.darkGray[900])}; - ` - } - - return ( -
- {props.children} -
- ) -} - -const DraggablePanel: Component = (props) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const [isResizing, setIsResizing] = createSignal(false) - - const position = createMemo( - () => - (props.localStore.position || - useQueryDevtoolsContext().position || - POSITION) as DevtoolsPosition, - ) - - const handleDragStart: JSX.EventHandler = ( - event, - ) => { - const panelElement = event.currentTarget.parentElement - if (!panelElement) return - setIsResizing(true) - const { height, width } = panelElement.getBoundingClientRect() - const startX = event.clientX - const startY = event.clientY - let newSize = 0 - const minHeight = convertRemToPixels(3.5) - const minWidth = convertRemToPixels(12) - const runDrag = (moveEvent: MouseEvent) => { - moveEvent.preventDefault() - - if (position() === 'left' || position() === 'right') { - const valToAdd = - position() === 'right' - ? startX - moveEvent.clientX - : moveEvent.clientX - startX - newSize = Math.round(width + valToAdd) - if (newSize < minWidth) { - newSize = minWidth - } - props.setLocalStore('width', String(Math.round(newSize))) - - const newWidth = panelElement.getBoundingClientRect().width - // If the panel size didn't decrease, this means we have reached the minimum width - // of the panel so we restore the original width in local storage - // Restoring the width helps in smooth open/close transitions - if (Number(props.localStore.width) < newWidth) { - props.setLocalStore('width', String(newWidth)) - } - } else { - const valToAdd = - position() === 'bottom' - ? startY - moveEvent.clientY - : moveEvent.clientY - startY - newSize = Math.round(height + valToAdd) - // If the panel size is less than the minimum height, - // we set the size to the minimum height - if (newSize < minHeight) { - newSize = minHeight - setSelectedQueryHash(null) - } - props.setLocalStore('height', String(Math.round(newSize))) - } - } - - const unsubscribe = () => { - if (isResizing()) { - setIsResizing(false) - } - document.removeEventListener('mousemove', runDrag, false) - document.removeEventListener('mouseUp', unsubscribe, false) - } - - document.addEventListener('mousemove', runDrag, false) - document.addEventListener('mouseup', unsubscribe, false) - } - - let panelRef!: HTMLDivElement - - onMount(() => { - createResizeObserver(panelRef, ({ width }, el) => { - if (el === panelRef) { - setPanelWidth(width) - } - }) - }) - - createEffect(() => { - const rootContainer = panelRef.parentElement?.parentElement?.parentElement - if (!rootContainer) return - const currentPosition = (props.localStore.position || - POSITION) as DevtoolsPosition - const styleProp = getSidedProp('padding', currentPosition) - const isVertical = - props.localStore.position === 'left' || - props.localStore.position === 'right' - const previousPaddings = (({ - padding, - paddingTop, - paddingBottom, - paddingLeft, - paddingRight, - }) => ({ - padding, - paddingTop, - paddingBottom, - paddingLeft, - paddingRight, - }))(rootContainer.style) - - rootContainer.style[styleProp] = `${ - isVertical ? props.localStore.width : props.localStore.height - }px` - - onCleanup(() => { - Object.entries(previousPaddings).forEach(([property, previousValue]) => { - rootContainer.style[property as keyof typeof previousPaddings] = - previousValue - }) - }) - }) - - const getPanelDynamicStyles = () => { - const { colors } = tokens - const t = (light: string, dark: string) => - theme() === 'dark' ? dark : light - if (panelWidth() < secondBreakpoint) { - return css` - flex-direction: column; - background-color: ${t(colors.gray[300], colors.gray[600])}; - ` - } - return css` - flex-direction: row; - background-color: ${t(colors.gray[200], colors.darkGray[900])}; - ` - } - - return ( - - ) -} - -export const ContentView: Component = (props) => { - setupQueryCacheSubscription() - setupMutationCacheSubscription() - let containerRef!: HTMLDivElement - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const pip = usePiPWindow() - - const [selectedView, setSelectedView] = createSignal<'queries' | 'mutations'>( - 'queries', - ) - - const sort = createMemo(() => props.localStore.sort || DEFAULT_SORT_FN_NAME) - const sortOrder = createMemo( - () => Number(props.localStore.sortOrder) || DEFAULT_SORT_ORDER, - ) as () => 1 | -1 - - const mutationSort = createMemo( - () => props.localStore.mutationSort || DEFAULT_MUTATION_SORT_FN_NAME, - ) - const mutationSortOrder = createMemo( - () => Number(props.localStore.mutationSortOrder) || DEFAULT_SORT_ORDER, - ) as () => 1 | -1 - - const sortFn = createMemo(() => sortFns[sort() as string]) - const mutationSortFn = createMemo( - () => mutationSortFns[mutationSort() as string], - ) - - const onlineManager = createMemo( - () => useQueryDevtoolsContext().onlineManager, - ) - - const query_cache = createMemo(() => { - return useQueryDevtoolsContext().client.getQueryCache() - }) - - const mutation_cache = createMemo(() => { - return useQueryDevtoolsContext().client.getMutationCache() - }) - - const queryCount = createSubscribeToQueryCacheBatcher((queryCache) => { - return queryCache().getAll().length - }, false) - - const queries = createMemo( - on( - () => [queryCount(), props.localStore.filter, sort(), sortOrder()], - () => { - const curr = query_cache().getAll() - - const filtered = props.localStore.filter - ? curr.filter( - (item) => - rankItem(item.queryHash, props.localStore.filter || '').passed, - ) - : [...curr] - - const sorted = sortFn() - ? filtered.sort((a, b) => sortFn()!(a, b) * sortOrder()) - : filtered - return sorted - }, - ), - ) - - const mutationCount = createSubscribeToMutationCacheBatcher( - (mutationCache) => { - return mutationCache().getAll().length - }, - false, - ) - - const mutations = createMemo( - on( - () => [ - mutationCount(), - props.localStore.mutationFilter, - mutationSort(), - mutationSortOrder(), - ], - () => { - const curr = mutation_cache().getAll() - - const filtered = props.localStore.mutationFilter - ? curr.filter((item) => { - const value = `${ - item.options.mutationKey - ? JSON.stringify(item.options.mutationKey) + ' - ' - : '' - }${new Date(item.state.submittedAt).toLocaleString()}` - return rankItem(value, props.localStore.mutationFilter || '') - .passed - }) - : [...curr] - - const sorted = mutationSortFn() - ? filtered.sort( - (a, b) => mutationSortFn()!(a, b) * mutationSortOrder(), - ) - : filtered - return sorted - }, - ), - ) - - const setDevtoolsPosition = (pos: DevtoolsPosition) => { - props.setLocalStore('position', pos) - } - - // Sets the Font Size variable on portal menu elements since they will be outside - // the main panel container - const setComputedVariables = (el: HTMLDivElement) => { - const computedStyle = getComputedStyle(containerRef) - const variable = computedStyle.getPropertyValue('--tsqd-font-size') - el.style.setProperty('--tsqd-font-size', variable) - } - return ( - <> -
-
-
- - { - setSelectedView(value as 'queries' | 'mutations') - setSelectedQueryHash(null) - setSelectedMutationId(null) - }} - > - - - - - - - Queries - - - - - - - - - Mutations - - - -
- - - - - - - -
-
-
-
- - { - if (selectedView() === 'queries') { - props.setLocalStore('filter', e.currentTarget.value) - } else { - props.setLocalStore('mutationFilter', e.currentTarget.value) - } - }} - class={cx('tsqd-query-filter-textfield')} - name="tsqd-query-filter-input" - value={ - selectedView() === 'queries' - ? props.localStore.filter || '' - : props.localStore.mutationFilter || '' - } - /> -
-
- - - - - - - -
- -
- -
- - - - - - - - - - - setComputedVariables(el as HTMLDivElement)} - mount={ - pip().pipWindow - ? pip().pipWindow!.document.body - : document.body - } - > - -
- Settings -
- - - - Position - - - setComputedVariables(el as HTMLDivElement)} - mount={ - pip().pipWindow - ? pip().pipWindow!.document.body - : document.body - } - > - - { - setDevtoolsPosition('top') - }} - as="button" - class={cx( - styles().settingsSubButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-top', - )} - > - Top - - - { - setDevtoolsPosition('bottom') - }} - as="button" - class={cx( - styles().settingsSubButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-bottom', - )} - > - Bottom - - - { - setDevtoolsPosition('left') - }} - as="button" - class={cx( - styles().settingsSubButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-left', - )} - > - Left - - - { - setDevtoolsPosition('right') - }} - as="button" - class={cx( - styles().settingsSubButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-right', - )} - > - Right - - - - - - - - - Theme - - - setComputedVariables(el as HTMLDivElement)} - mount={ - pip().pipWindow - ? pip().pipWindow!.document.body - : document.body - } - > - - { - props.setLocalStore('theme_preference', 'light') - }} - as="button" - class={cx( - styles().settingsSubButton, - props.localStore.theme_preference === 'light' && - styles().themeSelectedButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-top', - )} - > - Light - - - { - props.setLocalStore('theme_preference', 'dark') - }} - as="button" - class={cx( - styles().settingsSubButton, - props.localStore.theme_preference === 'dark' && - styles().themeSelectedButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-bottom', - )} - > - Dark - - - { - props.setLocalStore('theme_preference', 'system') - }} - as="button" - class={cx( - styles().settingsSubButton, - props.localStore.theme_preference === 'system' && - styles().themeSelectedButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-left', - )} - > - System - - - - - -
-
-
-
-
- -
-
- q.queryHash} each={queries()}> - {(query) => } - -
-
-
- -
-
- m.mutationId} each={mutations()}> - {(mutation) => } - -
-
-
-
- - - - - - - - - ) -} - -const QueryRow: Component<{ query: Query }> = (props) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const { colors, alpha } = tokens - const t = (light: string, dark: string) => (theme() === 'dark' ? dark : light) - - const queryState = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache().find({ - queryKey: props.query.queryKey, - })?.state, - true, - (e) => e.query.queryHash === props.query.queryHash, - ) - - const isDisabled = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .find({ - queryKey: props.query.queryKey, - }) - ?.isDisabled() ?? false, - true, - (e) => e.query.queryHash === props.query.queryHash, - ) - - const isStatic = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .find({ - queryKey: props.query.queryKey, - }) - ?.isStatic() ?? false, - true, - (e) => e.query.queryHash === props.query.queryHash, - ) - - const isStale = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .find({ - queryKey: props.query.queryKey, - }) - ?.isStale() ?? false, - true, - (e) => e.query.queryHash === props.query.queryHash, - ) - - const observers = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .find({ - queryKey: props.query.queryKey, - }) - ?.getObserversCount() ?? 0, - true, - (e) => e.query.queryHash === props.query.queryHash, - ) - - const color = createMemo(() => - getQueryStatusColor({ - queryState: queryState()!, - observerCount: observers(), - isStale: isStale(), - }), - ) - - const getObserverCountColorStyles = () => { - if (color() === 'gray') { - return css` - background-color: ${t(colors[color()][200], colors[color()][700])}; - color: ${t(colors[color()][700], colors[color()][300])}; - ` - } - - return css` - background-color: ${t( - colors[color()][200] + alpha[80], - colors[color()][900], - )}; - color: ${t(colors[color()][800], colors[color()][300])}; - ` - } - - return ( - - - - ) -} - -const MutationRow: Component<{ mutation: Mutation }> = (props) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const { colors, alpha } = tokens - const t = (light: string, dark: string) => (theme() === 'dark' ? dark : light) - - const mutationState = createSubscribeToMutationCacheBatcher( - (mutationCache) => { - const mutations = mutationCache().getAll() - const mutation = mutations.find( - (m) => m.mutationId === props.mutation.mutationId, - ) - return mutation?.state - }, - ) - - const isPaused = createSubscribeToMutationCacheBatcher((mutationCache) => { - const mutations = mutationCache().getAll() - const mutation = mutations.find( - (m) => m.mutationId === props.mutation.mutationId, - ) - if (!mutation) return false - return mutation.state.isPaused - }) - - const status = createSubscribeToMutationCacheBatcher((mutationCache) => { - const mutations = mutationCache().getAll() - const mutation = mutations.find( - (m) => m.mutationId === props.mutation.mutationId, - ) - if (!mutation) return 'idle' - return mutation.state.status - }) - - const color = createMemo(() => - getMutationStatusColor({ - isPaused: isPaused(), - status: status(), - }), - ) - - const getObserverCountColorStyles = () => { - if (color() === 'gray') { - return css` - background-color: ${t(colors[color()][200], colors[color()][700])}; - color: ${t(colors[color()][700], colors[color()][300])}; - ` - } - - return css` - background-color: ${t( - colors[color()][200] + alpha[80], - colors[color()][900], - )}; - color: ${t(colors[color()][800], colors[color()][300])}; - ` - } - - return ( - - - - ) -} - -const QueryStatusCount: Component = () => { - const stale = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .getAll() - .filter((q) => getQueryStatusLabel(q) === 'stale').length, - ) - - const fresh = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .getAll() - .filter((q) => getQueryStatusLabel(q) === 'fresh').length, - ) - - const fetching = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .getAll() - .filter((q) => getQueryStatusLabel(q) === 'fetching').length, - ) - - const paused = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .getAll() - .filter((q) => getQueryStatusLabel(q) === 'paused').length, - ) - - const inactive = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .getAll() - .filter((q) => getQueryStatusLabel(q) === 'inactive').length, - ) - - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - return ( -
- - - - - -
- ) -} - -const MutationStatusCount: Component = () => { - const success = createSubscribeToMutationCacheBatcher( - (mutationCache) => - mutationCache() - .getAll() - .filter( - (m) => - getMutationStatusColor({ - isPaused: m.state.isPaused, - status: m.state.status, - }) === 'green', - ).length, - ) - - const pending = createSubscribeToMutationCacheBatcher( - (mutationCache) => - mutationCache() - .getAll() - .filter( - (m) => - getMutationStatusColor({ - isPaused: m.state.isPaused, - status: m.state.status, - }) === 'yellow', - ).length, - ) - - const paused = createSubscribeToMutationCacheBatcher( - (mutationCache) => - mutationCache() - .getAll() - .filter( - (m) => - getMutationStatusColor({ - isPaused: m.state.isPaused, - status: m.state.status, - }) === 'purple', - ).length, - ) - - const error = createSubscribeToMutationCacheBatcher( - (mutationCache) => - mutationCache() - .getAll() - .filter( - (m) => - getMutationStatusColor({ - isPaused: m.state.isPaused, - status: m.state.status, - }) === 'red', - ).length, - ) - - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - return ( -
- - - - -
- ) -} - -const QueryStatus: Component = (props) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const { colors, alpha } = tokens - const t = (light: string, dark: string) => (theme() === 'dark' ? dark : light) - - let tagRef!: HTMLButtonElement - - const [mouseOver, setMouseOver] = createSignal(false) - const [focused, setFocused] = createSignal(false) - - const showLabel = createMemo(() => { - if (selectedQueryHash()) { - if (panelWidth() < firstBreakpoint && panelWidth() > secondBreakpoint) { - return false - } - } - if (panelWidth() < secondBreakpoint) { - return false - } - - return true - }) - - return ( - - ) -} - -const QueryDetails = () => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const { colors } = tokens - const t = (light: string, dark: string) => (theme() === 'dark' ? dark : light) - - const queryClient = useQueryDevtoolsContext().client - - const [restoringLoading, setRestoringLoading] = createSignal(false) - const [dataMode, setDataMode] = createSignal<'view' | 'edit'>('view') - const [dataEditError, setDataEditError] = createSignal(false) - - const errorTypes = createMemo(() => { - return useQueryDevtoolsContext().errorTypes || [] - }) - - const activeQuery = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .getAll() - .find((query) => query.queryHash === selectedQueryHash()), - false, - ) - - const activeQueryFresh = createSubscribeToQueryCacheBatcher((queryCache) => { - return queryCache() - .getAll() - .find((query) => query.queryHash === selectedQueryHash()) - }, false) - - const activeQueryState = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .getAll() - .find((query) => query.queryHash === selectedQueryHash())?.state, - false, - ) - - const activeQueryStateData = createSubscribeToQueryCacheBatcher( - (queryCache) => { - return queryCache() - .getAll() - .find((query) => query.queryHash === selectedQueryHash())?.state.data - }, - false, - ) - - const statusLabel = createSubscribeToQueryCacheBatcher((queryCache) => { - const query = queryCache() - .getAll() - .find((q) => q.queryHash === selectedQueryHash()) - if (!query) return 'inactive' - return getQueryStatusLabel(query) - }) - - const queryStatus = createSubscribeToQueryCacheBatcher((queryCache) => { - const query = queryCache() - .getAll() - .find((q) => q.queryHash === selectedQueryHash()) - if (!query) return 'pending' - return query.state.status - }) - - const observerCount = createSubscribeToQueryCacheBatcher( - (queryCache) => - queryCache() - .getAll() - .find((query) => query.queryHash === selectedQueryHash()) - ?.getObserversCount() ?? 0, - ) - - const color = createMemo(() => getQueryStatusColorByLabel(statusLabel())) - - const handleRefetch = () => { - sendDevToolsEvent({ type: 'REFETCH', queryHash: activeQuery()?.queryHash }) - const promise = activeQuery()?.fetch() - promise?.catch(() => {}) - } - - const triggerError = (errorType?: DevtoolsErrorType) => { - const activeQueryVal = activeQuery() - if (!activeQueryVal) return - sendDevToolsEvent({ - type: 'TRIGGER_ERROR', - queryHash: activeQueryVal.queryHash, - metadata: { error: errorType?.name }, - }) - const error = - errorType?.initializer(activeQueryVal) ?? - new Error('Unknown error from devtools') - - const __previousQueryOptions = activeQueryVal.options - - activeQueryVal.setState({ - status: 'error', - error, - fetchMeta: { - ...activeQueryVal.state.fetchMeta, - __previousQueryOptions, - } as any, - } as QueryState) - } - - const restoreQueryAfterLoadingOrError = () => { - const activeQueryVal = activeQuery() - if (!activeQueryVal) return - - sendDevToolsEvent({ - type: 'RESTORE_LOADING', - queryHash: activeQueryVal.queryHash, - }) - const previousState = activeQueryVal.state - const previousOptions = activeQueryVal.state.fetchMeta - ? (activeQueryVal.state.fetchMeta as any).__previousQueryOptions - : null - - activeQueryVal.cancel({ silent: true }) - activeQueryVal.setState({ - ...previousState, - fetchStatus: 'idle', - fetchMeta: null, - }) - - if (previousOptions) { - activeQueryVal.fetch(previousOptions) - } - } - - createEffect(() => { - if (statusLabel() !== 'fetching') { - setRestoringLoading(false) - } - }) - - const getQueryStatusColors = () => { - if (color() === 'gray') { - return css` - background-color: ${t(colors[color()][200], colors[color()][700])}; - color: ${t(colors[color()][700], colors[color()][300])}; - border-color: ${t(colors[color()][400], colors[color()][600])}; - ` - } - return css` - background-color: ${t(colors[color()][100], colors[color()][900])}; - color: ${t(colors[color()][700], colors[color()][300])}; - border-color: ${t(colors[color()][400], colors[color()][600])}; - ` - } - - return ( - -
-
- Query Details -
-
-
-
-              {displayValue(activeQuery()!.queryKey, true)}
-            
- - {statusLabel()} - -
-
- Observers: - {observerCount()} -
-
- Last Updated: - - {new Date(activeQueryState()!.dataUpdatedAt).toLocaleTimeString()} - -
-
-
- Actions -
-
- - - - - - - - - -
- - Trigger Error - - -
-
-
-
- Data {dataMode() === 'view' ? 'Explorer' : 'Editor'} -
- -
- setDataMode('edit')} - activeQuery={activeQuery()} - /> -
-
- -
{ - e.preventDefault() - const formData = new FormData(e.currentTarget) - const data = formData.get('data') as string - try { - const parsedData = JSON.parse(data) - activeQuery()!.setState({ - ...activeQuery()!.state, - data: parsedData, - }) - setDataMode('view') - } catch (error) { - setDataEditError(true) - } - }} - > - -
- - {dataEditError() ? 'Invalid Value' : ''} - -
- - -
-
-
-
-
- Query Explorer -
-
- -
-
-
- ) -} - -const MutationDetails = () => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - const { colors } = tokens - const t = (light: string, dark: string) => (theme() === 'dark' ? dark : light) - - const isPaused = createSubscribeToMutationCacheBatcher((mutationCache) => { - const mutations = mutationCache().getAll() - const mutation = mutations.find( - (m) => m.mutationId === selectedMutationId(), - ) - if (!mutation) return false - return mutation.state.isPaused - }) - - const status = createSubscribeToMutationCacheBatcher((mutationCache) => { - const mutations = mutationCache().getAll() - const mutation = mutations.find( - (m) => m.mutationId === selectedMutationId(), - ) - if (!mutation) return 'idle' - return mutation.state.status - }) - - const color = createMemo(() => - getMutationStatusColor({ - isPaused: isPaused(), - status: status(), - }), - ) - - const activeMutation = createSubscribeToMutationCacheBatcher( - (mutationCache) => - mutationCache() - .getAll() - .find((mutation) => mutation.mutationId === selectedMutationId()), - false, - ) - - const getQueryStatusColors = () => { - if (color() === 'gray') { - return css` - background-color: ${t(colors[color()][200], colors[color()][700])}; - color: ${t(colors[color()][700], colors[color()][300])}; - border-color: ${t(colors[color()][400], colors[color()][600])}; - ` - } - return css` - background-color: ${t(colors[color()][100], colors[color()][900])}; - color: ${t(colors[color()][700], colors[color()][300])}; - border-color: ${t(colors[color()][400], colors[color()][600])}; - ` - } - - return ( - -
-
- Mutation Details -
-
-
-
-              
-                
-                  {displayValue(activeMutation()!.options.mutationKey, true)}
-                
-              
-            
- - pending - {status()} - -
-
- Submitted At: - - {new Date( - activeMutation()!.state.submittedAt, - ).toLocaleTimeString()} - -
-
-
- Variables Details -
-
- -
-
- Context Details -
-
- -
-
- Data Explorer -
-
- -
-
- Mutations Explorer -
-
- -
-
-
- ) -} - -const queryCacheMap = new Map< - (q: Accessor) => any, - { - setter: Setter - shouldUpdate: (event: QueryCacheNotifyEvent) => boolean - } ->() - -const setupQueryCacheSubscription = () => { - const queryCache = createMemo(() => { - const client = useQueryDevtoolsContext().client - return client.getQueryCache() - }) - - const unsubscribe = queryCache().subscribe((q) => { - batch(() => { - for (const [callback, value] of queryCacheMap.entries()) { - if (!value.shouldUpdate(q)) continue - value.setter(callback(queryCache)) - } - }) - }) - - onCleanup(() => { - queryCacheMap.clear() - unsubscribe() - }) - - return unsubscribe -} - -const createSubscribeToQueryCacheBatcher = ( - callback: (queryCache: Accessor) => Exclude, - equalityCheck: boolean = true, - shouldUpdate: (event: QueryCacheNotifyEvent) => boolean = () => true, -) => { - const queryCache = createMemo(() => { - const client = useQueryDevtoolsContext().client - return client.getQueryCache() - }) - - const [value, setValue] = createSignal( - callback(queryCache), - !equalityCheck ? { equals: false } : undefined, - ) - - createEffect(() => { - setValue(callback(queryCache)) - }) - - queryCacheMap.set(callback, { - setter: setValue, - shouldUpdate: shouldUpdate, - }) - - onCleanup(() => { - queryCacheMap.delete(callback) - }) - - return value -} - -const mutationCacheMap = new Map< - (q: Accessor) => any, - Setter ->() - -const setupMutationCacheSubscription = () => { - const mutationCache = createMemo(() => { - const client = useQueryDevtoolsContext().client - return client.getMutationCache() - }) - - const unsubscribe = mutationCache().subscribe(() => { - for (const [callback, setter] of mutationCacheMap.entries()) { - queueMicrotask(() => { - setter(callback(mutationCache)) - }) - } - }) - - onCleanup(() => { - mutationCacheMap.clear() - unsubscribe() - }) - - return unsubscribe -} - -const createSubscribeToMutationCacheBatcher = ( - callback: (queryCache: Accessor) => Exclude, - equalityCheck: boolean = true, -) => { - const mutationCache = createMemo(() => { - const client = useQueryDevtoolsContext().client - return client.getMutationCache() - }) - - const [value, setValue] = createSignal( - callback(mutationCache), - !equalityCheck ? { equals: false } : undefined, - ) - - createEffect(() => { - setValue(callback(mutationCache)) - }) - - mutationCacheMap.set(callback, setValue) - - onCleanup(() => { - mutationCacheMap.delete(callback) - }) - - return value -} - -type DevToolsActionType = - | 'REFETCH' - | 'INVALIDATE' - | 'RESET' - | 'REMOVE' - | 'TRIGGER_ERROR' - | 'RESTORE_ERROR' - | 'TRIGGER_LOADING' - | 'RESTORE_LOADING' - | 'CLEAR_MUTATION_CACHE' - | 'CLEAR_QUERY_CACHE' - -const DEV_TOOLS_EVENT = '@tanstack/query-devtools-event' - -const sendDevToolsEvent = ({ - type, - queryHash, - metadata, -}: { - type: DevToolsActionType - queryHash?: string - metadata?: Record -}) => { - const event = new CustomEvent(DEV_TOOLS_EVENT, { - detail: { type, queryHash, metadata }, - bubbles: true, - cancelable: true, - }) - window.dispatchEvent(event) -} - -const stylesFactory = ( - theme: 'light' | 'dark', - css: (typeof goober)['css'], -) => { - const { colors, font, size, alpha, shadow, border } = tokens - - const t = (light: string, dark: string) => (theme === 'light' ? light : dark) - - return { - devtoolsBtn: css` - z-index: 100000; - position: fixed; - padding: 4px; - text-align: left; - - display: flex; - align-items: center; - justify-content: center; - border-radius: 9999px; - box-shadow: ${shadow.md()}; - overflow: hidden; - - & div { - position: absolute; - top: -8px; - left: -8px; - right: -8px; - bottom: -8px; - border-radius: 9999px; - - & svg { - position: absolute; - width: 100%; - height: 100%; - } - filter: blur(6px) saturate(1.2) contrast(1.1); - } - - &:focus-within { - outline-offset: 2px; - outline: 3px solid ${colors.green[600]}; - } - - & button { - position: relative; - z-index: 1; - padding: 0; - border-radius: 9999px; - background-color: transparent; - border: none; - height: 40px; - display: flex; - width: 40px; - overflow: hidden; - cursor: pointer; - outline: none; - & svg { - position: absolute; - width: 100%; - height: 100%; - } - } - `, - panel: css` - position: fixed; - z-index: 9999; - display: flex; - gap: ${tokens.size[0.5]}; - & * { - box-sizing: border-box; - text-transform: none; - } - - & *::-webkit-scrollbar { - width: 7px; - } - - & *::-webkit-scrollbar-track { - background: transparent; - } - - & *::-webkit-scrollbar-thumb { - background: ${t(colors.gray[300], colors.darkGray[200])}; - } - - & *::-webkit-scrollbar-thumb:hover { - background: ${t(colors.gray[400], colors.darkGray[300])}; - } - `, - parentPanel: css` - z-index: 9999; - display: flex; - height: 100%; - gap: ${tokens.size[0.5]}; - & * { - box-sizing: border-box; - text-transform: none; - } - - & *::-webkit-scrollbar { - width: 7px; - } - - & *::-webkit-scrollbar-track { - background: transparent; - } - - & *::-webkit-scrollbar-thumb { - background: ${t(colors.gray[300], colors.darkGray[200])}; - } - - & *::-webkit-scrollbar-thumb:hover { - background: ${t(colors.gray[400], colors.darkGray[300])}; - } - `, - 'devtoolsBtn-position-bottom-right': css` - bottom: 12px; - right: 12px; - `, - 'devtoolsBtn-position-bottom-left': css` - bottom: 12px; - left: 12px; - `, - 'devtoolsBtn-position-top-left': css` - top: 12px; - left: 12px; - `, - 'devtoolsBtn-position-top-right': css` - top: 12px; - right: 12px; - `, - 'devtoolsBtn-position-relative': css` - position: relative; - `, - 'panel-position-top': css` - top: 0; - right: 0; - left: 0; - max-height: 90%; - min-height: ${size[14]}; - border-bottom: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - `, - 'panel-position-bottom': css` - bottom: 0; - right: 0; - left: 0; - max-height: 90%; - min-height: ${size[14]}; - border-top: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - `, - 'panel-position-right': css` - bottom: 0; - right: 0; - top: 0; - border-left: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - max-width: 90%; - `, - 'panel-position-left': css` - bottom: 0; - left: 0; - top: 0; - border-right: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - max-width: 90%; - `, - closeBtn: css` - position: absolute; - cursor: pointer; - z-index: 5; - display: flex; - align-items: center; - justify-content: center; - outline: none; - background-color: ${t(colors.gray[50], colors.darkGray[700])}; - &:hover { - background-color: ${t(colors.gray[200], colors.darkGray[500])}; - } - &:focus-visible { - outline: 2px solid ${colors.blue[600]}; - } - & svg { - color: ${t(colors.gray[600], colors.gray[400])}; - width: ${size[2]}; - height: ${size[2]}; - } - `, - 'closeBtn-position-top': css` - bottom: 0; - right: ${size[2]}; - transform: translate(0, 100%); - border-right: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-left: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-top: none; - border-bottom: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-radius: 0px 0px ${border.radius.sm} ${border.radius.sm}; - padding: ${size[0.5]} ${size[1.5]} ${size[1]} ${size[1.5]}; - - &::after { - content: ' '; - position: absolute; - bottom: 100%; - left: -${size[2.5]}; - height: ${size[1.5]}; - width: calc(100% + ${size[5]}); - } - - & svg { - transform: rotate(180deg); - } - `, - 'closeBtn-position-bottom': css` - top: 0; - right: ${size[2]}; - transform: translate(0, -100%); - border-right: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-left: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-top: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-bottom: none; - border-radius: ${border.radius.sm} ${border.radius.sm} 0px 0px; - padding: ${size[1]} ${size[1.5]} ${size[0.5]} ${size[1.5]}; - - &::after { - content: ' '; - position: absolute; - top: 100%; - left: -${size[2.5]}; - height: ${size[1.5]}; - width: calc(100% + ${size[5]}); - } - `, - 'closeBtn-position-right': css` - bottom: ${size[2]}; - left: 0; - transform: translate(-100%, 0); - border-right: none; - border-left: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-top: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-bottom: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-radius: ${border.radius.sm} 0px 0px ${border.radius.sm}; - padding: ${size[1.5]} ${size[0.5]} ${size[1.5]} ${size[1]}; - - &::after { - content: ' '; - position: absolute; - left: 100%; - height: calc(100% + ${size[5]}); - width: ${size[1.5]}; - } - - & svg { - transform: rotate(-90deg); - } - `, - 'closeBtn-position-left': css` - bottom: ${size[2]}; - right: 0; - transform: translate(100%, 0); - border-left: none; - border-right: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-top: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-bottom: ${t(colors.gray[400], colors.darkGray[300])} 1px solid; - border-radius: 0px ${border.radius.sm} ${border.radius.sm} 0px; - padding: ${size[1.5]} ${size[1]} ${size[1.5]} ${size[0.5]}; - - &::after { - content: ' '; - position: absolute; - right: 100%; - height: calc(100% + ${size[5]}); - width: ${size[1.5]}; - } - - & svg { - transform: rotate(90deg); - } - `, - queriesContainer: css` - flex: 1 1 700px; - background-color: ${t(colors.gray[50], colors.darkGray[700])}; - display: flex; - flex-direction: column; - & * { - font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; - } - `, - dragHandle: css` - position: absolute; - transition: background-color 0.125s ease; - &:hover { - background-color: ${colors.purple[400]}${t('', alpha[90])}; - } - z-index: 4; - `, - 'dragHandle-position-top': css` - bottom: 0; - width: 100%; - height: 3px; - cursor: ns-resize; - `, - 'dragHandle-position-bottom': css` - top: 0; - width: 100%; - height: 3px; - cursor: ns-resize; - `, - 'dragHandle-position-right': css` - left: 0; - width: 3px; - height: 100%; - cursor: ew-resize; - `, - 'dragHandle-position-left': css` - right: 0; - width: 3px; - height: 100%; - cursor: ew-resize; - `, - row: css` - display: flex; - justify-content: space-between; - align-items: center; - padding: ${tokens.size[2]} ${tokens.size[2.5]}; - gap: ${tokens.size[2.5]}; - border-bottom: ${t(colors.gray[300], colors.darkGray[500])} 1px solid; - align-items: center; - & > button { - padding: 0; - background: transparent; - border: none; - display: flex; - gap: ${size[0.5]}; - flex-direction: column; - } - `, - logoAndToggleContainer: css` - display: flex; - gap: ${tokens.size[3]}; - align-items: center; - `, - logo: css` - cursor: pointer; - display: flex; - flex-direction: column; - background-color: transparent; - border: none; - gap: ${tokens.size[0.5]}; - padding: 0px; - &:hover { - opacity: 0.7; - } - &:focus-visible { - outline-offset: 4px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - `, - tanstackLogo: css` - font-size: ${font.size.md}; - font-weight: ${font.weight.bold}; - line-height: ${font.lineHeight.xs}; - white-space: nowrap; - color: ${t(colors.gray[600], colors.gray[300])}; - `, - queryFlavorLogo: css` - font-weight: ${font.weight.semibold}; - font-size: ${font.size.xs}; - background: linear-gradient( - to right, - ${t('#ea4037, #ff9b11', '#dd524b, #e9a03b')} - ); - background-clip: text; - -webkit-background-clip: text; - line-height: 1; - -webkit-text-fill-color: transparent; - white-space: nowrap; - `, - queryStatusContainer: css` - display: flex; - gap: ${tokens.size[2]}; - height: min-content; - `, - queryStatusTag: css` - display: flex; - gap: ${tokens.size[1.5]}; - box-sizing: border-box; - height: ${tokens.size[6.5]}; - background: ${t(colors.gray[50], colors.darkGray[500])}; - color: ${t(colors.gray[700], colors.gray[300])}; - border-radius: ${tokens.border.radius.sm}; - font-size: ${font.size.sm}; - padding: ${tokens.size[1]}; - padding-left: ${tokens.size[1.5]}; - align-items: center; - font-weight: ${font.weight.medium}; - border: ${t('1px solid ' + colors.gray[300], '1px solid transparent')}; - user-select: none; - position: relative; - &:focus-visible { - outline-offset: 2px; - outline: 2px solid ${colors.blue[800]}; - } - `, - queryStatusTagLabel: css` - font-size: ${font.size.xs}; - `, - queryStatusCount: css` - font-size: ${font.size.xs}; - padding: 0 5px; - display: flex; - align-items: center; - justify-content: center; - color: ${t(colors.gray[500], colors.gray[400])}; - background-color: ${t(colors.gray[200], colors.darkGray[300])}; - border-radius: 2px; - font-variant-numeric: tabular-nums; - height: ${tokens.size[4.5]}; - `, - statusTooltip: css` - position: absolute; - z-index: 1; - background-color: ${t(colors.gray[50], colors.darkGray[500])}; - top: 100%; - left: 50%; - transform: translate(-50%, calc(${tokens.size[2]})); - padding: ${tokens.size[0.5]} ${tokens.size[2]}; - border-radius: ${tokens.border.radius.sm}; - font-size: ${font.size.xs}; - border: 1px solid ${t(colors.gray[400], colors.gray[600])}; - color: ${t(colors['gray'][600], colors['gray'][300])}; - - &::before { - top: 0px; - content: ' '; - display: block; - left: 50%; - transform: translate(-50%, -100%); - position: absolute; - border-color: transparent transparent - ${t(colors.gray[400], colors.gray[600])} transparent; - border-style: solid; - border-width: 7px; - /* transform: rotate(180deg); */ - } - - &::after { - top: 0px; - content: ' '; - display: block; - left: 50%; - transform: translate(-50%, calc(-100% + 2px)); - position: absolute; - border-color: transparent transparent - ${t(colors.gray[100], colors.darkGray[500])} transparent; - border-style: solid; - border-width: 7px; - } - `, - filtersContainer: css` - display: flex; - gap: ${tokens.size[2]}; - & > button { - cursor: pointer; - padding: ${tokens.size[0.5]} ${tokens.size[1.5]} ${tokens.size[0.5]} - ${tokens.size[2]}; - border-radius: ${tokens.border.radius.sm}; - background-color: ${t(colors.gray[100], colors.darkGray[400])}; - border: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; - color: ${t(colors.gray[700], colors.gray[300])}; - font-size: ${font.size.xs}; - display: flex; - align-items: center; - line-height: ${font.lineHeight.sm}; - gap: ${tokens.size[1.5]}; - max-width: 160px; - &:focus-visible { - outline-offset: 2px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - & svg { - width: ${tokens.size[3]}; - height: ${tokens.size[3]}; - color: ${t(colors.gray[500], colors.gray[400])}; - } - } - `, - filterInput: css` - padding: ${size[0.5]} ${size[2]}; - border-radius: ${tokens.border.radius.sm}; - background-color: ${t(colors.gray[100], colors.darkGray[400])}; - display: flex; - box-sizing: content-box; - align-items: center; - gap: ${tokens.size[1.5]}; - max-width: 160px; - min-width: 100px; - border: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; - height: min-content; - color: ${t(colors.gray[600], colors.gray[400])}; - & > svg { - width: ${size[3]}; - height: ${size[3]}; - } - & input { - font-size: ${font.size.xs}; - width: 100%; - background-color: ${t(colors.gray[100], colors.darkGray[400])}; - border: none; - padding: 0; - line-height: ${font.lineHeight.sm}; - color: ${t(colors.gray[700], colors.gray[300])}; - &::placeholder { - color: ${t(colors.gray[700], colors.gray[300])}; - } - &:focus { - outline: none; - } - } - - &:focus-within { - outline-offset: 2px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - `, - filterSelect: css` - padding: ${tokens.size[0.5]} ${tokens.size[2]}; - border-radius: ${tokens.border.radius.sm}; - background-color: ${t(colors.gray[100], colors.darkGray[400])}; - display: flex; - align-items: center; - gap: ${tokens.size[1.5]}; - box-sizing: content-box; - max-width: 160px; - border: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; - height: min-content; - & > svg { - color: ${t(colors.gray[600], colors.gray[400])}; - width: ${tokens.size[2]}; - height: ${tokens.size[2]}; - } - & > select { - appearance: none; - color: ${t(colors.gray[700], colors.gray[300])}; - min-width: 100px; - line-height: ${font.lineHeight.sm}; - font-size: ${font.size.xs}; - background-color: ${t(colors.gray[100], colors.darkGray[400])}; - border: none; - &:focus { - outline: none; - } - } - &:focus-within { - outline-offset: 2px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - `, - actionsContainer: css` - display: flex; - gap: ${tokens.size[2]}; - `, - actionsBtn: css` - border-radius: ${tokens.border.radius.sm}; - background-color: ${t(colors.gray[100], colors.darkGray[400])}; - border: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; - width: ${tokens.size[6.5]}; - height: ${tokens.size[6.5]}; - justify-content: center; - display: flex; - align-items: center; - gap: ${tokens.size[1.5]}; - max-width: 160px; - cursor: pointer; - padding: 0; - &:hover { - background-color: ${t(colors.gray[200], colors.darkGray[500])}; - } - & svg { - color: ${t(colors.gray[700], colors.gray[300])}; - width: ${tokens.size[3]}; - height: ${tokens.size[3]}; - } - &:focus-visible { - outline-offset: 2px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - `, - actionsBtnOffline: css` - & svg { - stroke: ${t(colors.yellow[700], colors.yellow[500])}; - fill: ${t(colors.yellow[700], colors.yellow[500])}; - } - `, - overflowQueryContainer: css` - flex: 1; - overflow-y: auto; - & > div { - display: flex; - flex-direction: column; - } - `, - queryRow: css` - display: flex; - align-items: center; - padding: 0; - border: none; - cursor: pointer; - color: ${t(colors.gray[700], colors.gray[300])}; - background-color: ${t(colors.gray[50], colors.darkGray[700])}; - line-height: 1; - &:focus { - outline: none; - } - &:focus-visible { - outline-offset: -2px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - &:hover .tsqd-query-hash { - background-color: ${t(colors.gray[200], colors.darkGray[600])}; - } - - & .tsqd-query-observer-count { - padding: 0 ${tokens.size[1]}; - user-select: none; - min-width: ${tokens.size[6.5]}; - align-self: stretch; - display: flex; - align-items: center; - justify-content: center; - font-size: ${font.size.xs}; - font-weight: ${font.weight.medium}; - border-bottom-width: 1px; - border-bottom-style: solid; - border-bottom: 1px solid ${t(colors.gray[300], colors.darkGray[700])}; - } - & .tsqd-query-hash { - user-select: text; - font-size: ${font.size.xs}; - display: flex; - align-items: center; - min-height: ${tokens.size[6]}; - flex: 1; - padding: ${tokens.size[1]} ${tokens.size[2]}; - font-family: - ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, - 'Liberation Mono', 'Courier New', monospace; - border-bottom: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; - text-align: left; - text-overflow: clip; - word-break: break-word; - } - - & .tsqd-query-disabled-indicator { - align-self: stretch; - display: flex; - align-items: center; - padding: 0 ${tokens.size[2]}; - color: ${t(colors.gray[800], colors.gray[300])}; - background-color: ${t(colors.gray[300], colors.darkGray[600])}; - border-bottom: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; - font-size: ${font.size.xs}; - } - - & .tsqd-query-static-indicator { - align-self: stretch; - display: flex; - align-items: center; - padding: 0 ${tokens.size[2]}; - color: ${t(colors.teal[800], colors.teal[300])}; - background-color: ${t(colors.teal[100], colors.teal[900])}; - border-bottom: 1px solid ${t(colors.teal[300], colors.teal[700])}; - font-size: ${font.size.xs}; - } - `, - selectedQueryRow: css` - background-color: ${t(colors.gray[200], colors.darkGray[500])}; - `, - detailsContainer: css` - flex: 1 1 700px; - background-color: ${t(colors.gray[50], colors.darkGray[700])}; - color: ${t(colors.gray[700], colors.gray[300])}; - font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; - display: flex; - flex-direction: column; - overflow-y: auto; - display: flex; - text-align: left; - `, - detailsHeader: css` - font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; - position: sticky; - top: 0; - z-index: 2; - background-color: ${t(colors.gray[200], colors.darkGray[600])}; - padding: ${tokens.size[1.5]} ${tokens.size[2]}; - font-weight: ${font.weight.medium}; - font-size: ${font.size.xs}; - line-height: ${font.lineHeight.xs}; - text-align: left; - `, - detailsBody: css` - margin: ${tokens.size[1.5]} 0px ${tokens.size[2]} 0px; - & > div { - display: flex; - align-items: stretch; - padding: 0 ${tokens.size[2]}; - line-height: ${font.lineHeight.sm}; - justify-content: space-between; - & > span { - font-size: ${font.size.xs}; - } - & > span:nth-child(2) { - font-variant-numeric: tabular-nums; - } - } - - & > div:first-child { - margin-bottom: ${tokens.size[1.5]}; - } - - & code { - font-family: - ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, - 'Liberation Mono', 'Courier New', monospace; - margin: 0; - font-size: ${font.size.xs}; - line-height: ${font.lineHeight.xs}; - } - - & pre { - margin: 0; - display: flex; - align-items: center; - } - `, - queryDetailsStatus: css` - border: 1px solid ${colors.darkGray[200]}; - border-radius: ${tokens.border.radius.sm}; - font-weight: ${font.weight.medium}; - padding: ${tokens.size[1]} ${tokens.size[2.5]}; - `, - actionsBody: css` - flex-wrap: wrap; - margin: ${tokens.size[2]} 0px ${tokens.size[2]} 0px; - display: flex; - gap: ${tokens.size[2]}; - padding: 0px ${tokens.size[2]}; - & > button { - font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; - font-size: ${font.size.xs}; - padding: ${tokens.size[1]} ${tokens.size[2]}; - display: flex; - border-radius: ${tokens.border.radius.sm}; - background-color: ${t(colors.gray[100], colors.darkGray[600])}; - border: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; - align-items: center; - gap: ${tokens.size[2]}; - font-weight: ${font.weight.medium}; - line-height: ${font.lineHeight.xs}; - cursor: pointer; - &:focus-visible { - outline-offset: 2px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - &:hover { - background-color: ${t(colors.gray[200], colors.darkGray[500])}; - } - - &:disabled { - opacity: 0.6; - cursor: not-allowed; - } - - & > span { - width: ${size[1.5]}; - height: ${size[1.5]}; - border-radius: ${tokens.border.radius.full}; - } - } - `, - actionsSelect: css` - font-size: ${font.size.xs}; - padding: ${tokens.size[0.5]} ${tokens.size[2]}; - display: flex; - border-radius: ${tokens.border.radius.sm}; - overflow: hidden; - background-color: ${t(colors.gray[100], colors.darkGray[600])}; - border: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; - align-items: center; - gap: ${tokens.size[2]}; - font-weight: ${font.weight.medium}; - line-height: ${font.lineHeight.sm}; - color: ${t(colors.red[500], colors.red[400])}; - cursor: pointer; - position: relative; - &:hover { - background-color: ${t(colors.gray[200], colors.darkGray[500])}; - } - & > span { - width: ${size[1.5]}; - height: ${size[1.5]}; - border-radius: ${tokens.border.radius.full}; - } - &:focus-within { - outline-offset: 2px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - & select { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - appearance: none; - background-color: transparent; - border: none; - color: transparent; - outline: none; - } - - & svg path { - stroke: ${tokens.colors.red[400]}; - } - & svg { - width: ${tokens.size[2]}; - height: ${tokens.size[2]}; - } - `, - settingsMenu: css` - display: flex; - & * { - font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; - } - flex-direction: column; - gap: ${size[0.5]}; - border-radius: ${tokens.border.radius.sm}; - border: 1px solid ${t(colors.gray[300], colors.gray[700])}; - background-color: ${t(colors.gray[50], colors.darkGray[600])}; - font-size: ${font.size.xs}; - color: ${t(colors.gray[700], colors.gray[300])}; - z-index: 99999; - min-width: 120px; - padding: ${size[0.5]}; - `, - settingsSubTrigger: css` - display: flex; - align-items: center; - justify-content: space-between; - border-radius: ${tokens.border.radius.xs}; - padding: ${tokens.size[1]} ${tokens.size[1]}; - cursor: pointer; - background-color: transparent; - border: none; - color: ${t(colors.gray[700], colors.gray[300])}; - & svg { - color: ${t(colors.gray[600], colors.gray[400])}; - transform: rotate(-90deg); - width: ${tokens.size[2]}; - height: ${tokens.size[2]}; - } - &:hover { - background-color: ${t(colors.gray[200], colors.darkGray[500])}; - } - &:focus-visible { - outline-offset: 2px; - outline: 2px solid ${colors.blue[800]}; - } - &.data-disabled { - opacity: 0.6; - cursor: not-allowed; - } - `, - settingsMenuHeader: css` - padding: ${tokens.size[1]} ${tokens.size[1]}; - font-weight: ${font.weight.medium}; - border-bottom: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; - color: ${t(colors.gray[500], colors.gray[400])}; - font-size: ${font.size['xs']}; - `, - settingsSubButton: css` - display: flex; - align-items: center; - justify-content: space-between; - color: ${t(colors.gray[700], colors.gray[300])}; - font-size: ${font.size['xs']}; - border-radius: ${tokens.border.radius.xs}; - padding: ${tokens.size[1]} ${tokens.size[1]}; - cursor: pointer; - background-color: transparent; - border: none; - & svg { - color: ${t(colors.gray[600], colors.gray[400])}; - } - &:hover { - background-color: ${t(colors.gray[200], colors.darkGray[500])}; - } - &:focus-visible { - outline-offset: 2px; - outline: 2px solid ${colors.blue[800]}; - } - `, - themeSelectedButton: css` - background-color: ${t(colors.purple[100], colors.purple[900])}; - color: ${t(colors.purple[700], colors.purple[300])}; - & svg { - color: ${t(colors.purple[700], colors.purple[300])}; - } - &:hover { - background-color: ${t(colors.purple[100], colors.purple[900])}; - } - `, - viewToggle: css` - border-radius: ${tokens.border.radius.sm}; - background-color: ${t(colors.gray[200], colors.darkGray[600])}; - border: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; - display: flex; - padding: 0; - font-size: ${font.size.xs}; - color: ${t(colors.gray[700], colors.gray[300])}; - overflow: hidden; - - &:has(:focus-visible) { - outline: 2px solid ${colors.blue[800]}; - } - - & .tsqd-radio-toggle { - opacity: 0.5; - display: flex; - & label { - display: flex; - align-items: center; - cursor: pointer; - line-height: ${font.lineHeight.md}; - } - - & label:hover { - background-color: ${t(colors.gray[100], colors.darkGray[500])}; - } - } - - & > [data-checked] { - opacity: 1; - background-color: ${t(colors.gray[100], colors.darkGray[400])}; - & label:hover { - background-color: ${t(colors.gray[100], colors.darkGray[400])}; - } - } - - & .tsqd-radio-toggle:first-child { - & label { - padding: 0 ${tokens.size[1.5]} 0 ${tokens.size[2]}; - } - border-right: 1px solid ${t(colors.gray[300], colors.darkGray[200])}; - } - - & .tsqd-radio-toggle:nth-child(2) { - & label { - padding: 0 ${tokens.size[2]} 0 ${tokens.size[1.5]}; - } - } - `, - devtoolsEditForm: css` - padding: ${size[2]}; - & > [data-error='true'] { - outline: 2px solid ${t(colors.red[200], colors.red[800])}; - outline-offset: 2px; - border-radius: ${border.radius.xs}; - } - `, - devtoolsEditTextarea: css` - width: 100%; - max-height: 500px; - font-family: 'Fira Code', monospace; - font-size: ${font.size.xs}; - border-radius: ${border.radius.sm}; - field-sizing: content; - padding: ${size[2]}; - background-color: ${t(colors.gray[100], colors.darkGray[800])}; - color: ${t(colors.gray[900], colors.gray[100])}; - border: 1px solid ${t(colors.gray[200], colors.gray[700])}; - resize: none; - &:focus { - outline-offset: 2px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${t(colors.blue[200], colors.blue[800])}; - } - `, - devtoolsEditFormActions: css` - display: flex; - justify-content: space-between; - gap: ${size[2]}; - align-items: center; - padding-top: ${size[1]}; - font-size: ${font.size.xs}; - `, - devtoolsEditFormError: css` - color: ${t(colors.red[700], colors.red[500])}; - `, - devtoolsEditFormActionContainer: css` - display: flex; - gap: ${size[2]}; - `, - devtoolsEditFormAction: css` - font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; - font-size: ${font.size.xs}; - padding: ${size[1]} ${tokens.size[2]}; - display: flex; - border-radius: ${border.radius.sm}; - background-color: ${t(colors.gray[100], colors.darkGray[600])}; - border: 1px solid ${t(colors.gray[300], colors.darkGray[400])}; - align-items: center; - gap: ${size[2]}; - font-weight: ${font.weight.medium}; - line-height: ${font.lineHeight.xs}; - cursor: pointer; - &:focus-visible { - outline-offset: 2px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - &:hover { - background-color: ${t(colors.gray[200], colors.darkGray[500])}; - } - - &:disabled { - opacity: 0.6; - cursor: not-allowed; - } - `, - } -} - -const lightStyles = (css: (typeof goober)['css']) => stylesFactory('light', css) -const darkStyles = (css: (typeof goober)['css']) => stylesFactory('dark', css) diff --git a/devtools-reference/tanstack-query/query-devtools/src/DevtoolsComponent.tsx b/devtools-reference/tanstack-query/query-devtools/src/DevtoolsComponent.tsx deleted file mode 100644 index 45d93204e..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/DevtoolsComponent.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { createLocalStorage } from '@solid-primitives/storage' -import { createMemo } from 'solid-js' -import { Devtools } from './Devtools' -import { getPreferredColorScheme } from './utils' -import { THEME_PREFERENCE } from './constants' -import { PiPProvider, QueryDevtoolsContext, ThemeContext } from './contexts' -import type { DevtoolsComponentType } from './Devtools' - -const DevtoolsComponent: DevtoolsComponentType = (props) => { - const [localStore, setLocalStore] = createLocalStorage({ - prefix: 'TanstackQueryDevtools', - }) - - const colorScheme = getPreferredColorScheme() - - const theme = createMemo(() => { - const preference = (localStore.theme_preference || THEME_PREFERENCE) as - | 'system' - | 'dark' - | 'light' - if (preference !== 'system') return preference - return colorScheme() - }) - - return ( - - - - - - - - ) -} - -export default DevtoolsComponent diff --git a/devtools-reference/tanstack-query/query-devtools/src/DevtoolsPanelComponent.tsx b/devtools-reference/tanstack-query/query-devtools/src/DevtoolsPanelComponent.tsx deleted file mode 100644 index eb3d19e4d..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/DevtoolsPanelComponent.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { createLocalStorage } from '@solid-primitives/storage' -import { createMemo } from 'solid-js' -import { ContentView, ParentPanel } from './Devtools' -import { getPreferredColorScheme } from './utils' -import { THEME_PREFERENCE } from './constants' -import { PiPProvider, QueryDevtoolsContext, ThemeContext } from './contexts' -import type { DevtoolsComponentType } from './Devtools' - -const DevtoolsPanelComponent: DevtoolsComponentType = (props) => { - const [localStore, setLocalStore] = createLocalStorage({ - prefix: 'TanstackQueryDevtools', - }) - - const colorScheme = getPreferredColorScheme() - - const theme = createMemo(() => { - const preference = (localStore.theme_preference || THEME_PREFERENCE) as - | 'system' - | 'dark' - | 'light' - if (preference !== 'system') return preference - return colorScheme() - }) - - return ( - - - - - - - - - - ) -} - -export default DevtoolsPanelComponent diff --git a/devtools-reference/tanstack-query/query-devtools/src/Explorer.tsx b/devtools-reference/tanstack-query/query-devtools/src/Explorer.tsx deleted file mode 100644 index 8bf42fe4e..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/Explorer.tsx +++ /dev/null @@ -1,660 +0,0 @@ -import { serialize, stringify } from 'superjson' -import { clsx as cx } from 'clsx' -import { Index, Match, Show, Switch, createMemo, createSignal } from 'solid-js' -import { Key } from '@solid-primitives/keyed' -import * as goober from 'goober' -import { tokens } from './theme' -import { - deleteNestedDataByPath, - displayValue, - updateNestedDataByPath, -} from './utils' -import { - Check, - CopiedCopier, - Copier, - ErrorCopier, - List, - Pencil, - Trash, -} from './icons' -import { useQueryDevtoolsContext, useTheme } from './contexts' -import type { Query } from '@tanstack/query-core' - -/** - * Chunk elements in the array by size - * - * when the array cannot be chunked evenly by size, the last chunk will be - * filled with the remaining elements - * - * @example - * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']] - */ -function chunkArray( - array: Array, - size: number, -): Array> { - if (size < 1) return [] - let i = 0 - const result: Array> = [] - while (i < array.length) { - result.push(array.slice(i, i + size)) - i = i + size - } - return result -} - -const Expander = (props: { expanded: boolean }) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - - return ( - - - - - - ) -} - -type CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy' -const CopyButton = (props: { value: unknown }) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - const [copyState, setCopyState] = createSignal('NoCopy') - - return ( - - ) -} - -const ClearArrayButton = (props: { - dataPath: Array - activeQuery: Query -}) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - const queryClient = useQueryDevtoolsContext().client - - return ( - - ) -} - -const DeleteItemButton = (props: { - dataPath: Array - activeQuery: Query -}) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - const queryClient = useQueryDevtoolsContext().client - - return ( - - ) -} - -const ToggleValueButton = (props: { - dataPath: Array - activeQuery: Query - value: boolean -}) => { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - const queryClient = useQueryDevtoolsContext().client - - return ( - - ) -} - -type ExplorerProps = { - editable?: boolean - label: string - value: unknown - defaultExpanded?: Array - dataPath?: Array - activeQuery?: Query - itemsDeletable?: boolean - onEdit?: () => void -} - -function isIterable(x: any): x is Iterable { - return Symbol.iterator in x -} - -export default function Explorer(props: ExplorerProps) { - const theme = useTheme() - const css = useQueryDevtoolsContext().shadowDOMTarget - ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) - : goober.css - const styles = createMemo(() => { - return theme() === 'dark' ? darkStyles(css) : lightStyles(css) - }) - const queryClient = useQueryDevtoolsContext().client - - const [expanded, setExpanded] = createSignal( - (props.defaultExpanded || []).includes(props.label), - ) - const toggleExpanded = () => setExpanded((old) => !old) - const [expandedPages, setExpandedPages] = createSignal>([]) - - const subEntries = createMemo(() => { - if (Array.isArray(props.value)) { - return props.value.map((d, i) => ({ - label: i.toString(), - value: d, - })) - } else if ( - props.value !== null && - typeof props.value === 'object' && - isIterable(props.value) && - typeof props.value[Symbol.iterator] === 'function' - ) { - if (props.value instanceof Map) { - return Array.from(props.value, ([key, val]) => ({ - label: key, - value: val, - })) - } - return Array.from(props.value, (val, i) => ({ - label: i.toString(), - value: val, - })) - } else if (typeof props.value === 'object' && props.value !== null) { - return Object.entries(props.value).map(([key, val]) => ({ - label: key, - value: val, - })) - } - return [] - }) - - const type = createMemo(() => { - if (Array.isArray(props.value)) { - return 'array' - } else if ( - props.value !== null && - typeof props.value === 'object' && - isIterable(props.value) && - typeof props.value[Symbol.iterator] === 'function' - ) { - return 'Iterable' - } else if (typeof props.value === 'object' && props.value !== null) { - return 'object' - } - return typeof props.value - }) - - const subEntryPages = createMemo(() => chunkArray(subEntries(), 100)) - - const currentDataPath = props.dataPath ?? [] - - return ( -
- -
- - -
- - - - - - - - - - - - - -
-
-
- - -
- item.label}> - {(entry) => { - return ( - - ) - }} - -
-
- 1}> -
- - {(entries, index) => ( -
-
- - -
- entry.label}> - {(entry) => ( - - )} - -
-
-
-
- )} -
-
-
-
-
- -
- {props.label}: - {displayValue(props.value)} - } - > - - { - const oldData = props.activeQuery!.state.data - - const newData = updateNestedDataByPath( - oldData, - currentDataPath, - type() === 'number' - ? changeEvent.target.valueAsNumber - : changeEvent.target.value, - ) - - queryClient.setQueryData(props.activeQuery!.queryKey, newData) - }} - /> - - - - - - {displayValue(props.value)} - - - - - - - -
-
-
- ) -} - -const stylesFactory = ( - theme: 'light' | 'dark', - css: (typeof goober)['css'], -) => { - const { colors, font, size, border } = tokens - const t = (light: string, dark: string) => (theme === 'light' ? light : dark) - return { - entry: css` - & * { - font-size: ${font.size.xs}; - font-family: - ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, - 'Liberation Mono', 'Courier New', monospace; - } - position: relative; - outline: none; - word-break: break-word; - `, - subEntry: css` - margin: 0 0 0 0.5em; - padding-left: 0.75em; - border-left: 2px solid ${t(colors.gray[300], colors.darkGray[400])}; - /* outline: 1px solid ${colors.teal[400]}; */ - `, - expander: css` - & path { - stroke: ${colors.gray[400]}; - } - & svg { - width: ${size[3]}; - height: ${size[3]}; - } - display: inline-flex; - align-items: center; - transition: all 0.1s ease; - /* outline: 1px solid ${colors.blue[400]}; */ - `, - expanderButtonContainer: css` - display: flex; - align-items: center; - line-height: ${size[4]}; - min-height: ${size[4]}; - gap: ${size[2]}; - `, - expanderButton: css` - cursor: pointer; - color: inherit; - font: inherit; - outline: inherit; - height: ${size[5]}; - background: transparent; - border: none; - padding: 0; - display: inline-flex; - align-items: center; - gap: ${size[1]}; - position: relative; - /* outline: 1px solid ${colors.green[400]}; */ - - &:focus-visible { - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - - & svg { - position: relative; - left: 1px; - } - `, - info: css` - color: ${t(colors.gray[500], colors.gray[500])}; - font-size: ${font.size.xs}; - margin-left: ${size[1]}; - /* outline: 1px solid ${colors.yellow[400]}; */ - `, - label: css` - color: ${t(colors.gray[700], colors.gray[300])}; - white-space: nowrap; - `, - value: css` - color: ${t(colors.purple[600], colors.purple[400])}; - flex-grow: 1; - `, - actions: css` - display: inline-flex; - gap: ${size[2]}; - align-items: center; - `, - row: css` - display: inline-flex; - gap: ${size[2]}; - width: 100%; - margin: ${size[0.25]} 0px; - line-height: ${size[4.5]}; - align-items: center; - `, - editableInput: css` - border: none; - padding: ${size[0.5]} ${size[1]} ${size[0.5]} ${size[1.5]}; - flex-grow: 1; - border-radius: ${border.radius.xs}; - background-color: ${t(colors.gray[200], colors.darkGray[500])}; - - &:hover { - background-color: ${t(colors.gray[300], colors.darkGray[600])}; - } - `, - actionButton: css` - background-color: transparent; - color: ${t(colors.gray[500], colors.gray[500])}; - border: none; - display: inline-flex; - padding: 0px; - align-items: center; - justify-content: center; - cursor: pointer; - width: ${size[3]}; - height: ${size[3]}; - position: relative; - z-index: 1; - - &:hover svg { - color: ${t(colors.gray[600], colors.gray[400])}; - } - - &:focus-visible { - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - outline-offset: 2px; - } - `, - } -} - -const lightStyles = (css: (typeof goober)['css']) => stylesFactory('light', css) -const darkStyles = (css: (typeof goober)['css']) => stylesFactory('dark', css) diff --git a/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtools.tsx b/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtools.tsx deleted file mode 100644 index 4b14c083f..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtools.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import { render } from 'solid-js/web' -import { createSignal, lazy } from 'solid-js' -import { setupStyleSheet } from './utils' -import type { - QueryClient, - onlineManager as TOnlineManager, -} from '@tanstack/query-core' -import type { DevtoolsComponentType } from './Devtools' -import type { - DevtoolsButtonPosition, - DevtoolsErrorType, - DevtoolsPosition, - QueryDevtoolsProps, -} from './contexts' -import type { Signal } from 'solid-js' - -export interface TanstackQueryDevtoolsConfig extends QueryDevtoolsProps { - styleNonce?: string - shadowDOMTarget?: ShadowRoot -} - -class TanstackQueryDevtools { - #client: Signal - #onlineManager: typeof TOnlineManager - #queryFlavor: string - #version: string - #isMounted = false - #styleNonce?: string - #shadowDOMTarget?: ShadowRoot - #buttonPosition: Signal - #position: Signal - #initialIsOpen: Signal - #errorTypes: Signal | undefined> - #Component: DevtoolsComponentType | undefined - #dispose?: () => void - - constructor(config: TanstackQueryDevtoolsConfig) { - const { - client, - queryFlavor, - version, - onlineManager, - buttonPosition, - position, - initialIsOpen, - errorTypes, - styleNonce, - shadowDOMTarget, - } = config - this.#client = createSignal(client) - this.#queryFlavor = queryFlavor - this.#version = version - this.#onlineManager = onlineManager - this.#styleNonce = styleNonce - this.#shadowDOMTarget = shadowDOMTarget - this.#buttonPosition = createSignal(buttonPosition) - this.#position = createSignal(position) - this.#initialIsOpen = createSignal(initialIsOpen) - this.#errorTypes = createSignal(errorTypes) - } - - setButtonPosition(position: DevtoolsButtonPosition) { - this.#buttonPosition[1](position) - } - - setPosition(position: DevtoolsPosition) { - this.#position[1](position) - } - - setInitialIsOpen(isOpen: boolean) { - this.#initialIsOpen[1](isOpen) - } - - setErrorTypes(errorTypes: Array) { - this.#errorTypes[1](errorTypes) - } - - setClient(client: QueryClient) { - this.#client[1](client) - } - - mount(el: T) { - if (this.#isMounted) { - throw new Error('Devtools is already mounted') - } - const dispose = render(() => { - const [btnPosition] = this.#buttonPosition - const [pos] = this.#position - const [isOpen] = this.#initialIsOpen - const [errors] = this.#errorTypes - const [queryClient] = this.#client - let Devtools: DevtoolsComponentType - - if (this.#Component) { - Devtools = this.#Component - } else { - Devtools = lazy(() => import('./DevtoolsComponent')) - this.#Component = Devtools - } - - setupStyleSheet(this.#styleNonce, this.#shadowDOMTarget) - return ( - - ) - }, el) - this.#isMounted = true - this.#dispose = dispose - } - - unmount() { - if (!this.#isMounted) { - throw new Error('Devtools is not mounted') - } - this.#dispose?.() - this.#isMounted = false - } -} - -export { TanstackQueryDevtools } diff --git a/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtoolsPanel.tsx b/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtoolsPanel.tsx deleted file mode 100644 index bf2619885..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/TanstackQueryDevtoolsPanel.tsx +++ /dev/null @@ -1,153 +0,0 @@ -import { render } from 'solid-js/web' -import { createSignal, lazy } from 'solid-js' -import { setupStyleSheet } from './utils' -import type { - QueryClient, - onlineManager as TOnlineManager, -} from '@tanstack/query-core' -import type { DevtoolsComponentType } from './Devtools' -import type { - DevtoolsButtonPosition, - DevtoolsErrorType, - DevtoolsPosition, - QueryDevtoolsProps, -} from './contexts' -import type { Signal } from 'solid-js' - -export interface TanstackQueryDevtoolsPanelConfig extends QueryDevtoolsProps { - styleNonce?: string - shadowDOMTarget?: ShadowRoot - onClose?: () => unknown -} - -class TanstackQueryDevtoolsPanel { - #client: Signal - #onlineManager: typeof TOnlineManager - #queryFlavor: string - #version: string - #isMounted = false - #styleNonce?: string - #shadowDOMTarget?: ShadowRoot - #buttonPosition: Signal - #position: Signal - #initialIsOpen: Signal - #errorTypes: Signal | undefined> - #onClose: Signal<(() => unknown) | undefined> - #Component: DevtoolsComponentType | undefined - #dispose?: () => void - - constructor(config: TanstackQueryDevtoolsPanelConfig) { - const { - client, - queryFlavor, - version, - onlineManager, - buttonPosition, - position, - initialIsOpen, - errorTypes, - styleNonce, - shadowDOMTarget, - onClose, - } = config - this.#client = createSignal(client) - this.#queryFlavor = queryFlavor - this.#version = version - this.#onlineManager = onlineManager - this.#styleNonce = styleNonce - this.#shadowDOMTarget = shadowDOMTarget - this.#buttonPosition = createSignal(buttonPosition) - this.#position = createSignal(position) - this.#initialIsOpen = createSignal(initialIsOpen) - this.#errorTypes = createSignal(errorTypes) - this.#onClose = createSignal(onClose) - } - - setButtonPosition(position: DevtoolsButtonPosition) { - this.#buttonPosition[1](position) - } - - setPosition(position: DevtoolsPosition) { - this.#position[1](position) - } - - setInitialIsOpen(isOpen: boolean) { - this.#initialIsOpen[1](isOpen) - } - - setErrorTypes(errorTypes: Array) { - this.#errorTypes[1](errorTypes) - } - - setClient(client: QueryClient) { - this.#client[1](client) - } - - setOnClose(onClose: () => unknown) { - this.#onClose[1](() => onClose) - } - - mount(el: T) { - if (this.#isMounted) { - throw new Error('Devtools is already mounted') - } - const dispose = render(() => { - const [btnPosition] = this.#buttonPosition - const [pos] = this.#position - const [isOpen] = this.#initialIsOpen - const [errors] = this.#errorTypes - const [queryClient] = this.#client - const [onClose] = this.#onClose - let Devtools: DevtoolsComponentType - - if (this.#Component) { - Devtools = this.#Component - } else { - Devtools = lazy(() => import('./DevtoolsPanelComponent')) - this.#Component = Devtools - } - - setupStyleSheet(this.#styleNonce, this.#shadowDOMTarget) - return ( - - ) - }, el) - this.#isMounted = true - this.#dispose = dispose - } - - unmount() { - if (!this.#isMounted) { - throw new Error('Devtools is not mounted') - } - this.#dispose?.() - this.#isMounted = false - } -} - -export { TanstackQueryDevtoolsPanel } diff --git a/devtools-reference/tanstack-query/query-devtools/src/__tests__/devtools.test.tsx b/devtools-reference/tanstack-query/query-devtools/src/__tests__/devtools.test.tsx deleted file mode 100644 index 0e44d74db..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/__tests__/devtools.test.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { describe, expect, it } from 'vitest' - -describe('ReactQueryDevtools', () => { - it('should be able to open and close devtools', () => { - expect(1).toBe(1) - }) -}) diff --git a/devtools-reference/tanstack-query/query-devtools/src/__tests__/utils.test.ts b/devtools-reference/tanstack-query/query-devtools/src/__tests__/utils.test.ts deleted file mode 100644 index 60fbcf130..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/__tests__/utils.test.ts +++ /dev/null @@ -1,732 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { deleteNestedDataByPath, updateNestedDataByPath } from '../utils' - -describe('Utils tests', () => { - describe('updatedNestedDataByPath', () => { - describe('array', () => { - it('should update data correctly', () => { - const oldData = ['one', 'two', 'three'] - - const newData = updateNestedDataByPath(oldData, ['1'], 'new') - - expect(newData).not.toBe(oldData) // should not be the same reference - - expect(oldData).toMatchInlineSnapshot(` - [ - "one", - "two", - "three", - ] - `) - expect(newData).toMatchInlineSnapshot(` - [ - "one", - "new", - "three", - ] - `) - }) - }) - - describe('object', () => { - it('should update data correctly', () => { - const oldData = { title: 'Hello world', id: 1, createdAt: '2021-01-01' } - - const newData = updateNestedDataByPath( - oldData, - ['title'], - 'Brave new world', - ) - - expect(newData).not.toBe(oldData) // should not be the same reference - - expect(oldData).toMatchInlineSnapshot(` - { - "createdAt": "2021-01-01", - "id": 1, - "title": "Hello world", - } - `) - expect(newData).toMatchInlineSnapshot(` - { - "createdAt": "2021-01-01", - "id": 1, - "title": "Brave new world", - } - `) - }) - }) - - describe('set', () => { - it('should update data correctly', () => { - const oldData = new Set([123, 321, 'hello', 'world']) - - const newData = updateNestedDataByPath(oldData, ['2'], 'hi') - - expect(newData).not.toBe(oldData) // should not be the same reference - - expect(oldData).toMatchInlineSnapshot(` - Set { - 123, - 321, - "hello", - "world", - } - `) - expect(newData).toMatchInlineSnapshot(` - Set { - 123, - 321, - "hi", - "world", - } - `) - }) - }) - - describe('map', () => { - it('should update data correctly', () => { - const oldData = new Map([ - ['en', 'hello'], - ['fr', 'bonjour'], - ]) - - /* eslint-disable cspell/spellchecker */ - const newData = updateNestedDataByPath(oldData, ['fr'], 'salut') - - expect(newData).not.toBe(oldData) // should not be the same reference - - expect(oldData).toMatchInlineSnapshot(` - Map { - "en" => "hello", - "fr" => "bonjour", - } - `) - expect(newData).toMatchInlineSnapshot(` - Map { - "en" => "hello", - "fr" => "salut", - } - `) - }) - /* eslint-enable */ - }) - - describe('nested data', () => { - it('should update data correctly', () => { - /* eslint-disable cspell/spellchecker */ - const oldData = new Map([ - [ - 'pumpkin-pie', - { - id: 1, - title: 'Pumpkin pie', - ingredients: new Set(['pumpkin', 'sugar', 'spices']), - steps: ['mix', 'bake', 'eat'], - translations: new Map([ - ['en', 'Pumpkin pie'], - ['fr', 'Tarte à la citrouille'], - ]), - }, - ], - [ - 'spaghetti-bolonese', - { - id: 2, - title: 'Spaghetti bolonese', - ingredients: new Set([ - 'spaghetti', - 'tomato sauce', - 'minced meat', - ]), - steps: ['cook', 'eat'], - translations: new Map([ - ['en', 'Spaghetti bolonese'], - ['fr', 'Spaghetti bolonaise'], - ]), - }, - ], - ]) - - const updatedObject = updateNestedDataByPath( - oldData, - ['pumpkin-pie', 'title'], - 'Pumpkin pie with whipped cream', - ) - - const updatedArray = updateNestedDataByPath( - oldData, - ['spaghetti-bolonese', 'steps', '0'], - 'prepare', - ) - - const updatedSet = updateNestedDataByPath( - oldData, - ['pumpkin-pie', 'ingredients', '1'], - 'honey', - ) - - const updatedMap = updateNestedDataByPath( - oldData, - ['pumpkin-pie', 'translations', 'en'], - 'Best pie ever', - ) - - expect(oldData).toMatchInlineSnapshot(` - Map { - "pumpkin-pie" => { - "id": 1, - "ingredients": Set { - "pumpkin", - "sugar", - "spices", - }, - "steps": [ - "mix", - "bake", - "eat", - ], - "title": "Pumpkin pie", - "translations": Map { - "en" => "Pumpkin pie", - "fr" => "Tarte à la citrouille", - }, - }, - "spaghetti-bolonese" => { - "id": 2, - "ingredients": Set { - "spaghetti", - "tomato sauce", - "minced meat", - }, - "steps": [ - "cook", - "eat", - ], - "title": "Spaghetti bolonese", - "translations": Map { - "en" => "Spaghetti bolonese", - "fr" => "Spaghetti bolonaise", - }, - }, - } - `) - - expect(updatedObject).toMatchInlineSnapshot(` - Map { - "pumpkin-pie" => { - "id": 1, - "ingredients": Set { - "pumpkin", - "sugar", - "spices", - }, - "steps": [ - "mix", - "bake", - "eat", - ], - "title": "Pumpkin pie with whipped cream", - "translations": Map { - "en" => "Pumpkin pie", - "fr" => "Tarte à la citrouille", - }, - }, - "spaghetti-bolonese" => { - "id": 2, - "ingredients": Set { - "spaghetti", - "tomato sauce", - "minced meat", - }, - "steps": [ - "cook", - "eat", - ], - "title": "Spaghetti bolonese", - "translations": Map { - "en" => "Spaghetti bolonese", - "fr" => "Spaghetti bolonaise", - }, - }, - } - `) - - expect(updatedArray).toMatchInlineSnapshot(` - Map { - "pumpkin-pie" => { - "id": 1, - "ingredients": Set { - "pumpkin", - "sugar", - "spices", - }, - "steps": [ - "mix", - "bake", - "eat", - ], - "title": "Pumpkin pie", - "translations": Map { - "en" => "Pumpkin pie", - "fr" => "Tarte à la citrouille", - }, - }, - "spaghetti-bolonese" => { - "id": 2, - "ingredients": Set { - "spaghetti", - "tomato sauce", - "minced meat", - }, - "steps": [ - "prepare", - "eat", - ], - "title": "Spaghetti bolonese", - "translations": Map { - "en" => "Spaghetti bolonese", - "fr" => "Spaghetti bolonaise", - }, - }, - } - `) - - expect(updatedSet).toMatchInlineSnapshot(` - Map { - "pumpkin-pie" => { - "id": 1, - "ingredients": Set { - "pumpkin", - "honey", - "spices", - }, - "steps": [ - "mix", - "bake", - "eat", - ], - "title": "Pumpkin pie", - "translations": Map { - "en" => "Pumpkin pie", - "fr" => "Tarte à la citrouille", - }, - }, - "spaghetti-bolonese" => { - "id": 2, - "ingredients": Set { - "spaghetti", - "tomato sauce", - "minced meat", - }, - "steps": [ - "cook", - "eat", - ], - "title": "Spaghetti bolonese", - "translations": Map { - "en" => "Spaghetti bolonese", - "fr" => "Spaghetti bolonaise", - }, - }, - } - `) - - expect(updatedMap).toMatchInlineSnapshot(` - Map { - "pumpkin-pie" => { - "id": 1, - "ingredients": Set { - "pumpkin", - "sugar", - "spices", - }, - "steps": [ - "mix", - "bake", - "eat", - ], - "title": "Pumpkin pie", - "translations": Map { - "en" => "Best pie ever", - "fr" => "Tarte à la citrouille", - }, - }, - "spaghetti-bolonese" => { - "id": 2, - "ingredients": Set { - "spaghetti", - "tomato sauce", - "minced meat", - }, - "steps": [ - "cook", - "eat", - ], - "title": "Spaghetti bolonese", - "translations": Map { - "en" => "Spaghetti bolonese", - "fr" => "Spaghetti bolonaise", - }, - }, - } - `) - /* eslint-enable */ - }) - }) - }) - - describe('deleteNestedDataByPath', () => { - it('should delete item from array correctly', () => { - const oldData = ['one', 'two', 'three'] - - const newData = deleteNestedDataByPath(oldData, ['1']) - - expect(newData).not.toBe(oldData) // should not be the same reference - - expect(oldData).toMatchInlineSnapshot(` - [ - "one", - "two", - "three", - ] - `) - expect(newData).toMatchInlineSnapshot(` - [ - "one", - "three", - ] - `) - }) - - it('should delete item from object correctly', () => { - const oldData = { title: 'Hello world', id: 1, createdAt: '2021-01-01' } - - const newData = deleteNestedDataByPath(oldData, ['createdAt']) - - expect(newData).not.toBe(oldData) // should not be the same reference - - expect(oldData).toMatchInlineSnapshot(` - { - "createdAt": "2021-01-01", - "id": 1, - "title": "Hello world", - } - `) - expect(newData).toMatchInlineSnapshot(` - { - "id": 1, - "title": "Hello world", - } - `) - }) - - it('should delete item from set', () => { - const oldData = new Set([123, 321, false, true]) - - const newData = deleteNestedDataByPath(oldData, ['1']) - - expect(newData).not.toBe(oldData) // should not be the same reference - - expect(oldData).toMatchInlineSnapshot(` - Set { - 123, - 321, - false, - true, - } - `) - expect(newData).toMatchInlineSnapshot(` - Set { - 123, - false, - true, - } - `) - }) - - it('should delete item from map', () => { - const oldData = new Map([ - ['123', 'one'], - ['hello', 'two'], - ['world', 'three'], - ]) - - const newData = deleteNestedDataByPath(oldData, ['world']) - - expect(newData).not.toBe(oldData) // should not be the same reference - - expect(oldData).toMatchInlineSnapshot(` - Map { - "123" => "one", - "hello" => "two", - "world" => "three", - } - `) - expect(newData).toMatchInlineSnapshot(` - Map { - "123" => "one", - "hello" => "two", - } - `) - }) - - describe('nested data', () => { - it('should delete nested items correctly', () => { - /* eslint-disable cspell/spellchecker */ - const oldData = new Map([ - [ - 'pumpkin-pie', - { - id: 1, - title: 'Pumpkin pie', - ingredients: new Set(['pumpkin', 'sugar', 'spices']), - steps: ['mix', 'bake', 'eat'], - translations: new Map([ - ['en', 'Pumpkin pie'], - ['fr', 'Tarte à la citrouille'], - ]), - }, - ], - [ - 'spaghetti-bolonese', - { - id: 2, - title: 'Spaghetti bolonese', - ingredients: new Set([ - 'spaghetti', - 'tomato sauce', - 'minced meat', - ]), - steps: ['cook', 'eat'], - translations: new Map([ - ['en', 'Spaghetti bolonese'], - ['fr', 'Spaghetti bolonaise'], - ]), - }, - ], - ]) - - const deletedFromSet = deleteNestedDataByPath(oldData, [ - 'spaghetti-bolonese', - 'ingredients', - '0', - ]) - - const deletedFromArray = deleteNestedDataByPath(oldData, [ - 'pumpkin-pie', - 'steps', - '1', - ]) - - const deletedFromObject = deleteNestedDataByPath(oldData, [ - 'pumpkin-pie', - 'title', - ]) - - const deletedFromMap = deleteNestedDataByPath(oldData, [ - 'spaghetti-bolonese', - 'translations', - 'fr', - ]) - - expect(oldData).toMatchInlineSnapshot(` - Map { - "pumpkin-pie" => { - "id": 1, - "ingredients": Set { - "pumpkin", - "sugar", - "spices", - }, - "steps": [ - "mix", - "bake", - "eat", - ], - "title": "Pumpkin pie", - "translations": Map { - "en" => "Pumpkin pie", - "fr" => "Tarte à la citrouille", - }, - }, - "spaghetti-bolonese" => { - "id": 2, - "ingredients": Set { - "spaghetti", - "tomato sauce", - "minced meat", - }, - "steps": [ - "cook", - "eat", - ], - "title": "Spaghetti bolonese", - "translations": Map { - "en" => "Spaghetti bolonese", - "fr" => "Spaghetti bolonaise", - }, - }, - } - `) - - expect(deletedFromSet).toMatchInlineSnapshot(` - Map { - "pumpkin-pie" => { - "id": 1, - "ingredients": Set { - "pumpkin", - "sugar", - "spices", - }, - "steps": [ - "mix", - "bake", - "eat", - ], - "title": "Pumpkin pie", - "translations": Map { - "en" => "Pumpkin pie", - "fr" => "Tarte à la citrouille", - }, - }, - "spaghetti-bolonese" => { - "id": 2, - "ingredients": Set { - "tomato sauce", - "minced meat", - }, - "steps": [ - "cook", - "eat", - ], - "title": "Spaghetti bolonese", - "translations": Map { - "en" => "Spaghetti bolonese", - "fr" => "Spaghetti bolonaise", - }, - }, - } - `) - - expect(deletedFromArray).toMatchInlineSnapshot(` - Map { - "pumpkin-pie" => { - "id": 1, - "ingredients": Set { - "pumpkin", - "sugar", - "spices", - }, - "steps": [ - "mix", - "eat", - ], - "title": "Pumpkin pie", - "translations": Map { - "en" => "Pumpkin pie", - "fr" => "Tarte à la citrouille", - }, - }, - "spaghetti-bolonese" => { - "id": 2, - "ingredients": Set { - "spaghetti", - "tomato sauce", - "minced meat", - }, - "steps": [ - "cook", - "eat", - ], - "title": "Spaghetti bolonese", - "translations": Map { - "en" => "Spaghetti bolonese", - "fr" => "Spaghetti bolonaise", - }, - }, - } - `) - - expect(deletedFromObject).toMatchInlineSnapshot(` - Map { - "pumpkin-pie" => { - "id": 1, - "ingredients": Set { - "pumpkin", - "sugar", - "spices", - }, - "steps": [ - "mix", - "bake", - "eat", - ], - "translations": Map { - "en" => "Pumpkin pie", - "fr" => "Tarte à la citrouille", - }, - }, - "spaghetti-bolonese" => { - "id": 2, - "ingredients": Set { - "spaghetti", - "tomato sauce", - "minced meat", - }, - "steps": [ - "cook", - "eat", - ], - "title": "Spaghetti bolonese", - "translations": Map { - "en" => "Spaghetti bolonese", - "fr" => "Spaghetti bolonaise", - }, - }, - } - `) - - expect(deletedFromMap).toMatchInlineSnapshot(` - Map { - "pumpkin-pie" => { - "id": 1, - "ingredients": Set { - "pumpkin", - "sugar", - "spices", - }, - "steps": [ - "mix", - "bake", - "eat", - ], - "title": "Pumpkin pie", - "translations": Map { - "en" => "Pumpkin pie", - "fr" => "Tarte à la citrouille", - }, - }, - "spaghetti-bolonese" => { - "id": 2, - "ingredients": Set { - "spaghetti", - "tomato sauce", - "minced meat", - }, - "steps": [ - "cook", - "eat", - ], - "title": "Spaghetti bolonese", - "translations": Map { - "en" => "Spaghetti bolonese", - }, - }, - } - `) - /* eslint-enable */ - }) - }) - }) -}) diff --git a/devtools-reference/tanstack-query/query-devtools/src/constants.ts b/devtools-reference/tanstack-query/query-devtools/src/constants.ts deleted file mode 100644 index b4c0c2250..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/constants.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { mutationSortFns, sortFns } from './utils' -import type { DevtoolsButtonPosition, DevtoolsPosition } from './contexts' - -export const firstBreakpoint = 1024 -export const secondBreakpoint = 796 -export const thirdBreakpoint = 700 - -export const BUTTON_POSITION: DevtoolsButtonPosition = 'bottom-right' -export const POSITION: DevtoolsPosition = 'bottom' -export const THEME_PREFERENCE = 'system' -export const INITIAL_IS_OPEN = false -export const DEFAULT_HEIGHT = 500 -export const PIP_DEFAULT_HEIGHT = 500 -export const DEFAULT_WIDTH = 500 -export const DEFAULT_SORT_FN_NAME = Object.keys(sortFns)[0] -export const DEFAULT_SORT_ORDER = 1 -export const DEFAULT_MUTATION_SORT_FN_NAME = Object.keys(mutationSortFns)[0] diff --git a/devtools-reference/tanstack-query/query-devtools/src/contexts/PiPContext.tsx b/devtools-reference/tanstack-query/query-devtools/src/contexts/PiPContext.tsx deleted file mode 100644 index 378f46973..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/contexts/PiPContext.tsx +++ /dev/null @@ -1,191 +0,0 @@ -import { - createContext, - createEffect, - createMemo, - createSignal, - onCleanup, - useContext, -} from 'solid-js' -import { clearDelegatedEvents, delegateEvents } from 'solid-js/web' -import { PIP_DEFAULT_HEIGHT } from '../constants' -import { useQueryDevtoolsContext } from './QueryDevtoolsContext' -import type { Accessor, JSX } from 'solid-js' -import type { StorageObject, StorageSetter } from '@solid-primitives/storage' - -interface PiPProviderProps { - children: JSX.Element - localStore: StorageObject - setLocalStore: StorageSetter - disabled?: boolean -} - -type PiPContextType = { - pipWindow: Window | null - requestPipWindow: (width: number, height: number) => void - closePipWindow: () => void - disabled: boolean -} - -const PiPContext = createContext | undefined>( - undefined, -) - -export const PiPProvider = (props: PiPProviderProps) => { - // Expose pipWindow that is currently active - const [pipWindow, setPipWindow] = createSignal(null) - - // Close pipWindow programmatically - const closePipWindow = () => { - const w = pipWindow() - if (w != null) { - w.close() - setPipWindow(null) - } - } - - // Open new pipWindow - const requestPipWindow = (width: number, height: number) => { - // We don't want to allow multiple requests. - if (pipWindow() != null) { - return - } - - const pip = window.open( - '', - 'TSQD-Devtools-Panel', - `width=${width},height=${height},popup`, - ) - - if (!pip) { - throw new Error( - 'Failed to open popup. Please allow popups for this site to view the devtools in picture-in-picture mode.', - ) - } - - // Remove existing styles - pip.document.head.innerHTML = '' - // Remove existing body - pip.document.body.innerHTML = '' - // Clear Delegated Events - clearDelegatedEvents(pip.document) - - pip.document.title = 'TanStack Query Devtools' - pip.document.body.style.margin = '0' - - // Detect when window is closed by user - pip.addEventListener('pagehide', () => { - props.setLocalStore('pip_open', 'false') - setPipWindow(null) - }) - - // It is important to copy all parent window styles. Otherwise, there would be no CSS available at all - // https://developer.chrome.com/docs/web-platform/document-picture-in-picture/#copy-style-sheets-to-the-picture-in-picture-window - ;[ - ...(useQueryDevtoolsContext().shadowDOMTarget || document).styleSheets, - ].forEach((styleSheet) => { - try { - const cssRules = [...styleSheet.cssRules] - .map((rule) => rule.cssText) - .join('') - const style = document.createElement('style') - const style_node = styleSheet.ownerNode - let style_id = '' - - if (style_node && 'id' in style_node) { - style_id = style_node.id - } - - if (style_id) { - style.setAttribute('id', style_id) - } - style.textContent = cssRules - pip.document.head.appendChild(style) - } catch (e) { - const link = document.createElement('link') - if (styleSheet.href == null) { - return - } - - link.rel = 'stylesheet' - link.type = styleSheet.type - link.media = styleSheet.media.toString() - link.href = styleSheet.href - pip.document.head.appendChild(link) - } - }) - delegateEvents( - [ - 'focusin', - 'focusout', - 'pointermove', - 'keydown', - 'pointerdown', - 'pointerup', - 'click', - 'mousedown', - 'input', - ], - pip.document, - ) - props.setLocalStore('pip_open', 'true') - setPipWindow(pip) - } - - createEffect(() => { - const pip_open = (props.localStore.pip_open ?? 'false') as 'true' | 'false' - if (pip_open === 'true' && !props.disabled) { - requestPipWindow( - Number(window.innerWidth), - Number(props.localStore.height || PIP_DEFAULT_HEIGHT), - ) - } - }) - - createEffect(() => { - // Setup mutation observer for goober styles with id `_goober - const gooberStyles = ( - useQueryDevtoolsContext().shadowDOMTarget || document - ).querySelector('#_goober') - const w = pipWindow() - if (gooberStyles && w) { - const observer = new MutationObserver(() => { - const pip_style = ( - useQueryDevtoolsContext().shadowDOMTarget || w.document - ).querySelector('#_goober') - if (pip_style) { - pip_style.textContent = gooberStyles.textContent - } - }) - observer.observe(gooberStyles, { - childList: true, // observe direct children - subtree: true, // and lower descendants too - characterDataOldValue: true, // pass old data to callback - }) - onCleanup(() => { - observer.disconnect() - }) - } - }) - - const value = createMemo(() => ({ - pipWindow: pipWindow(), - requestPipWindow, - closePipWindow, - disabled: props.disabled ?? false, - })) - - return ( - {props.children} - ) -} - -export const usePiPWindow = () => { - const context = createMemo(() => { - const ctx = useContext(PiPContext) - if (!ctx) { - throw new Error('usePiPWindow must be used within a PiPProvider') - } - return ctx() - }) - return context -} diff --git a/devtools-reference/tanstack-query/query-devtools/src/contexts/QueryDevtoolsContext.ts b/devtools-reference/tanstack-query/query-devtools/src/contexts/QueryDevtoolsContext.ts deleted file mode 100644 index 5af5ba3f7..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/contexts/QueryDevtoolsContext.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { createContext, useContext } from 'solid-js' -import type { Query, QueryClient, onlineManager } from '@tanstack/query-core' - -type XPosition = 'left' | 'right' -type YPosition = 'top' | 'bottom' -export type DevtoolsPosition = XPosition | YPosition -export type DevtoolsButtonPosition = `${YPosition}-${XPosition}` | 'relative' - -export interface DevtoolsErrorType { - /** - * The name of the error. - */ - name: string - /** - * How the error is initialized. - */ - initializer: (query: Query) => Error -} - -export interface QueryDevtoolsProps { - readonly client: QueryClient - queryFlavor: string - version: string - onlineManager: typeof onlineManager - - buttonPosition?: DevtoolsButtonPosition - position?: DevtoolsPosition - initialIsOpen?: boolean - errorTypes?: Array - shadowDOMTarget?: ShadowRoot - onClose?: () => unknown -} - -export const QueryDevtoolsContext = createContext({ - client: undefined as unknown as QueryClient, - onlineManager: undefined as unknown as typeof onlineManager, - queryFlavor: '', - version: '', - shadowDOMTarget: undefined, -}) - -export function useQueryDevtoolsContext() { - return useContext(QueryDevtoolsContext) -} diff --git a/devtools-reference/tanstack-query/query-devtools/src/contexts/ThemeContext.ts b/devtools-reference/tanstack-query/query-devtools/src/contexts/ThemeContext.ts deleted file mode 100644 index dfb286341..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/contexts/ThemeContext.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { createContext, useContext } from 'solid-js' -import type { Accessor } from 'solid-js' - -export const ThemeContext = createContext>( - () => 'dark' as const, -) - -export function useTheme() { - return useContext(ThemeContext) -} diff --git a/devtools-reference/tanstack-query/query-devtools/src/contexts/index.ts b/devtools-reference/tanstack-query/query-devtools/src/contexts/index.ts deleted file mode 100644 index b9329a3cd..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/contexts/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './PiPContext' -export * from './QueryDevtoolsContext' -export * from './ThemeContext' diff --git a/devtools-reference/tanstack-query/query-devtools/src/icons/index.tsx b/devtools-reference/tanstack-query/query-devtools/src/icons/index.tsx deleted file mode 100644 index 7075634de..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/icons/index.tsx +++ /dev/null @@ -1,1385 +0,0 @@ -import { Show, createUniqueId } from 'solid-js' - -export function Search() { - return ( - - - - ) -} - -export function Trash() { - return ( - - - - ) -} - -export function ChevronDown() { - return ( - - - - ) -} - -export function ArrowUp() { - return ( - - - - ) -} - -export function ArrowDown() { - return ( - - - - ) -} - -export function ArrowLeft() { - return ( - - - - ) -} - -export function ArrowRight() { - return ( - - - - ) -} - -export function Sun() { - return ( - - - - ) -} - -export function Moon() { - return ( - - - - ) -} - -export function Monitor() { - return ( - - - - ) -} - -export function Wifi() { - return ( - - - - - ) -} - -export function Offline() { - return ( - - - - - ) -} - -export function Settings() { - return ( - - - - - ) -} - -export function PiPIcon() { - return ( - - - - ) -} - -export function Copier() { - return ( - - - - ) -} - -export function Pencil() { - return ( - - - - ) -} - -export function CopiedCopier(props: { theme: 'light' | 'dark' }) { - return ( - - - - ) -} - -export function ErrorCopier() { - return ( - - - - ) -} - -export function List() { - return ( - - - - - - - ) -} - -export function Check(props: { checked: boolean; theme: 'light' | 'dark' }) { - return ( - <> - - - - - - - - - - - - ) -} - -export function CheckCircle() { - return ( - - - - ) -} - -export function LoadingCircle() { - return ( - - - - - ) -} - -export function XCircle() { - return ( - - - - ) -} - -export function PauseCircle() { - return ( - - - - ) -} - -export function TanstackLogo() { - const id = createUniqueId() - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ) -} diff --git a/devtools-reference/tanstack-query/query-devtools/src/index.ts b/devtools-reference/tanstack-query/query-devtools/src/index.ts deleted file mode 100644 index 1cf3cedd1..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type { - DevtoolsButtonPosition, - DevtoolsErrorType, - DevtoolsPosition, -} from './contexts' -export { - TanstackQueryDevtools, - type TanstackQueryDevtoolsConfig, -} from './TanstackQueryDevtools' -export { - TanstackQueryDevtoolsPanel, - type TanstackQueryDevtoolsPanelConfig, -} from './TanstackQueryDevtoolsPanel' diff --git a/devtools-reference/tanstack-query/query-devtools/src/theme.ts b/devtools-reference/tanstack-query/query-devtools/src/theme.ts deleted file mode 100644 index 6f515f359..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/theme.ts +++ /dev/null @@ -1,299 +0,0 @@ -export const tokens = { - colors: { - inherit: 'inherit', - current: 'currentColor', - transparent: 'transparent', - black: '#000000', - white: '#ffffff', - neutral: { - 50: '#f9fafb', - 100: '#f2f4f7', - 200: '#eaecf0', - 300: '#d0d5dd', - 400: '#98a2b3', - 500: '#667085', - 600: '#475467', - 700: '#344054', - 800: '#1d2939', - 900: '#101828', - }, - darkGray: { - 50: '#525c7a', - 100: '#49536e', - 200: '#414962', - 300: '#394056', - 400: '#313749', - 500: '#292e3d', - 600: '#212530', - 700: '#191c24', - 800: '#111318', - 900: '#0b0d10', - }, - gray: { - 50: '#f9fafb', - 100: '#f2f4f7', - 200: '#eaecf0', - 300: '#d0d5dd', - 400: '#98a2b3', - 500: '#667085', - 600: '#475467', - 700: '#344054', - 800: '#1d2939', - 900: '#101828', - }, - blue: { - 25: '#F5FAFF', - 50: '#EFF8FF', - 100: '#D1E9FF', - 200: '#B2DDFF', - 300: '#84CAFF', - 400: '#53B1FD', - 500: '#2E90FA', - 600: '#1570EF', - 700: '#175CD3', - 800: '#1849A9', - 900: '#194185', - }, - green: { - 25: '#F6FEF9', - 50: '#ECFDF3', - 100: '#D1FADF', - 200: '#A6F4C5', - 300: '#6CE9A6', - 400: '#32D583', - 500: '#12B76A', - 600: '#039855', - 700: '#027A48', - 800: '#05603A', - 900: '#054F31', - }, - red: { - 50: '#fef2f2', - 100: '#fee2e2', - 200: '#fecaca', - 300: '#fca5a5', - 400: '#f87171', - 500: '#ef4444', - 600: '#dc2626', - 700: '#b91c1c', - 800: '#991b1b', - 900: '#7f1d1d', - 950: '#450a0a', - }, - yellow: { - 25: '#FFFCF5', - 50: '#FFFAEB', - 100: '#FEF0C7', - 200: '#FEDF89', - 300: '#FEC84B', - 400: '#FDB022', - 500: '#F79009', - 600: '#DC6803', - 700: '#B54708', - 800: '#93370D', - 900: '#7A2E0E', - }, - purple: { - 25: '#FAFAFF', - 50: '#F4F3FF', - 100: '#EBE9FE', - 200: '#D9D6FE', - 300: '#BDB4FE', - 400: '#9B8AFB', - 500: '#7A5AF8', - 600: '#6938EF', - 700: '#5925DC', - 800: '#4A1FB8', - 900: '#3E1C96', - }, - teal: { - 25: '#F6FEFC', - 50: '#F0FDF9', - 100: '#CCFBEF', - 200: '#99F6E0', - 300: '#5FE9D0', - 400: '#2ED3B7', - 500: '#15B79E', - 600: '#0E9384', - 700: '#107569', - 800: '#125D56', - 900: '#134E48', - }, - pink: { - 25: '#fdf2f8', - 50: '#fce7f3', - 100: '#fbcfe8', - 200: '#f9a8d4', - 300: '#f472b6', - 400: '#ec4899', - 500: '#db2777', - 600: '#be185d', - 700: '#9d174d', - 800: '#831843', - 900: '#500724', - }, - cyan: { - 25: '#ecfeff', - 50: '#cffafe', - 100: '#a5f3fc', - 200: '#67e8f9', - 300: '#22d3ee', - 400: '#06b6d4', - 500: '#0891b2', - 600: '#0e7490', - 700: '#155e75', - 800: '#164e63', - 900: '#083344', - }, - }, - alpha: { - 100: 'ff', - 90: 'e5', - 80: 'cc', - 70: 'b3', - 60: '99', - 50: '80', - 40: '66', - 30: '4d', - 20: '33', - 10: '1a', - 0: '00', - }, - font: { - size: { - '2xs': 'calc(var(--tsqd-font-size) * 0.625)', - xs: 'calc(var(--tsqd-font-size) * 0.75)', - sm: 'calc(var(--tsqd-font-size) * 0.875)', - md: 'var(--tsqd-font-size)', - lg: 'calc(var(--tsqd-font-size) * 1.125)', - xl: 'calc(var(--tsqd-font-size) * 1.25)', - '2xl': 'calc(var(--tsqd-font-size) * 1.5)', - '3xl': 'calc(var(--tsqd-font-size) * 1.875)', - '4xl': 'calc(var(--tsqd-font-size) * 2.25)', - '5xl': 'calc(var(--tsqd-font-size) * 3)', - '6xl': 'calc(var(--tsqd-font-size) * 3.75)', - '7xl': 'calc(var(--tsqd-font-size) * 4.5)', - '8xl': 'calc(var(--tsqd-font-size) * 6)', - '9xl': 'calc(var(--tsqd-font-size) * 8)', - }, - lineHeight: { - xs: 'calc(var(--tsqd-font-size) * 1)', - sm: 'calc(var(--tsqd-font-size) * 1.25)', - md: 'calc(var(--tsqd-font-size) * 1.5)', - lg: 'calc(var(--tsqd-font-size) * 1.75)', - xl: 'calc(var(--tsqd-font-size) * 2)', - '2xl': 'calc(var(--tsqd-font-size) * 2.25)', - '3xl': 'calc(var(--tsqd-font-size) * 2.5)', - '4xl': 'calc(var(--tsqd-font-size) * 2.75)', - '5xl': 'calc(var(--tsqd-font-size) * 3)', - '6xl': 'calc(var(--tsqd-font-size) * 3.25)', - '7xl': 'calc(var(--tsqd-font-size) * 3.5)', - '8xl': 'calc(var(--tsqd-font-size) * 3.75)', - '9xl': 'calc(var(--tsqd-font-size) * 4)', - }, - weight: { - thin: '100', - extralight: '200', - light: '300', - normal: '400', - medium: '500', - semibold: '600', - bold: '700', - extrabold: '800', - black: '900', - }, - }, - breakpoints: { - xs: '320px', - sm: '640px', - md: '768px', - lg: '1024px', - xl: '1280px', - '2xl': '1536px', - }, - border: { - radius: { - none: '0px', - xs: 'calc(var(--tsqd-font-size) * 0.125)', - sm: 'calc(var(--tsqd-font-size) * 0.25)', - md: 'calc(var(--tsqd-font-size) * 0.375)', - lg: 'calc(var(--tsqd-font-size) * 0.5)', - xl: 'calc(var(--tsqd-font-size) * 0.75)', - '2xl': 'calc(var(--tsqd-font-size) * 1)', - '3xl': 'calc(var(--tsqd-font-size) * 1.5)', - full: '9999px', - }, - }, - size: { - 0: '0px', - 0.25: 'calc(var(--tsqd-font-size) * 0.0625)', - 0.5: 'calc(var(--tsqd-font-size) * 0.125)', - 1: 'calc(var(--tsqd-font-size) * 0.25)', - 1.5: 'calc(var(--tsqd-font-size) * 0.375)', - 2: 'calc(var(--tsqd-font-size) * 0.5)', - 2.5: 'calc(var(--tsqd-font-size) * 0.625)', - 3: 'calc(var(--tsqd-font-size) * 0.75)', - 3.5: 'calc(var(--tsqd-font-size) * 0.875)', - 4: 'calc(var(--tsqd-font-size) * 1)', - 4.5: 'calc(var(--tsqd-font-size) * 1.125)', - 5: 'calc(var(--tsqd-font-size) * 1.25)', - 5.5: 'calc(var(--tsqd-font-size) * 1.375)', - 6: 'calc(var(--tsqd-font-size) * 1.5)', - 6.5: 'calc(var(--tsqd-font-size) * 1.625)', - 7: 'calc(var(--tsqd-font-size) * 1.75)', - 8: 'calc(var(--tsqd-font-size) * 2)', - 9: 'calc(var(--tsqd-font-size) * 2.25)', - 10: 'calc(var(--tsqd-font-size) * 2.5)', - 11: 'calc(var(--tsqd-font-size) * 2.75)', - 12: 'calc(var(--tsqd-font-size) * 3)', - 14: 'calc(var(--tsqd-font-size) * 3.5)', - 16: 'calc(var(--tsqd-font-size) * 4)', - 20: 'calc(var(--tsqd-font-size) * 5)', - 24: 'calc(var(--tsqd-font-size) * 6)', - 28: 'calc(var(--tsqd-font-size) * 7)', - 32: 'calc(var(--tsqd-font-size) * 8)', - 36: 'calc(var(--tsqd-font-size) * 9)', - 40: 'calc(var(--tsqd-font-size) * 10)', - 44: 'calc(var(--tsqd-font-size) * 11)', - 48: 'calc(var(--tsqd-font-size) * 12)', - 52: 'calc(var(--tsqd-font-size) * 13)', - 56: 'calc(var(--tsqd-font-size) * 14)', - 60: 'calc(var(--tsqd-font-size) * 15)', - 64: 'calc(var(--tsqd-font-size) * 16)', - 72: 'calc(var(--tsqd-font-size) * 18)', - 80: 'calc(var(--tsqd-font-size) * 20)', - 96: 'calc(var(--tsqd-font-size) * 24)', - }, - shadow: { - xs: (_: string = 'rgb(0 0 0 / 0.1)') => - `0 1px 2px 0 rgb(0 0 0 / 0.05)` as const, - sm: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}` as const, - md: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}` as const, - lg: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}` as const, - xl: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}` as const, - '2xl': (color: string = 'rgb(0 0 0 / 0.25)') => - `0 25px 50px -12px ${color}` as const, - inner: (color: string = 'rgb(0 0 0 / 0.05)') => - `inset 0 2px 4px 0 ${color}` as const, - none: () => `none` as const, - }, - zIndices: { - hide: -1, - auto: 'auto', - base: 0, - docked: 10, - dropdown: 1000, - sticky: 1100, - banner: 1200, - overlay: 1300, - modal: 1400, - popover: 1500, - skipLink: 1600, - toast: 1700, - tooltip: 1800, - }, -} as const diff --git a/devtools-reference/tanstack-query/query-devtools/src/utils.tsx b/devtools-reference/tanstack-query/query-devtools/src/utils.tsx deleted file mode 100644 index 9a826cd21..000000000 --- a/devtools-reference/tanstack-query/query-devtools/src/utils.tsx +++ /dev/null @@ -1,323 +0,0 @@ -import { serialize } from 'superjson' -import { createSignal, onCleanup, onMount } from 'solid-js' -import type { Mutation, Query } from '@tanstack/query-core' -import type { DevtoolsPosition } from './contexts' - -export function getQueryStatusLabel(query: Query) { - return query.state.fetchStatus === 'fetching' - ? 'fetching' - : !query.getObserversCount() - ? 'inactive' - : query.state.fetchStatus === 'paused' - ? 'paused' - : query.isStale() - ? 'stale' - : 'fresh' -} - -type QueryStatusLabel = 'fresh' | 'stale' | 'paused' | 'inactive' | 'fetching' - -export function getSidedProp( - prop: T, - side: DevtoolsPosition, -) { - return `${prop}${ - side.charAt(0).toUpperCase() + side.slice(1) - }` as `${T}${Capitalize}` -} - -export function getQueryStatusColor({ - queryState, - observerCount, - isStale, -}: { - queryState: Query['state'] - observerCount: number - isStale: boolean -}) { - return queryState.fetchStatus === 'fetching' - ? 'blue' - : !observerCount - ? 'gray' - : queryState.fetchStatus === 'paused' - ? 'purple' - : isStale - ? 'yellow' - : 'green' -} - -export function getMutationStatusColor({ - status, - isPaused, -}: { - status: Mutation['state']['status'] - isPaused: boolean -}) { - return isPaused - ? 'purple' - : status === 'error' - ? 'red' - : status === 'pending' - ? 'yellow' - : status === 'success' - ? 'green' - : 'gray' -} - -export function getQueryStatusColorByLabel(label: QueryStatusLabel) { - return label === 'fresh' - ? 'green' - : label === 'stale' - ? 'yellow' - : label === 'paused' - ? 'purple' - : label === 'inactive' - ? 'gray' - : 'blue' -} - -/** - * Displays a string regardless the type of the data - * @param {unknown} value Value to be stringified - * @param {boolean} beautify Formats json to multiline - */ -export const displayValue = (value: unknown, beautify: boolean = false) => { - const { json } = serialize(value) - - return JSON.stringify(json, null, beautify ? 2 : undefined) -} - -// Sorting functions -type SortFn = (a: Query, b: Query) => number - -const getStatusRank = (q: Query) => - q.state.fetchStatus !== 'idle' - ? 0 - : !q.getObserversCount() - ? 3 - : q.isStale() - ? 2 - : 1 - -const queryHashSort: SortFn = (a, b) => a.queryHash.localeCompare(b.queryHash) - -const dateSort: SortFn = (a, b) => - a.state.dataUpdatedAt < b.state.dataUpdatedAt ? 1 : -1 - -const statusAndDateSort: SortFn = (a, b) => { - if (getStatusRank(a) === getStatusRank(b)) { - return dateSort(a, b) - } - - return getStatusRank(a) > getStatusRank(b) ? 1 : -1 -} - -export const sortFns: Record = { - status: statusAndDateSort, - 'query hash': queryHashSort, - 'last updated': dateSort, -} - -type MutationSortFn = (a: Mutation, b: Mutation) => number - -const getMutationStatusRank = (m: Mutation) => - m.state.isPaused - ? 0 - : m.state.status === 'error' - ? 2 - : m.state.status === 'pending' - ? 1 - : 3 - -const mutationDateSort: MutationSortFn = (a, b) => - a.state.submittedAt < b.state.submittedAt ? 1 : -1 - -const mutationStatusSort: MutationSortFn = (a, b) => { - if (getMutationStatusRank(a) === getMutationStatusRank(b)) { - return mutationDateSort(a, b) - } - - return getMutationStatusRank(a) > getMutationStatusRank(b) ? 1 : -1 -} - -export const mutationSortFns: Record = { - status: mutationStatusSort, - 'last updated': mutationDateSort, -} - -export const convertRemToPixels = (rem: number) => { - return rem * parseFloat(getComputedStyle(document.documentElement).fontSize) -} - -export const getPreferredColorScheme = () => { - const [colorScheme, setColorScheme] = createSignal<'light' | 'dark'>('dark') - - onMount(() => { - const query = window.matchMedia('(prefers-color-scheme: dark)') - setColorScheme(query.matches ? 'dark' : 'light') - const listener = (e: MediaQueryListEvent) => { - setColorScheme(e.matches ? 'dark' : 'light') - } - query.addEventListener('change', listener) - onCleanup(() => query.removeEventListener('change', listener)) - }) - - return colorScheme -} - -/** - * updates nested data by path - * - * @param {unknown} oldData Data to be updated - * @param {Array} updatePath Path to the data to be updated - * @param {unknown} value New value - */ -export const updateNestedDataByPath = ( - oldData: unknown, - updatePath: Array, - value: unknown, -): any => { - if (updatePath.length === 0) { - return value - } - - if (oldData instanceof Map) { - const newData = new Map(oldData) - - if (updatePath.length === 1) { - newData.set(updatePath[0], value) - return newData - } - - const [head, ...tail] = updatePath - newData.set(head, updateNestedDataByPath(newData.get(head), tail, value)) - return newData - } - - if (oldData instanceof Set) { - const setAsArray = updateNestedDataByPath( - Array.from(oldData), - updatePath, - value, - ) - - return new Set(setAsArray) - } - - if (Array.isArray(oldData)) { - const newData = [...oldData] - - if (updatePath.length === 1) { - // @ts-expect-error - newData[updatePath[0]] = value - return newData - } - - const [head, ...tail] = updatePath - // @ts-expect-error - newData[head] = updateNestedDataByPath(newData[head], tail, value) - - return newData - } - - if (oldData instanceof Object) { - const newData = { ...oldData } - - if (updatePath.length === 1) { - // @ts-expect-error - newData[updatePath[0]] = value - return newData - } - - const [head, ...tail] = updatePath - // @ts-expect-error - newData[head] = updateNestedDataByPath(newData[head], tail, value) - - return newData - } - - return oldData -} - -/** - * Deletes nested data by path - * - * @param {unknown} oldData Data to be updated - * @param {Array} deletePath Path to the data to be deleted - * @returns newData without the deleted items by path - */ -export const deleteNestedDataByPath = ( - oldData: unknown, - deletePath: Array, -): any => { - if (oldData instanceof Map) { - const newData = new Map(oldData) - - if (deletePath.length === 1) { - newData.delete(deletePath[0]) - return newData - } - - const [head, ...tail] = deletePath - newData.set(head, deleteNestedDataByPath(newData.get(head), tail)) - return newData - } - - if (oldData instanceof Set) { - const setAsArray = deleteNestedDataByPath(Array.from(oldData), deletePath) - return new Set(setAsArray) - } - - if (Array.isArray(oldData)) { - const newData = [...oldData] - - if (deletePath.length === 1) { - return newData.filter((_, idx) => idx.toString() !== deletePath[0]) - } - - const [head, ...tail] = deletePath - - // @ts-expect-error - newData[head] = deleteNestedDataByPath(newData[head], tail) - - return newData - } - - if (oldData instanceof Object) { - const newData = { ...oldData } - - if (deletePath.length === 1) { - // @ts-expect-error - delete newData[deletePath[0]] - return newData - } - - const [head, ...tail] = deletePath - // @ts-expect-error - newData[head] = deleteNestedDataByPath(newData[head], tail) - - return newData - } - - return oldData -} - -// Sets up the goober stylesheet -// Adds a nonce to the style tag if needed -export const setupStyleSheet = (nonce?: string, target?: ShadowRoot) => { - if (!nonce) return - const styleExists = - document.querySelector('#_goober') || target?.querySelector('#_goober') - - if (styleExists) return - const styleTag = document.createElement('style') - const textNode = document.createTextNode('') - styleTag.appendChild(textNode) - styleTag.id = '_goober' - styleTag.setAttribute('nonce', nonce) - if (target) { - target.appendChild(styleTag) - } else { - document.head.appendChild(styleTag) - } -} diff --git a/devtools-reference/tanstack-query/query-devtools/tsconfig.json b/devtools-reference/tanstack-query/query-devtools/tsconfig.json deleted file mode 100644 index bdcd7fcb6..000000000 --- a/devtools-reference/tanstack-query/query-devtools/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist-ts", - "rootDir": ".", - "jsx": "preserve", - "jsxImportSource": "solid-js" - }, - "include": ["src", "*.config.js", "*.config.ts", "package.json"], - "references": [{ "path": "../query-core" }] -} diff --git a/devtools-reference/tanstack-query/query-devtools/tsconfig.prod.json b/devtools-reference/tanstack-query/query-devtools/tsconfig.prod.json deleted file mode 100644 index 0f4c92da0..000000000 --- a/devtools-reference/tanstack-query/query-devtools/tsconfig.prod.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "incremental": false, - "composite": false, - "rootDir": "../../" - } -} diff --git a/devtools-reference/tanstack-query/query-devtools/tsup.config.ts b/devtools-reference/tanstack-query/query-devtools/tsup.config.ts deleted file mode 100644 index 854110ec1..000000000 --- a/devtools-reference/tanstack-query/query-devtools/tsup.config.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { defineConfig } from 'tsup' -import { generateTsupOptions, parsePresetOptions } from 'tsup-preset-solid' - -const preset_options = { - entries: { - entry: 'src/index.ts', - dev_entry: true, - }, - cjs: true, - drop_console: true, -} - -export default defineConfig(() => { - const parsed_data = parsePresetOptions(preset_options) - const tsup_options = generateTsupOptions(parsed_data) - - tsup_options.forEach((tsup_option) => { - tsup_option.outDir = 'build' - }) - - return tsup_options -}) diff --git a/devtools-reference/tanstack-query/query-devtools/vite.config.ts b/devtools-reference/tanstack-query/query-devtools/vite.config.ts deleted file mode 100644 index d3bac42e2..000000000 --- a/devtools-reference/tanstack-query/query-devtools/vite.config.ts +++ /dev/null @@ -1,28 +0,0 @@ -import solid from 'vite-plugin-solid' -import { defineConfig } from 'vitest/config' - -import packageJson from './package.json' - -export default defineConfig({ - plugins: [solid()], - // fix from https://github.com/vitest-dev/vitest/issues/6992#issuecomment-2509408660 - resolve: { - conditions: ['@tanstack/custom-condition'], - }, - environments: { - ssr: { - resolve: { - conditions: ['@tanstack/custom-condition'], - }, - }, - }, - test: { - name: packageJson.name, - dir: './src', - watch: false, - environment: 'jsdom', - coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, - typecheck: { enabled: true }, - restoreMocks: true, - }, -}) diff --git a/devtools-reference/tanstack-query/react-query-devtools/.attw.json b/devtools-reference/tanstack-query/react-query-devtools/.attw.json deleted file mode 100644 index de5330c3c..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/.attw.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "ignoreRules": ["no-resolution"] -} diff --git a/devtools-reference/tanstack-query/react-query-devtools/eslint.config.js b/devtools-reference/tanstack-query/react-query-devtools/eslint.config.js deleted file mode 100644 index 03abe6660..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/eslint.config.js +++ /dev/null @@ -1,24 +0,0 @@ -// @ts-check - -import pluginReact from '@eslint-react/eslint-plugin' -import * as reactHooks from 'eslint-plugin-react-hooks' -import rootConfig from './root.eslint.config.js' - -export default [ - ...rootConfig, - reactHooks.configs.recommended, - { - files: ['**/*.{ts,tsx}'], - ...pluginReact.configs.recommended, - rules: { - '@eslint-react/no-context-provider': 'off', // We need to be React 18 compatible - }, - }, - { - rules: { - 'react-hooks/exhaustive-deps': 'error', - 'react-hooks/rules-of-hooks': 'error', - 'react-hooks/react-compiler': 'error', - }, - }, -] diff --git a/devtools-reference/tanstack-query/react-query-devtools/package.json b/devtools-reference/tanstack-query/react-query-devtools/package.json deleted file mode 100644 index 82529a830..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/package.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "name": "@tanstack/react-query-devtools", - "version": "5.83.0", - "description": "Developer tools to interact with and visualize the TanStack/react-query cache", - "author": "tannerlinsley", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/TanStack/query.git", - "directory": "packages/react-query-devtools" - }, - "homepage": "https://tanstack.com/query", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "scripts": { - "clean": "premove ./build ./coverage ./dist-ts", - "compile": "tsc --build", - "test:eslint": "eslint ./src", - "test:types": "npm-run-all --serial test:types:*", - "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js --build tsconfig.legacy.json", - "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js --build tsconfig.legacy.json", - "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js --build tsconfig.legacy.json", - "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js --build tsconfig.legacy.json", - "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js --build tsconfig.legacy.json", - "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js --build tsconfig.legacy.json", - "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js --build tsconfig.legacy.json", - "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js --build tsconfig.legacy.json", - "test:types:tscurrent": "tsc --build", - "test:lib": "vitest", - "test:lib:dev": "pnpm run test:lib --watch", - "test:build": "publint --strict && attw --pack", - "build": "tsup --tsconfig tsconfig.prod.json", - "build:dev": "tsup --watch" - }, - "type": "module", - "types": "build/legacy/index.d.ts", - "main": "build/legacy/index.cjs", - "module": "build/legacy/index.js", - "exports": { - ".": { - "@tanstack/custom-condition": "./src/index.ts", - "import": { - "types": "./build/modern/index.d.ts", - "default": "./build/modern/index.js" - }, - "require": { - "types": "./build/modern/index.d.cts", - "default": "./build/modern/index.cjs" - } - }, - "./production": { - "import": { - "types": "./build/modern/production.d.ts", - "default": "./build/modern/production.js" - }, - "require": { - "types": "./build/modern/production.d.cts", - "default": "./build/modern/production.cjs" - } - }, - "./build/modern/production.js": { - "import": { - "types": "./build/modern/production.d.ts", - "default": "./build/modern/production.js" - }, - "require": { - "types": "./build/modern/production.d.cts", - "default": "./build/modern/production.cjs" - } - }, - "./package.json": "./package.json" - }, - "sideEffects": false, - "files": [ - "build", - "src", - "!src/__tests__" - ], - "dependencies": { - "@tanstack/query-devtools": "workspace:*" - }, - "devDependencies": { - "@tanstack/react-query": "workspace:*", - "@testing-library/react": "^16.1.0", - "@types/react": "^19.0.1", - "@vitejs/plugin-react": "^4.3.4", - "npm-run-all2": "^5.0.0", - "react": "^19.0.0" - }, - "peerDependencies": { - "@tanstack/react-query": "workspace:^", - "react": "^18 || ^19" - } -} diff --git a/devtools-reference/tanstack-query/react-query-devtools/root.eslint.config.js b/devtools-reference/tanstack-query/react-query-devtools/root.eslint.config.js deleted file mode 120000 index 35dedbe5a..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/root.eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -../../eslint.config.js \ No newline at end of file diff --git a/devtools-reference/tanstack-query/react-query-devtools/root.tsup.config.js b/devtools-reference/tanstack-query/react-query-devtools/root.tsup.config.js deleted file mode 120000 index fb8e9add9..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/root.tsup.config.js +++ /dev/null @@ -1 +0,0 @@ -../../scripts/getTsupConfig.js \ No newline at end of file diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtools.tsx b/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtools.tsx deleted file mode 100644 index e75475f18..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtools.tsx +++ /dev/null @@ -1,110 +0,0 @@ -'use client' -import * as React from 'react' -import { onlineManager, useQueryClient } from '@tanstack/react-query' -import { TanstackQueryDevtools } from '@tanstack/query-devtools' -import type { - DevtoolsButtonPosition, - DevtoolsErrorType, - DevtoolsPosition, -} from '@tanstack/query-devtools' -import type { QueryClient } from '@tanstack/react-query' - -export interface DevtoolsOptions { - /** - * Set this true if you want the dev tools to default to being open - */ - initialIsOpen?: boolean - /** - * The position of the React Query logo to open and close the devtools panel. - * 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' - * Defaults to 'bottom-right'. - */ - buttonPosition?: DevtoolsButtonPosition - /** - * The position of the React Query devtools panel. - * 'top' | 'bottom' | 'left' | 'right' - * Defaults to 'bottom'. - */ - position?: DevtoolsPosition - /** - * Custom instance of QueryClient - */ - client?: QueryClient - /** - * Use this so you can define custom errors that can be shown in the devtools. - */ - errorTypes?: Array - /** - * Use this to pass a nonce to the style tag that is added to the document head. This is useful if you are using a Content Security Policy (CSP) nonce to allow inline styles. - */ - styleNonce?: string - /** - * Use this so you can attach the devtool's styles to specific element in the DOM. - */ - shadowDOMTarget?: ShadowRoot -} - -export function ReactQueryDevtools( - props: DevtoolsOptions, -): React.ReactElement | null { - const queryClient = useQueryClient(props.client) - const ref = React.useRef(null) - const { - buttonPosition, - position, - initialIsOpen, - errorTypes, - styleNonce, - shadowDOMTarget, - } = props - const [devtools] = React.useState( - new TanstackQueryDevtools({ - client: queryClient, - queryFlavor: 'React Query', - version: '5', - onlineManager, - buttonPosition, - position, - initialIsOpen, - errorTypes, - styleNonce, - shadowDOMTarget, - }), - ) - - React.useEffect(() => { - devtools.setClient(queryClient) - }, [queryClient, devtools]) - - React.useEffect(() => { - if (buttonPosition) { - devtools.setButtonPosition(buttonPosition) - } - }, [buttonPosition, devtools]) - - React.useEffect(() => { - if (position) { - devtools.setPosition(position) - } - }, [position, devtools]) - - React.useEffect(() => { - devtools.setInitialIsOpen(initialIsOpen || false) - }, [initialIsOpen, devtools]) - - React.useEffect(() => { - devtools.setErrorTypes(errorTypes || []) - }, [errorTypes, devtools]) - - React.useEffect(() => { - if (ref.current) { - devtools.mount(ref.current) - } - - return () => { - devtools.unmount() - } - }, [devtools]) - - return
-} diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtoolsPanel.tsx b/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtoolsPanel.tsx deleted file mode 100644 index 86afd0ba8..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/src/ReactQueryDevtoolsPanel.tsx +++ /dev/null @@ -1,91 +0,0 @@ -'use client' -import * as React from 'react' -import { onlineManager, useQueryClient } from '@tanstack/react-query' -import { TanstackQueryDevtoolsPanel } from '@tanstack/query-devtools' -import type { DevtoolsErrorType } from '@tanstack/query-devtools' -import type { QueryClient } from '@tanstack/react-query' - -export interface DevtoolsPanelOptions { - /** - * Custom instance of QueryClient - */ - client?: QueryClient - /** - * Use this so you can define custom errors that can be shown in the devtools. - */ - errorTypes?: Array - /** - * Use this to pass a nonce to the style tag that is added to the document head. This is useful if you are using a Content Security Policy (CSP) nonce to allow inline styles. - */ - styleNonce?: string - /** - * Use this so you can attach the devtool's styles to specific element in the DOM. - */ - shadowDOMTarget?: ShadowRoot - - /** - * Custom styles for the devtools panel - * @default { height: '500px' } - * @example { height: '100%' } - * @example { height: '100%', width: '100%' } - */ - style?: React.CSSProperties - - /** - * Callback function that is called when the devtools panel is closed - */ - onClose?: () => unknown -} - -export function ReactQueryDevtoolsPanel( - props: DevtoolsPanelOptions, -): React.ReactElement | null { - const queryClient = useQueryClient(props.client) - const ref = React.useRef(null) - const { errorTypes, styleNonce, shadowDOMTarget } = props - const [devtools] = React.useState( - new TanstackQueryDevtoolsPanel({ - client: queryClient, - queryFlavor: 'React Query', - version: '5', - onlineManager, - buttonPosition: 'bottom-left', - position: 'bottom', - initialIsOpen: true, - errorTypes, - styleNonce, - shadowDOMTarget, - onClose: props.onClose, - }), - ) - - React.useEffect(() => { - devtools.setClient(queryClient) - }, [queryClient, devtools]) - - React.useEffect(() => { - devtools.setOnClose(props.onClose ?? (() => {})) - }, [props.onClose, devtools]) - - React.useEffect(() => { - devtools.setErrorTypes(errorTypes || []) - }, [errorTypes, devtools]) - - React.useEffect(() => { - if (ref.current) { - devtools.mount(ref.current) - } - - return () => { - devtools.unmount() - } - }, [devtools]) - - return ( -
- ) -} diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/devtools.test.tsx b/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/devtools.test.tsx deleted file mode 100644 index 0e44d74db..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/devtools.test.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { describe, expect, it } from 'vitest' - -describe('ReactQueryDevtools', () => { - it('should be able to open and close devtools', () => { - expect(1).toBe(1) - }) -}) diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/not-development.test.tsx b/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/not-development.test.tsx deleted file mode 100644 index 6353147ed..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/src/__tests__/not-development.test.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { ReactQueryDevtools } from '..' - -describe('ReactQueryDevtools not in process.env.NODE_ENV=development', () => { - it('should return null', () => { - expect(process.env.NODE_ENV).not.toBe('development') - expect(ReactQueryDevtools({})).toBeNull() - }) -}) diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/index.ts b/devtools-reference/tanstack-query/react-query-devtools/src/index.ts deleted file mode 100644 index e922d8788..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/src/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -'use client' - -import * as Devtools from './ReactQueryDevtools' -import * as DevtoolsPanel from './ReactQueryDevtoolsPanel' - -export const ReactQueryDevtools: (typeof Devtools)['ReactQueryDevtools'] = - process.env.NODE_ENV !== 'development' - ? function () { - return null - } - : Devtools.ReactQueryDevtools - -export const ReactQueryDevtoolsPanel: (typeof DevtoolsPanel)['ReactQueryDevtoolsPanel'] = - process.env.NODE_ENV !== 'development' - ? function () { - return null - } - : DevtoolsPanel.ReactQueryDevtoolsPanel diff --git a/devtools-reference/tanstack-query/react-query-devtools/src/production.ts b/devtools-reference/tanstack-query/react-query-devtools/src/production.ts deleted file mode 100644 index 385848542..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/src/production.ts +++ /dev/null @@ -1,7 +0,0 @@ -'use client' - -import * as Devtools from './ReactQueryDevtools' -import * as DevtoolsPanel from './ReactQueryDevtoolsPanel' - -export const ReactQueryDevtools = Devtools.ReactQueryDevtools -export const ReactQueryDevtoolsPanel = DevtoolsPanel.ReactQueryDevtoolsPanel diff --git a/devtools-reference/tanstack-query/react-query-devtools/test-setup.ts b/devtools-reference/tanstack-query/react-query-devtools/test-setup.ts deleted file mode 100644 index 8331ed661..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/test-setup.ts +++ /dev/null @@ -1,12 +0,0 @@ -import '@testing-library/jest-dom/vitest' -import { act, cleanup } from '@testing-library/react' -import { afterEach } from 'vitest' -import { notifyManager } from '@tanstack/react-query' - -// https://testing-library.com/docs/react-testing-library/api#cleanup -afterEach(() => cleanup()) - -// Wrap notifications with act to make sure React knows about React Query updates -notifyManager.setNotifyFunction((fn) => { - act(fn) -}) diff --git a/devtools-reference/tanstack-query/react-query-devtools/tsconfig.json b/devtools-reference/tanstack-query/react-query-devtools/tsconfig.json deleted file mode 100644 index 46a2aea3c..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist-ts", - "rootDir": ".", - "jsx": "react-jsx" - }, - "include": [ - "src", - "test-setup.ts", - "*.config.js", - "*.config.ts", - "package.json" - ], - "references": [{ "path": "../query-devtools" }, { "path": "../react-query" }] -} diff --git a/devtools-reference/tanstack-query/react-query-devtools/tsconfig.legacy.json b/devtools-reference/tanstack-query/react-query-devtools/tsconfig.legacy.json deleted file mode 100644 index 28e2218e7..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/tsconfig.legacy.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "jsx": "react-jsx", - "outDir": "./dist-ts/legacy" - }, - "include": ["src"], - "exclude": ["src/__tests__"], - "references": [{ "path": "../query-devtools" }, { "path": "../react-query" }] -} diff --git a/devtools-reference/tanstack-query/react-query-devtools/tsconfig.prod.json b/devtools-reference/tanstack-query/react-query-devtools/tsconfig.prod.json deleted file mode 100644 index 0f4c92da0..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/tsconfig.prod.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "incremental": false, - "composite": false, - "rootDir": "../../" - } -} diff --git a/devtools-reference/tanstack-query/react-query-devtools/tsup.config.ts b/devtools-reference/tanstack-query/react-query-devtools/tsup.config.ts deleted file mode 100644 index ef4a978d1..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/tsup.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'tsup' -import { legacyConfig, modernConfig } from './root.tsup.config.js' - -export default defineConfig([ - modernConfig({ entry: ['src/*.ts', 'src/*.tsx'] }), - legacyConfig({ entry: ['src/*.ts', 'src/*.tsx'] }), -]) diff --git a/devtools-reference/tanstack-query/react-query-devtools/vite.config.ts b/devtools-reference/tanstack-query/react-query-devtools/vite.config.ts deleted file mode 100644 index 4ecd1537b..000000000 --- a/devtools-reference/tanstack-query/react-query-devtools/vite.config.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { defineConfig } from 'vitest/config' -import react from '@vitejs/plugin-react' - -import packageJson from './package.json' - -export default defineConfig({ - plugins: [react()], - // fix from https://github.com/vitest-dev/vitest/issues/6992#issuecomment-2509408660 - resolve: { - conditions: ['@tanstack/custom-condition'], - }, - environments: { - ssr: { - resolve: { - conditions: ['@tanstack/custom-condition'], - }, - }, - }, - test: { - name: packageJson.name, - dir: './src', - watch: false, - environment: 'jsdom', - setupFiles: ['test-setup.ts'], - coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, - typecheck: { enabled: true }, - restoreMocks: true, - }, -}) diff --git a/devtools-reference/tanstack-query/vue-query-devtools/.attw.json b/devtools-reference/tanstack-query/vue-query-devtools/.attw.json deleted file mode 100644 index 864f618c2..000000000 --- a/devtools-reference/tanstack-query/vue-query-devtools/.attw.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "ignoreRules": [ - "cjs-resolves-to-esm", - "internal-resolution-error", - "no-resolution" - ] -} diff --git a/devtools-reference/tanstack-query/vue-query-devtools/eslint.config.js b/devtools-reference/tanstack-query/vue-query-devtools/eslint.config.js deleted file mode 100644 index 6cd1d47ba..000000000 --- a/devtools-reference/tanstack-query/vue-query-devtools/eslint.config.js +++ /dev/null @@ -1,7 +0,0 @@ -// @ts-check - -// @ts-expect-error -import pluginVue from 'eslint-plugin-vue' -import rootConfig from './root.eslint.config.js' - -export default [...rootConfig, ...pluginVue.configs['flat/base']] diff --git a/devtools-reference/tanstack-query/vue-query-devtools/package.json b/devtools-reference/tanstack-query/vue-query-devtools/package.json deleted file mode 100644 index 49ea5ac78..000000000 --- a/devtools-reference/tanstack-query/vue-query-devtools/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "@tanstack/vue-query-devtools", - "version": "5.83.0", - "description": "Developer tools to interact with and visualize the TanStack/vue-query cache", - "author": "tannerlinsley", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/TanStack/query.git", - "directory": "packages/vue-query-devtools" - }, - "homepage": "https://tanstack.com/query", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "scripts": { - "clean": "premove ./build ./coverage ./dist-ts", - "compile": "vue-tsc --build", - "test:eslint": "eslint ./src", - "test:types": "vue-tsc --build", - "test:build": "publint --strict && attw --pack", - "build": "pnpm run compile && vite build" - }, - "type": "module", - "types": "dist/esm/index.d.ts", - "module": "dist/esm/index.js", - "main": "dist/esm/index.js", - "exports": { - ".": { - "@tanstack/custom-condition": "./src/index.ts", - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - }, - "./production": { - "@tanstack/custom-condition": "./src/production.ts", - "types": "./dist/esm/production.d.ts", - "default": "./dist/esm/production.js" - }, - "./dist/production.js": { - "types": "./dist/esm/production.d.ts", - "default": "./dist/esm/production.js" - }, - "./package.json": "./package.json" - }, - "sideEffects": false, - "files": [ - "dist", - "src", - "!src/__tests__" - ], - "dependencies": { - "@tanstack/query-devtools": "workspace:*" - }, - "devDependencies": { - "@tanstack/vue-query": "workspace:*", - "@vitejs/plugin-vue": "^5.2.4", - "eslint-plugin-vue": "^9.27.0", - "typescript": "5.8.3", - "vite": "^6.3.5", - "vue": "^3.4.27", - "vue-tsc": "^2.2.8" - }, - "peerDependencies": { - "@tanstack/vue-query": "workspace:^", - "vue": "^3.3.0" - } -} diff --git a/devtools-reference/tanstack-query/vue-query-devtools/root.eslint.config.js b/devtools-reference/tanstack-query/vue-query-devtools/root.eslint.config.js deleted file mode 120000 index 35dedbe5a..000000000 --- a/devtools-reference/tanstack-query/vue-query-devtools/root.eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -../../eslint.config.js \ No newline at end of file diff --git a/devtools-reference/tanstack-query/vue-query-devtools/src/devtools.vue b/devtools-reference/tanstack-query/vue-query-devtools/src/devtools.vue deleted file mode 100644 index a652bc965..000000000 --- a/devtools-reference/tanstack-query/vue-query-devtools/src/devtools.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - diff --git a/devtools-reference/tanstack-query/vue-query-devtools/src/index.ts b/devtools-reference/tanstack-query/vue-query-devtools/src/index.ts deleted file mode 100644 index 39c4912e8..000000000 --- a/devtools-reference/tanstack-query/vue-query-devtools/src/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import devtools from './devtools.vue' -import type { DefineComponent } from 'vue' -import type { DevtoolsOptions } from './types' - -export const VueQueryDevtools = ( - process.env.NODE_ENV !== 'development' - ? function () { - return null - } - : devtools -) as DefineComponent diff --git a/devtools-reference/tanstack-query/vue-query-devtools/src/production.ts b/devtools-reference/tanstack-query/vue-query-devtools/src/production.ts deleted file mode 100644 index 11cd60bd9..000000000 --- a/devtools-reference/tanstack-query/vue-query-devtools/src/production.ts +++ /dev/null @@ -1,3 +0,0 @@ -import devtools from './devtools.vue' - -export default devtools diff --git a/devtools-reference/tanstack-query/vue-query-devtools/src/types.ts b/devtools-reference/tanstack-query/vue-query-devtools/src/types.ts deleted file mode 100644 index a392aac51..000000000 --- a/devtools-reference/tanstack-query/vue-query-devtools/src/types.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { - DevtoolsButtonPosition, - DevtoolsErrorType, - DevtoolsPosition, -} from '@tanstack/query-devtools' -import type { QueryClient } from '@tanstack/vue-query' - -export interface DevtoolsOptions { - /** - * Set this true if you want the dev tools to default to being open - */ - initialIsOpen?: boolean - /** - * The position of the React Query logo to open and close the devtools panel. - * 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' - * Defaults to 'bottom-right'. - */ - buttonPosition?: DevtoolsButtonPosition - /** - * The position of the React Query devtools panel. - * 'top' | 'bottom' | 'left' | 'right' - * Defaults to 'bottom'. - */ - position?: DevtoolsPosition - /** - * Custom instance of QueryClient - */ - client?: QueryClient - /** - * Use this so you can define custom errors that can be shown in the devtools. - */ - errorTypes?: Array - /** - * Use this to pass a nonce to the style tag that is added to the document head. This is useful if you are using a Content Security Policy (CSP) nonce to allow inline styles. - */ - styleNonce?: string - /** - * Use this so you can attach the devtool's styles to specific element in the DOM. - */ - shadowDOMTarget?: ShadowRoot -} diff --git a/devtools-reference/tanstack-query/vue-query-devtools/tsconfig.json b/devtools-reference/tanstack-query/vue-query-devtools/tsconfig.json deleted file mode 100644 index ec69cf7f7..000000000 --- a/devtools-reference/tanstack-query/vue-query-devtools/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist-ts", - "rootDir": "." - }, - "include": [ - "src/**/*.ts", - "src/**/*.vue", - "*.config.js", - "*.config.ts", - "package.json" - ], - "references": [{ "path": "../vue-query" }, { "path": "../query-devtools" }] -} diff --git a/devtools-reference/tanstack-query/vue-query-devtools/vite.config.ts b/devtools-reference/tanstack-query/vue-query-devtools/vite.config.ts deleted file mode 100644 index 6b7204301..000000000 --- a/devtools-reference/tanstack-query/vue-query-devtools/vite.config.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { defineConfig, mergeConfig } from 'vite' -import vue from '@vitejs/plugin-vue' -import { tanstackViteConfig } from '@tanstack/config/vite' - -const config = defineConfig({ - plugins: [vue()], - // fix from https://github.com/vitest-dev/vitest/issues/6992#issuecomment-2509408660 - resolve: { - conditions: ['@tanstack/custom-condition'], - }, - environments: { - ssr: { - resolve: { - conditions: ['@tanstack/custom-condition'], - }, - }, - }, -}) - -export default mergeConfig( - config, - tanstackViteConfig({ - entry: ['src/index.ts', 'src/production.ts'], - srcDir: 'src', - }), -) diff --git a/devtools-reference/tanstack-router/react-router-devtools/README.md b/devtools-reference/tanstack-router/react-router-devtools/README.md deleted file mode 100644 index 7be76f46c..000000000 --- a/devtools-reference/tanstack-router/react-router-devtools/README.md +++ /dev/null @@ -1,5 +0,0 @@ - - -# TanStack React Router Devtools - -See https://tanstack.com/router/latest/docs/framework/react/devtools diff --git a/devtools-reference/tanstack-router/react-router-devtools/eslint.config.js b/devtools-reference/tanstack-router/react-router-devtools/eslint.config.js deleted file mode 100644 index 076c5ee39..000000000 --- a/devtools-reference/tanstack-router/react-router-devtools/eslint.config.js +++ /dev/null @@ -1,31 +0,0 @@ -// @ts-check - -import pluginReact from '@eslint-react/eslint-plugin' -import pluginReactHooks from 'eslint-plugin-react-hooks' -import rootConfig from '../../eslint.config.js' - -export default [ - ...rootConfig, - { - files: ['**/*.{ts,tsx}'], - ...pluginReact.configs.recommended, - }, - { - plugins: { - 'react-hooks': pluginReactHooks, - }, - rules: { - '@eslint-react/no-unstable-context-value': 'off', - '@eslint-react/no-unstable-default-props': 'off', - '@eslint-react/dom/no-missing-button-type': 'off', - 'react-hooks/exhaustive-deps': 'error', - 'react-hooks/rules-of-hooks': 'error', - }, - }, - { - files: ['**/__tests__/**'], - rules: { - '@typescript-eslint/no-unnecessary-condition': 'off', - }, - }, -] diff --git a/devtools-reference/tanstack-router/react-router-devtools/package.json b/devtools-reference/tanstack-router/react-router-devtools/package.json deleted file mode 100644 index 09d5ed0ed..000000000 --- a/devtools-reference/tanstack-router/react-router-devtools/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "@tanstack/react-router-devtools", - "version": "1.127.3", - "description": "Modern and scalable routing for React applications", - "author": "Tanner Linsley", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/TanStack/router.git", - "directory": "packages/react-router-devtools" - }, - "homepage": "https://tanstack.com/router", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "keywords": [ - "react", - "location", - "router", - "routing", - "async", - "async router", - "typescript" - ], - "scripts": { - "clean": "rimraf ./dist && rimraf ./coverage", - "test:eslint": "eslint ./src", - "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", - "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", - "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js", - "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js", - "test:types:ts58": "tsc", - "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", - "build": "vite build" - }, - "type": "module", - "types": "./dist/esm/index.d.ts", - "main": "./dist/cjs/index.cjs", - "module": "./dist/esm/index.js", - "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" - }, - "sideEffects": false, - "files": [ - "dist", - "src" - ], - "engines": { - "node": ">=12" - }, - "dependencies": { - "@tanstack/router-devtools-core": "workspace:^" - }, - "devDependencies": { - "@vitejs/plugin-react": "^4.3.4", - "react": ">=19", - "react-dom": ">=19" - }, - "peerDependencies": { - "@tanstack/react-router": "workspace:^", - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - } -} diff --git a/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtools.tsx b/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtools.tsx deleted file mode 100644 index fba93713c..000000000 --- a/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtools.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import { TanStackRouterDevtoolsCore } from '@tanstack/router-devtools-core' -import { Fragment, useEffect, useRef, useState } from 'react' -import { useRouter, useRouterState } from '@tanstack/react-router' -import type { ButtonHTMLAttributes, HTMLAttributes } from 'react' -import type { AnyRouter } from '@tanstack/react-router' -import type React from 'react' - -interface DevtoolsOptions { - /** - * Set this true if you want the dev tools to default to being open - */ - initialIsOpen?: boolean - /** - * Use this to add props to the panel. For example, you can add className, style (merge and override default style), etc. - */ - panelProps?: HTMLAttributes - /** - * Use this to add props to the close button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc. - */ - closeButtonProps?: ButtonHTMLAttributes - /** - * Use this to add props to the toggle button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc. - */ - toggleButtonProps?: ButtonHTMLAttributes - /** - * The position of the TanStack Router logo to open and close the devtools panel. - * Defaults to 'bottom-left'. - */ - position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' - /** - * Use this to render the devtools inside a different type of container element for a11y purposes. - * Any string which corresponds to a valid intrinsic JSX element is allowed. - * Defaults to 'footer'. - */ - containerElement?: string | any - /** - * The router instance to use for the devtools. - */ - router?: AnyRouter - /** - * Use this to attach the devtool's styles to specific element in the DOM. - */ - shadowDOMTarget?: ShadowRoot -} - -export function TanStackRouterDevtools( - props: DevtoolsOptions, -): React.ReactElement | null { - const { - initialIsOpen, - panelProps, - closeButtonProps, - toggleButtonProps, - position, - containerElement, - shadowDOMTarget, - router: propsRouter, - } = props - - const hookRouter = useRouter({ warn: false }) - const activeRouter = propsRouter ?? hookRouter - - const activeRouterState = useRouterState({ router: activeRouter }) - - const devToolRef = useRef(null) - const [devtools] = useState( - () => - new TanStackRouterDevtoolsCore({ - initialIsOpen, - panelProps, - closeButtonProps, - toggleButtonProps, - position, - containerElement, - shadowDOMTarget, - router: activeRouter, - routerState: activeRouterState, - }), - ) - - // Update devtools when props change - useEffect(() => { - devtools.setRouter(activeRouter) - }, [devtools, activeRouter]) - - useEffect(() => { - devtools.setRouterState(activeRouterState) - }, [devtools, activeRouterState]) - - useEffect(() => { - devtools.setOptions({ - initialIsOpen: initialIsOpen, - panelProps: panelProps, - closeButtonProps: closeButtonProps, - toggleButtonProps: toggleButtonProps, - position: position, - containerElement: containerElement, - shadowDOMTarget: shadowDOMTarget, - }) - }, [ - devtools, - initialIsOpen, - panelProps, - closeButtonProps, - toggleButtonProps, - position, - containerElement, - shadowDOMTarget, - ]) - - useEffect(() => { - if (devToolRef.current) { - devtools.mount(devToolRef.current) - } - - return () => { - devtools.unmount() - } - }, [devtools]) - - return ( - -
- - ) -} diff --git a/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtoolsPanel.tsx b/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtoolsPanel.tsx deleted file mode 100644 index fc401606f..000000000 --- a/devtools-reference/tanstack-router/react-router-devtools/src/TanStackRouterDevtoolsPanel.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { useRouter, useRouterState } from '@tanstack/react-router' -import { TanStackRouterDevtoolsPanelCore } from '@tanstack/router-devtools-core' -import React, { useEffect, useRef, useState } from 'react' -import type { AnyRouter } from '@tanstack/react-router' - -export interface DevtoolsPanelOptions { - /** - * The standard React style object used to style a component with inline styles - */ - style?: any - /** - * The standard React class property used to style a component with classes - */ - className?: string - /** - * A boolean variable indicating whether the panel is open or closed - */ - isOpen?: boolean - /** - * A function that toggles the open and close state of the panel - */ - setIsOpen?: (isOpen: boolean) => void - /** - * Handles the opening and closing the devtools panel - */ - handleDragStart?: (e: any) => void - /** - * A boolean variable indicating if the "lite" version of the library is being used - */ - router?: AnyRouter - /** - * Use this to attach the devtool's styles to specific element in the DOM. - */ - shadowDOMTarget?: ShadowRoot -} - -export const TanStackRouterDevtoolsPanel: React.FC = ( - props, -): React.ReactElement | null => { - const { router: propsRouter, ...rest } = props - const hookRouter = useRouter({ warn: false }) - const activeRouter = propsRouter ?? hookRouter - const activeRouterState = useRouterState({ router: activeRouter }) - - const devToolRef = useRef(null) - const [devtools] = useState( - () => - new TanStackRouterDevtoolsPanelCore({ - ...rest, - router: activeRouter, - routerState: activeRouterState, - }), - ) - - // Update devtools when props change - useEffect(() => { - devtools.setRouter(activeRouter) - }, [devtools, activeRouter]) - - useEffect(() => { - devtools.setRouterState(activeRouterState) - }, [devtools, activeRouterState]) - - useEffect(() => { - devtools.setOptions({ - className: props.className, - style: props.style, - shadowDOMTarget: props.shadowDOMTarget, - }) - }, [devtools, props.className, props.style, props.shadowDOMTarget]) - - useEffect(() => { - if (devToolRef.current) { - devtools.mount(devToolRef.current) - } - - return () => { - devtools.unmount() - } - }, [devtools]) - - return ( - <> -
- - ) -} diff --git a/devtools-reference/tanstack-router/react-router-devtools/src/index.ts b/devtools-reference/tanstack-router/react-router-devtools/src/index.ts deleted file mode 100644 index 3db31a9b7..000000000 --- a/devtools-reference/tanstack-router/react-router-devtools/src/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as Devtools from './TanStackRouterDevtools' -import * as DevtoolsPanel from './TanStackRouterDevtoolsPanel' - -export const TanStackRouterDevtools: (typeof Devtools)['TanStackRouterDevtools'] = - process.env.NODE_ENV !== 'development' - ? function () { - return null - } - : Devtools.TanStackRouterDevtools - -export const TanStackRouterDevtoolsInProd: (typeof Devtools)['TanStackRouterDevtools'] = - Devtools.TanStackRouterDevtools - -export const TanStackRouterDevtoolsPanel: (typeof DevtoolsPanel)['TanStackRouterDevtoolsPanel'] = - process.env.NODE_ENV !== 'development' - ? function () { - return null - } - : DevtoolsPanel.TanStackRouterDevtoolsPanel - -export const TanStackRouterDevtoolsPanelInProd: (typeof DevtoolsPanel)['TanStackRouterDevtoolsPanel'] = - DevtoolsPanel.TanStackRouterDevtoolsPanel diff --git a/devtools-reference/tanstack-router/react-router-devtools/tsconfig.json b/devtools-reference/tanstack-router/react-router-devtools/tsconfig.json deleted file mode 100644 index 1599b212c..000000000 --- a/devtools-reference/tanstack-router/react-router-devtools/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "jsx": "react-jsx", - "jsxImportSource": "react" - }, - "include": ["src", "tests", "vite.config.ts"] -} diff --git a/devtools-reference/tanstack-router/react-router-devtools/vite.config.ts b/devtools-reference/tanstack-router/react-router-devtools/vite.config.ts deleted file mode 100644 index 410777b82..000000000 --- a/devtools-reference/tanstack-router/react-router-devtools/vite.config.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { defineConfig, mergeConfig } from 'vitest/config' -import { tanstackViteConfig } from '@tanstack/config/vite' -import react from '@vitejs/plugin-react' -import packageJson from './package.json' -import type { UserConfig } from 'vitest/config' - -const config = defineConfig({ - plugins: [react()] as UserConfig['plugins'], - test: { - name: packageJson.name, - dir: './tests', - watch: false, - environment: 'jsdom', - typecheck: { enabled: true }, - }, -}) - -export default mergeConfig( - config, - tanstackViteConfig({ - entry: './src/index.ts', - srcDir: './src', - }), -) diff --git a/devtools-reference/tanstack-router/router-devtools-core/README.md b/devtools-reference/tanstack-router/router-devtools-core/README.md deleted file mode 100644 index 7be76f46c..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/README.md +++ /dev/null @@ -1,5 +0,0 @@ - - -# TanStack React Router Devtools - -See https://tanstack.com/router/latest/docs/framework/react/devtools diff --git a/devtools-reference/tanstack-router/router-devtools-core/eslint.config.js b/devtools-reference/tanstack-router/router-devtools-core/eslint.config.js deleted file mode 100644 index bd7118fa1..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/eslint.config.js +++ /dev/null @@ -1,20 +0,0 @@ -// @ts-check - -import rootConfig from '../../eslint.config.js' - -export default [ - ...rootConfig, - { - files: ['**/*.{ts,tsx}'], - }, - { - plugins: {}, - rules: {}, - }, - { - files: ['**/__tests__/**'], - rules: { - '@typescript-eslint/no-unnecessary-condition': 'off', - }, - }, -] diff --git a/devtools-reference/tanstack-router/router-devtools-core/media/logo.sketch b/devtools-reference/tanstack-router/router-devtools-core/media/logo.sketch deleted file mode 100644 index 068e5ed4ef537377768eb1f292298a4f9724838b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353553 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 - - - logo-light - Created with Sketch. - - - - - - - - - - - \ No newline at end of file diff --git a/devtools-reference/tanstack-router/router-devtools-core/media/repo-dark.png b/devtools-reference/tanstack-router/router-devtools-core/media/repo-dark.png deleted file mode 100644 index 7d9c6681ad394768b854ba1460596505cf14007c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155546 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 xekj6=12" - }, - "dependencies": { - "clsx": "^2.1.1", - "goober": "^2.1.16", - "solid-js": "^1.9.5" - }, - "devDependencies": { - "vite-plugin-solid": "^2.11.6" - }, - "peerDependencies": { - "tiny-invariant": "^1.3.3", - "@tanstack/router-core": "workspace:^", - "csstype": "^3.0.10", - "solid-js": ">=1.9.5" - }, - "peerDependenciesMeta": { - "csstype": { - "optional": true - } - } -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/AgeTicker.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/AgeTicker.tsx deleted file mode 100644 index 27d179fda..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/AgeTicker.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { clsx as cx } from 'clsx' -import { useStyles } from './useStyles' -import type { AnyRouteMatch, AnyRouter } from '@tanstack/router-core' -import type { Accessor } from 'solid-js' - -function formatTime(ms: number) { - const units = ['s', 'min', 'h', 'd'] - const values = [ms / 1000, ms / 60000, ms / 3600000, ms / 86400000] - - let chosenUnitIndex = 0 - for (let i = 1; i < values.length; i++) { - if (values[i]! < 1) break - chosenUnitIndex = i - } - - const formatter = new Intl.NumberFormat(navigator.language, { - compactDisplay: 'short', - notation: 'compact', - maximumFractionDigits: 0, - }) - - return formatter.format(values[chosenUnitIndex]!) + units[chosenUnitIndex] -} - -export function AgeTicker({ - match, - router, -}: { - match?: AnyRouteMatch - router: Accessor -}) { - const styles = useStyles() - - if (!match) { - return null - } - - const route = router().looseRoutesById[match.routeId]! - - if (!route.options.loader) { - return null - } - - const age = Date.now() - match.updatedAt - const staleTime = - route.options.staleTime ?? router().options.defaultStaleTime ?? 0 - const gcTime = - route.options.gcTime ?? router().options.defaultGcTime ?? 30 * 60 * 1000 - - return ( -

- ) -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/BaseTanStackRouterDevtoolsPanel.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/BaseTanStackRouterDevtoolsPanel.tsx deleted file mode 100644 index a84f318bc..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/BaseTanStackRouterDevtoolsPanel.tsx +++ /dev/null @@ -1,632 +0,0 @@ -import { clsx as cx } from 'clsx' -import { default as invariant } from 'tiny-invariant' -import { interpolatePath, rootRouteId, trimPath } from '@tanstack/router-core' -import { Show, createMemo } from 'solid-js' -import { useDevtoolsOnClose } from './context' -import { useStyles } from './useStyles' -import useLocalStorage from './useLocalStorage' -import { Explorer } from './Explorer' -import { getRouteStatusColor, getStatusColor, multiSortBy } from './utils' -import { AgeTicker } from './AgeTicker' -// import type { DevtoolsPanelOptions } from './TanStackRouterDevtoolsPanel' - -import { NavigateButton } from './NavigateButton' -import type { - AnyContext, - AnyRoute, - AnyRouter, - FileRouteTypes, - MakeRouteMatchUnion, - Route, - RouterState, -} from '@tanstack/router-core' -import type { Accessor, JSX } from 'solid-js' - -export interface BaseDevtoolsPanelOptions { - /** - * The standard React style object used to style a component with inline styles - */ - style?: Accessor - /** - * The standard React class property used to style a component with classes - */ - className?: Accessor - /** - * A boolean variable indicating whether the panel is open or closed - */ - isOpen?: boolean - /** - * A function that toggles the open and close state of the panel - */ - setIsOpen?: (isOpen: boolean) => void - /** - * Handles the opening and closing the devtools panel - */ - handleDragStart?: (e: any) => void - /** - * A boolean variable indicating if the "lite" version of the library is being used - */ - router: Accessor - routerState: Accessor - /** - * Use this to attach the devtool's styles to specific element in the DOM. - */ - shadowDOMTarget?: ShadowRoot -} - -function Logo(props: any) { - const { className, ...rest } = props - const styles = useStyles() - return ( - - ) -} - -function NavigateLink(props: { - class?: string - left?: JSX.Element - children?: JSX.Element - right?: JSX.Element -}) { - return ( -
- {props.left} -
{props.children}
- {props.right} -
- ) -} - -function RouteComp({ - routerState, - router, - route, - isRoot, - activeId, - setActiveId, -}: { - routerState: Accessor< - RouterState< - Route< - any, - '/', - '/', - string, - '__root__', - undefined, - {}, - {}, - AnyContext, - AnyContext, - {}, - undefined, - any, - FileRouteTypes - >, - MakeRouteMatchUnion - > - > - router: Accessor - route: AnyRoute - isRoot?: boolean - activeId: Accessor - setActiveId: (id: string) => void -}) { - const styles = useStyles() - const matches = createMemo( - () => routerState().pendingMatches || routerState().matches, - ) - const match = createMemo(() => - routerState().matches.find((d) => d.routeId === route.id), - ) - - const param = createMemo(() => { - try { - if (match()?.params) { - const p = match()?.params - const r: string = route.path || trimPath(route.id) - if (r.startsWith('$')) { - const trimmed = r.slice(1) - - if (p[trimmed]) { - return `(${p[trimmed]})` - } - } - } - return '' - } catch (error) { - return '' - } - }) - - const navigationTarget = createMemo(() => { - if (isRoot) return undefined // rootRouteId has no path - if (!route.path) return undefined // no path to navigate to - - // flatten all params in the router state, into a single object - const allParams = Object.assign({}, ...matches().map((m) => m.params)) - - // interpolatePath is used by router-core to generate the `to` - // path for the navigate function in the router - const interpolated = interpolatePath({ - path: route.fullPath, - params: allParams, - leaveWildcards: false, - leaveParams: false, - decodeCharMap: router().pathParamsDecodeCharMap, - }) - - // only if `interpolated` is not missing params, return the path since this - // means that all the params are present for a successful navigation - return !interpolated.isMissingParams - ? interpolated.interpolatedPath - : undefined - }) - - return ( -
-
{ - if (match()) { - setActiveId(activeId() === route.id ? '' : route.id) - } - }} - class={cx( - styles().routesRowContainer(route.id === activeId(), !!match()), - )} - > -
- - {(navigate) => } - - } - right={} - > - - {isRoot ? rootRouteId : route.path || trimPath(route.id)}{' '} - - {param()} - -
- {route.children?.length ? ( -
- {[...(route.children as Array)] - .sort((a, b) => { - return a.rank - b.rank - }) - .map((r) => ( - - ))} -
- ) : null} -
- ) -} - -export const BaseTanStackRouterDevtoolsPanel = - function BaseTanStackRouterDevtoolsPanel({ - ...props - }: BaseDevtoolsPanelOptions): JSX.Element { - const { - isOpen = true, - setIsOpen, - handleDragStart, - router, - routerState, - shadowDOMTarget, - ...panelProps - } = props - - const { onCloseClick } = useDevtoolsOnClose() - const styles = useStyles() - const { className, style, ...otherPanelProps } = panelProps - - invariant( - router, - 'No router was found for the TanStack Router Devtools. Please place the devtools in the component tree or pass the router instance to the devtools manually.', - ) - - // useStore(router.__store) - - const [showMatches, setShowMatches] = useLocalStorage( - 'tanstackRouterDevtoolsShowMatches', - true, - ) - - const [activeId, setActiveId] = useLocalStorage( - 'tanstackRouterDevtoolsActiveRouteId', - '', - ) - - const activeMatch = createMemo(() => { - const matches = [ - ...(routerState().pendingMatches ?? []), - ...routerState().matches, - ...routerState().cachedMatches, - ] - return matches.find( - (d) => d.routeId === activeId() || d.id === activeId(), - ) - }) - - const hasSearch = createMemo( - () => Object.keys(routerState().location.search).length, - ) - - const explorerState = createMemo(() => { - return { - ...router(), - state: routerState(), - } - }) - - const routerExplorerValue = createMemo(() => - Object.fromEntries( - multiSortBy( - Object.keys(explorerState()), - ( - [ - 'state', - 'routesById', - 'routesByPath', - 'flatRoutes', - 'options', - 'manifest', - ] as const - ).map((d) => (dd) => dd !== d), - ) - .map((key) => [key, (explorerState() as any)[key]]) - .filter( - (d) => - typeof d[1] !== 'function' && - ![ - '__store', - 'basepath', - 'injectedHtml', - 'subscribers', - 'latestLoadPromise', - 'navigateTimeout', - 'resetNextScroll', - 'tempLocationKey', - 'latestLocation', - 'routeTree', - 'history', - ].includes(d[0]), - ), - ), - ) - const activeMatchLoaderData = createMemo(() => activeMatch()?.loaderData) - const activeMatchValue = createMemo(() => activeMatch()) - const locationSearchValue = createMemo(() => routerState().location.search) - - return ( -
- {handleDragStart ? ( -
- ) : null} - -
-
- { - if (setIsOpen) { - setIsOpen(false) - } - onCloseClick(e) - }} - /> -
-
-
- { - return subEntries.filter( - (d: any) => typeof d.value() !== 'function', - ) - }} - /> -
-
-
-
-
-
- Pathname - {routerState().location.maskedLocation ? ( -
- masked -
- ) : null} -
-
- {routerState().location.pathname} - {routerState().location.maskedLocation ? ( - - {routerState().location.maskedLocation?.pathname} - - ) : null} -
-
-
- - -
-
-
age / staleTime / gcTime
-
-
-
- {!showMatches() ? ( - - ) : ( -
- {(routerState().pendingMatches?.length - ? routerState().pendingMatches - : routerState().matches - )?.map((match: any, _i: any) => { - return ( -
- setActiveId(activeId() === match.id ? '' : match.id) - } - class={cx(styles().matchRow(match === activeMatch()))} - > -
- - } - right={} - > - - {`${match.routeId === rootRouteId ? rootRouteId : match.pathname}`} - - -
- ) - })} -
- )} -
-
- {routerState().cachedMatches.length ? ( -
-
-
Cached Matches
-
- age / staleTime / gcTime -
-
-
- {routerState().cachedMatches.map((match: any) => { - return ( -
- setActiveId(activeId() === match.id ? '' : match.id) - } - class={cx(styles().matchRow(match === activeMatch()))} - > -
- - } - right={} - > - {`${match.id}`} - -
- ) - })} -
-
- ) : null} -
- {activeMatch() && activeMatch()?.status ? ( -
-
Match Details
-
-
-
-
- {activeMatch()?.status === 'success' && - activeMatch()?.isFetching - ? 'fetching' - : activeMatch()?.status} -
-
-
-
ID:
-
- {activeMatch()?.id} -
-
-
-
State:
-
- {routerState().pendingMatches?.find( - (d: any) => d.id === activeMatch()?.id, - ) - ? 'Pending' - : routerState().matches.find( - (d: any) => d.id === activeMatch()?.id, - ) - ? 'Active' - : 'Cached'} -
-
-
-
Last Updated:
-
- {activeMatch()?.updatedAt - ? new Date(activeMatch()?.updatedAt).toLocaleTimeString() - : 'N/A'} -
-
-
-
- {activeMatchLoaderData() ? ( - <> -
Loader Data
-
- -
- - ) : null} -
Explorer
-
- -
-
- ) : null} - {hasSearch() ? ( -
-
Search Params
-
- { - obj[next] = {} - return obj - }, {})} - /> -
-
- ) : null} -
- ) - } - -export default BaseTanStackRouterDevtoolsPanel diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/Explorer.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/Explorer.tsx deleted file mode 100644 index a43cb9c95..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/Explorer.tsx +++ /dev/null @@ -1,339 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unnecessary-condition */ -import { clsx as cx } from 'clsx' -import * as goober from 'goober' -import { createMemo, createSignal, useContext } from 'solid-js' -import { tokens } from './tokens' -import { displayValue } from './utils' -import { ShadowDomTargetContext } from './context' -import type { Accessor, JSX } from 'solid-js' - -type ExpanderProps = { - expanded: boolean - style?: JSX.CSSProperties -} - -export const Expander = ({ expanded, style = {} }: ExpanderProps) => { - const styles = useStyles() - return ( - - - - - - ) -} - -type Entry = { - label: string -} - -type RendererProps = { - handleEntry: HandleEntryFn - label?: JSX.Element - value: Accessor - subEntries: Array - subEntryPages: Array> - type: string - expanded: Accessor - toggleExpanded: () => void - pageSize: number - filterSubEntries?: (subEntries: Array) => Array -} - -/** - * Chunk elements in the array by size - * - * when the array cannot be chunked evenly by size, the last chunk will be - * filled with the remaining elements - * - * @example - * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']] - */ -export function chunkArray(array: Array, size: number): Array> { - if (size < 1) return [] - let i = 0 - const result: Array> = [] - while (i < array.length) { - result.push(array.slice(i, i + size)) - i = i + size - } - return result -} - -type HandleEntryFn = (entry: Entry) => JSX.Element - -type ExplorerProps = Partial & { - defaultExpanded?: true | Record - value: Accessor -} - -type Property = { - defaultExpanded?: boolean | Record - label: string - value: unknown -} - -function isIterable(x: any): x is Iterable { - return Symbol.iterator in x -} - -export function Explorer({ - value, - defaultExpanded, - pageSize = 100, - filterSubEntries, - ...rest -}: ExplorerProps) { - const [expanded, setExpanded] = createSignal(Boolean(defaultExpanded)) - const toggleExpanded = () => setExpanded((old) => !old) - - const type = createMemo(() => typeof value()) - const subEntries = createMemo(() => { - let entries: Array = [] - - const makeProperty = (sub: { label: string; value: unknown }): Property => { - const subDefaultExpanded = - defaultExpanded === true - ? { [sub.label]: true } - : defaultExpanded?.[sub.label] - return { - ...sub, - value: () => sub.value, - defaultExpanded: subDefaultExpanded, - } - } - - if (Array.isArray(value())) { - // any[] - entries = (value() as Array).map((d, i) => - makeProperty({ - label: i.toString(), - value: d, - }), - ) - } else if ( - value() !== null && - typeof value() === 'object' && - isIterable(value()) && - typeof (value() as Iterable)[Symbol.iterator] === 'function' - ) { - // Iterable - entries = Array.from(value() as Iterable, (val, i) => - makeProperty({ - label: i.toString(), - value: val, - }), - ) - } else if (typeof value() === 'object' && value() !== null) { - // object - entries = Object.entries(value() as object).map(([key, val]) => - makeProperty({ - label: key, - value: val, - }), - ) - } - - return filterSubEntries ? filterSubEntries(entries) : entries - }) - - const subEntryPages = createMemo(() => chunkArray(subEntries(), pageSize)) - - const [expandedPages, setExpandedPages] = createSignal>([]) - const [valueSnapshot, setValueSnapshot] = createSignal(undefined) - const styles = useStyles() - - const refreshValueSnapshot = () => { - setValueSnapshot((value() as () => any)()) - } - - const handleEntry = (entry: Entry) => ( - - ) - - return ( -
- {subEntryPages().length ? ( - <> - - {(expanded() ?? false) ? ( - subEntryPages().length === 1 ? ( -
- {subEntries().map((entry, index) => handleEntry(entry))} -
- ) : ( -
- {subEntryPages().map((entries, index) => { - return ( -
-
- - {expandedPages().includes(index) ? ( -
- {entries.map((entry) => handleEntry(entry))} -
- ) : null} -
-
- ) - })} -
- ) - ) : null} - - ) : type() === 'function' ? ( - <> - - {rest.label} 🔄{' '} - - } - value={valueSnapshot} - defaultExpanded={{}} - /> - - ) : ( - <> - {rest.label}:{' '} - {displayValue(value())} - - )} -
- ) -} - -const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { - const { colors, font, size, alpha, shadow, border } = tokens - const { fontFamily, lineHeight, size: fontSize } = font - const css = shadowDOMTarget - ? goober.css.bind({ target: shadowDOMTarget }) - : goober.css - - return { - entry: css` - font-family: ${fontFamily.mono}; - font-size: ${fontSize.xs}; - line-height: ${lineHeight.sm}; - outline: none; - word-break: break-word; - `, - labelButton: css` - cursor: pointer; - color: inherit; - font: inherit; - outline: inherit; - background: transparent; - border: none; - padding: 0; - `, - expander: css` - display: inline-flex; - align-items: center; - justify-content: center; - width: ${size[3]}; - height: ${size[3]}; - padding-left: 3px; - box-sizing: content-box; - `, - expanderIcon: (expanded: boolean) => { - if (expanded) { - return css` - transform: rotate(90deg); - transition: transform 0.1s ease; - ` - } - return css` - transform: rotate(0deg); - transition: transform 0.1s ease; - ` - }, - expandButton: css` - display: flex; - gap: ${size[1]}; - align-items: center; - cursor: pointer; - color: inherit; - font: inherit; - outline: inherit; - background: transparent; - border: none; - padding: 0; - `, - value: css` - color: ${colors.purple[400]}; - `, - subEntries: css` - margin-left: ${size[2]}; - padding-left: ${size[2]}; - border-left: 2px solid ${colors.darkGray[400]}; - `, - info: css` - color: ${colors.gray[500]}; - font-size: ${fontSize['2xs']}; - padding-left: ${size[1]}; - `, - refreshValueBtn: css` - appearance: none; - border: 0; - cursor: pointer; - background: transparent; - color: inherit; - padding: 0; - font-family: ${fontFamily.mono}; - font-size: ${fontSize.xs}; - `, - } -} - -function useStyles() { - const shadowDomTarget = useContext(ShadowDomTargetContext) - const [_styles] = createSignal(stylesFactory(shadowDomTarget)) - return _styles -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx deleted file mode 100644 index f8eca4d4b..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx +++ /dev/null @@ -1,290 +0,0 @@ -import { clsx as cx } from 'clsx' - -import { createEffect, createMemo, createSignal } from 'solid-js' -import { Dynamic } from 'solid-js/web' - -import { DevtoolsOnCloseContext } from './context' -import { useIsMounted } from './utils' -import { BaseTanStackRouterDevtoolsPanel } from './BaseTanStackRouterDevtoolsPanel' -import useLocalStorage from './useLocalStorage' -import { TanStackLogo } from './logo' -import { useStyles } from './useStyles' -import type { Accessor, JSX } from 'solid-js' -import type { AnyRouter } from '@tanstack/router-core' - -export interface FloatingDevtoolsOptions { - /** - * Set this true if you want the dev tools to default to being open - */ - initialIsOpen?: boolean - /** - * Use this to add props to the panel. For example, you can add class, style (merge and override default style), etc. - */ - panelProps?: any & { - ref?: any - } - /** - * Use this to add props to the close button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. - */ - closeButtonProps?: any & { - ref?: any - } - /** - * Use this to add props to the toggle button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. - */ - toggleButtonProps?: any & { - ref?: any - } - /** - * The position of the TanStack Router logo to open and close the devtools panel. - * Defaults to 'bottom-left'. - */ - position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' - /** - * Use this to render the devtools inside a different type of container element for a11y purposes. - * Any string which corresponds to a valid intrinsic JSX element is allowed. - * Defaults to 'footer'. - */ - containerElement?: string | any - /** - * A boolean variable indicating if the "lite" version of the library is being used - */ - router: Accessor - routerState: Accessor - /** - * Use this to attach the devtool's styles to specific element in the DOM. - */ - shadowDOMTarget?: ShadowRoot -} - -export function FloatingTanStackRouterDevtools({ - initialIsOpen, - panelProps = {}, - closeButtonProps = {}, - toggleButtonProps = {}, - position = 'bottom-left', - containerElement: Container = 'footer', - router, - routerState, - shadowDOMTarget, -}: FloatingDevtoolsOptions): JSX.Element | null { - const [rootEl, setRootEl] = createSignal() - - // eslint-disable-next-line prefer-const - let panelRef: HTMLDivElement | undefined = undefined - - const [isOpen, setIsOpen] = useLocalStorage( - 'tanstackRouterDevtoolsOpen', - initialIsOpen, - ) - - const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage( - 'tanstackRouterDevtoolsHeight', - null, - ) - - const [isResolvedOpen, setIsResolvedOpen] = createSignal(false) - const [isResizing, setIsResizing] = createSignal(false) - const isMounted = useIsMounted() - const styles = useStyles() - - const handleDragStart = ( - panelElement: HTMLDivElement | undefined, - startEvent: any, - ) => { - if (startEvent.button !== 0) return // Only allow left click for drag - - setIsResizing(true) - - const dragInfo = { - originalHeight: panelElement?.getBoundingClientRect().height ?? 0, - pageY: startEvent.pageY, - } - - const run = (moveEvent: MouseEvent) => { - const delta = dragInfo.pageY - moveEvent.pageY - const newHeight = dragInfo.originalHeight + delta - - setDevtoolsHeight(newHeight) - - if (newHeight < 70) { - setIsOpen(false) - } else { - setIsOpen(true) - } - } - - const unsub = () => { - setIsResizing(false) - document.removeEventListener('mousemove', run) - document.removeEventListener('mouseUp', unsub) - } - - document.addEventListener('mousemove', run) - document.addEventListener('mouseup', unsub) - } - - const isButtonClosed = isOpen() ?? false - - createEffect(() => { - setIsResolvedOpen(isOpen() ?? false) - }) - - createEffect(() => { - if (isResolvedOpen()) { - const previousValue = rootEl()?.parentElement?.style.paddingBottom - - const run = () => { - const containerHeight = panelRef!.getBoundingClientRect().height - if (rootEl()?.parentElement) { - setRootEl((prev) => { - if (prev?.parentElement) { - prev.parentElement.style.paddingBottom = `${containerHeight}px` - } - return prev - }) - } - } - - run() - - if (typeof window !== 'undefined') { - window.addEventListener('resize', run) - - return () => { - window.removeEventListener('resize', run) - if (rootEl()?.parentElement && typeof previousValue === 'string') { - setRootEl((prev) => { - prev!.parentElement!.style.paddingBottom = previousValue - return prev - }) - } - } - } - } else { - // Reset padding when devtools are closed - if (rootEl()?.parentElement) { - setRootEl((prev) => { - if (prev?.parentElement) { - prev.parentElement.removeAttribute('style') - } - return prev - }) - } - } - return - }) - - createEffect(() => { - if (rootEl()) { - const el = rootEl() - const fontSize = getComputedStyle(el!).fontSize - el?.style.setProperty('--tsrd-font-size', fontSize) - } - }) - - const { style: panelStyle = {}, ...otherPanelProps } = panelProps as { - style?: Record - } - - const { - style: closeButtonStyle = {}, - onClick: onCloseClick, - ...otherCloseButtonProps - } = closeButtonProps - - const { - onClick: onToggleClick, - class: toggleButtonClassName, - ...otherToggleButtonProps - } = toggleButtonProps - - // Do not render on the server - if (!isMounted()) return null - - const resolvedHeight = createMemo(() => devtoolsHeight() ?? 500) - - const basePanelClass = createMemo(() => { - return cx( - styles().devtoolsPanelContainer, - styles().devtoolsPanelContainerVisibility(!!isOpen()), - styles().devtoolsPanelContainerResizing(isResizing), - styles().devtoolsPanelContainerAnimation( - isResolvedOpen(), - resolvedHeight() + 16, - ), - ) - }) - - const basePanelStyle = createMemo(() => { - return { - height: `${resolvedHeight()}px`, - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - ...(panelStyle || {}), - } - }) - - const buttonStyle = createMemo(() => { - return cx( - styles().mainCloseBtn, - styles().mainCloseBtnPosition(position), - styles().mainCloseBtnAnimation(!!isOpen()), - toggleButtonClassName, - ) - }) - - return ( - - {}), - }} - > - {/* {router() ? ( */} - handleDragStart(panelRef, e)} - shadowDOMTarget={shadowDOMTarget} - /> - {/* ) : ( -

No router

- )} */} -
- - -
- ) -} - -export default FloatingTanStackRouterDevtools diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/NavigateButton.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/NavigateButton.tsx deleted file mode 100644 index 8f9e5161f..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/NavigateButton.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { useStyles } from './useStyles' -import type { AnyRouter, NavigateOptions } from '@tanstack/router-core' -import type { Accessor } from 'solid-js' - -interface Props extends NavigateOptions { - router: Accessor -} - -export function NavigateButton({ to, params, search, router }: Props) { - const styles = useStyles() - - return ( - - ) -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx deleted file mode 100644 index 4fcd27c93..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx +++ /dev/null @@ -1,163 +0,0 @@ -import { createSignal, lazy } from 'solid-js' -import { render } from 'solid-js/web' -import { ShadowDomTargetContext } from './context' -import type { AnyRouter } from '@tanstack/router-core' -import type { Signal } from 'solid-js' - -interface DevtoolsOptions { - /** - * Set this true if you want the dev tools to default to being open - */ - initialIsOpen?: boolean - /** - * Use this to add props to the panel. For example, you can add class, style (merge and override default style), etc. - */ - panelProps?: any & { - ref?: any - } - /** - * Use this to add props to the close button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. - */ - closeButtonProps?: any & { - ref?: any - } - /** - * Use this to add props to the toggle button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc. - */ - toggleButtonProps?: any & { - ref?: any - } - /** - * The position of the TanStack Router logo to open and close the devtools panel. - * Defaults to 'bottom-left'. - */ - position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' - /** - * Use this to render the devtools inside a different type of container element for a11y purposes. - * Any string which corresponds to a valid intrinsic JSX element is allowed. - * Defaults to 'footer'. - */ - containerElement?: string | any - /** - * A boolean variable indicating if the "lite" version of the library is being used - */ - router: AnyRouter - routerState: any - /** - * Use this to attach the devtool's styles to specific element in the DOM. - */ - shadowDOMTarget?: ShadowRoot -} - -class TanStackRouterDevtoolsCore { - #router: Signal - #routerState: Signal - #position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' - #initialIsOpen: boolean - #shadowDOMTarget?: ShadowRoot - - #panelProps: any - #closeButtonProps: any - #toggleButtonProps: any - #containerElement?: string | any - - #isMounted = false - #Component: any - #dispose?: () => void - - constructor(config: DevtoolsOptions) { - this.#router = createSignal(config.router) - this.#routerState = createSignal(config.routerState) - this.#position = config.position ?? 'bottom-left' - this.#initialIsOpen = config.initialIsOpen ?? false - this.#shadowDOMTarget = config.shadowDOMTarget - - this.#panelProps = config.panelProps - this.#closeButtonProps = config.closeButtonProps - this.#toggleButtonProps = config.toggleButtonProps - this.#containerElement = config.containerElement - } - - mount(el: T) { - if (this.#isMounted) { - throw new Error('Devtools is already mounted') - } - - const dispose = render(() => { - const [router] = this.#router - const [routerState] = this.#routerState - const position = this.#position - const initialIsOpen = this.#initialIsOpen - const shadowDOMTarget = this.#shadowDOMTarget - - const panelProps = this.#panelProps - const closeButtonProps = this.#closeButtonProps - const toggleButtonProps = this.#toggleButtonProps - const containerElement = this.#containerElement - - let Devtools - - if (this.#Component) { - Devtools = this.#Component - } else { - Devtools = lazy(() => import('./FloatingTanStackRouterDevtools')) - this.#Component = Devtools - } - - return ( - - - - ) - }, el) - - this.#isMounted = true - this.#dispose = dispose - } - - unmount() { - if (!this.#isMounted) { - throw new Error('Devtools is not mounted') - } - this.#dispose?.() - this.#isMounted = false - } - - setRouter(router: AnyRouter) { - this.#router[1](router) - } - - setRouterState(routerState: any) { - this.#routerState[1](routerState) - } - - setOptions(options: Partial) { - if (options.position !== undefined) { - this.#position = options.position - } - - if (options.initialIsOpen !== undefined) { - this.#initialIsOpen = options.initialIsOpen - } - - if (options.shadowDOMTarget !== undefined) { - this.#shadowDOMTarget = options.shadowDOMTarget - } - - if (options.containerElement !== undefined) { - this.#containerElement = options.containerElement - } - } -} - -export { TanStackRouterDevtoolsCore } diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsPanelCore.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsPanelCore.tsx deleted file mode 100644 index a76ebdf36..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/TanStackRouterDevtoolsPanelCore.tsx +++ /dev/null @@ -1,131 +0,0 @@ -import { render } from 'solid-js/web' -import { createSignal, lazy } from 'solid-js' -import { DevtoolsOnCloseContext, ShadowDomTargetContext } from './context' -import type { JSX } from 'solid-js' -import type { AnyRouter } from '@tanstack/router-core' - -interface TanStackRouterDevtoolsPanelCoreOptions { - /** - * The standard React style object used to style a component with inline styles - */ - style?: JSX.CSSProperties - /** - * The standard React class property used to style a component with classes - */ - className?: string - /** - * A boolean variable indicating whether the panel is open or closed - */ - isOpen?: boolean - /** - * A function that toggles the open and close state of the panel - */ - setIsOpen?: (isOpen: boolean) => void - /** - * Handles the opening and closing the devtools panel - */ - handleDragStart?: (e: any) => void - /** - * A boolean variable indicating if the "lite" version of the library is being used - */ - router: AnyRouter - - routerState: any - /** - * Use this to attach the devtool's styles to specific element in the DOM. - */ - shadowDOMTarget?: ShadowRoot -} - -class TanStackRouterDevtoolsPanelCore { - #router: any - #routerState: any - #shadowDOMTarget?: ShadowRoot - #isMounted = false - #setIsOpen?: (isOpen: boolean) => void - #dispose?: () => void - #Component: any - - constructor(config: TanStackRouterDevtoolsPanelCoreOptions) { - const { router, routerState, shadowDOMTarget, setIsOpen } = config - - this.#router = createSignal(router) - this.#routerState = createSignal(routerState) - this.#shadowDOMTarget = shadowDOMTarget - this.#setIsOpen = setIsOpen - } - - mount(el: T) { - if (this.#isMounted) { - throw new Error('Devtools is already mounted') - } - - const dispose = render(() => { - const [router] = this.#router - const [routerState] = this.#routerState - const shadowDOMTarget = this.#shadowDOMTarget - const setIsOpen = this.#setIsOpen - - let BaseTanStackRouterDevtoolsPanel - - if (this.#Component) { - BaseTanStackRouterDevtoolsPanel = this.#Component - } else { - BaseTanStackRouterDevtoolsPanel = lazy( - () => import('./BaseTanStackRouterDevtoolsPanel'), - ) - this.#Component = BaseTanStackRouterDevtoolsPanel - } - - return ( - - {}, - }} - > - - - - ) - }, el) - - this.#isMounted = true - this.#dispose = dispose - } - - unmount() { - if (!this.#isMounted) { - throw new Error('Devtools is not mounted') - } - this.#dispose?.() - this.#isMounted = false - } - - setRouter(router: AnyRouter) { - this.#router[1](router) - } - - setRouterState(routerState: any) { - this.#routerState[1](routerState) - } - - setOptions(options: Partial) { - if (options.shadowDOMTarget !== undefined) { - this.#shadowDOMTarget = options.shadowDOMTarget - } - if (options.router !== undefined) { - this.setRouter(options.router) - } - if (options.routerState !== undefined) { - this.setRouterState(options.routerState) - } - } -} - -export { TanStackRouterDevtoolsPanelCore } diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/context.ts b/devtools-reference/tanstack-router/router-devtools-core/src/context.ts deleted file mode 100644 index c95021207..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/context.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createContext, useContext } from 'solid-js' - -export const ShadowDomTargetContext = createContext( - undefined, -) - -export const DevtoolsOnCloseContext = createContext< - | { - onCloseClick: ( - e: MouseEvent & { currentTarget: HTMLButtonElement; target: Element }, - ) => void - } - | undefined ->(undefined) - -export const useDevtoolsOnClose = () => { - const context = useContext(DevtoolsOnCloseContext) - if (!context) { - throw new Error( - 'useDevtoolsOnClose must be used within a TanStackRouterDevtools component', - ) - } - return context -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/index.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/index.tsx deleted file mode 100644 index a24a59a74..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export { TanStackRouterDevtoolsCore } from './TanStackRouterDevtoolsCore' -export { TanStackRouterDevtoolsPanelCore } from './TanStackRouterDevtoolsPanelCore' diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/logo.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/logo.tsx deleted file mode 100644 index c5a0b79a0..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/logo.tsx +++ /dev/null @@ -1,817 +0,0 @@ -import { createUniqueId } from 'solid-js' - -export function TanStackLogo() { - const id = createUniqueId() - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ) -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/theme.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/theme.tsx deleted file mode 100644 index 4053cc8fd..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/theme.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { createContext, useContext } from 'solid-js' -import type { JSX } from 'solid-js' - -export const defaultTheme = { - background: '#222222', - backgroundAlt: '#292929', - foreground: 'white', - gray: '#444', - grayAlt: '#444', - inputBackgroundColor: '#fff', - inputTextColor: '#000', - success: '#80cb00', - danger: '#ff0085', - active: '#0099ff', - warning: '#ffb200', -} as const - -export type Theme = typeof defaultTheme -interface ProviderProps { - theme: Theme - children?: JSX.Element -} - -const ThemeContext = createContext(defaultTheme) - -export function ThemeProvider({ children, theme, ...rest }: ProviderProps) { - return ( - - {children} - - ) -} - -export function useTheme() { - return useContext(ThemeContext) -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/tokens.ts b/devtools-reference/tanstack-router/router-devtools-core/src/tokens.ts deleted file mode 100644 index 9d247cf18..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/tokens.ts +++ /dev/null @@ -1,305 +0,0 @@ -export const tokens = { - colors: { - inherit: 'inherit', - current: 'currentColor', - transparent: 'transparent', - black: '#000000', - white: '#ffffff', - neutral: { - 50: '#f9fafb', - 100: '#f2f4f7', - 200: '#eaecf0', - 300: '#d0d5dd', - 400: '#98a2b3', - 500: '#667085', - 600: '#475467', - 700: '#344054', - 800: '#1d2939', - 900: '#101828', - }, - darkGray: { - 50: '#525c7a', - 100: '#49536e', - 200: '#414962', - 300: '#394056', - 400: '#313749', - 500: '#292e3d', - 600: '#212530', - 700: '#191c24', - 800: '#111318', - 900: '#0b0d10', - }, - gray: { - 50: '#f9fafb', - 100: '#f2f4f7', - 200: '#eaecf0', - 300: '#d0d5dd', - 400: '#98a2b3', - 500: '#667085', - 600: '#475467', - 700: '#344054', - 800: '#1d2939', - 900: '#101828', - }, - blue: { - 25: '#F5FAFF', - 50: '#EFF8FF', - 100: '#D1E9FF', - 200: '#B2DDFF', - 300: '#84CAFF', - 400: '#53B1FD', - 500: '#2E90FA', - 600: '#1570EF', - 700: '#175CD3', - 800: '#1849A9', - 900: '#194185', - }, - green: { - 25: '#F6FEF9', - 50: '#ECFDF3', - 100: '#D1FADF', - 200: '#A6F4C5', - 300: '#6CE9A6', - 400: '#32D583', - 500: '#12B76A', - 600: '#039855', - 700: '#027A48', - 800: '#05603A', - 900: '#054F31', - }, - red: { - 50: '#fef2f2', - 100: '#fee2e2', - 200: '#fecaca', - 300: '#fca5a5', - 400: '#f87171', - 500: '#ef4444', - 600: '#dc2626', - 700: '#b91c1c', - 800: '#991b1b', - 900: '#7f1d1d', - 950: '#450a0a', - }, - yellow: { - 25: '#FFFCF5', - 50: '#FFFAEB', - 100: '#FEF0C7', - 200: '#FEDF89', - 300: '#FEC84B', - 400: '#FDB022', - 500: '#F79009', - 600: '#DC6803', - 700: '#B54708', - 800: '#93370D', - 900: '#7A2E0E', - }, - purple: { - 25: '#FAFAFF', - 50: '#F4F3FF', - 100: '#EBE9FE', - 200: '#D9D6FE', - 300: '#BDB4FE', - 400: '#9B8AFB', - 500: '#7A5AF8', - 600: '#6938EF', - 700: '#5925DC', - 800: '#4A1FB8', - 900: '#3E1C96', - }, - teal: { - 25: '#F6FEFC', - 50: '#F0FDF9', - 100: '#CCFBEF', - 200: '#99F6E0', - 300: '#5FE9D0', - 400: '#2ED3B7', - 500: '#15B79E', - 600: '#0E9384', - 700: '#107569', - 800: '#125D56', - 900: '#134E48', - }, - pink: { - 25: '#fdf2f8', - 50: '#fce7f3', - 100: '#fbcfe8', - 200: '#f9a8d4', - 300: '#f472b6', - 400: '#ec4899', - 500: '#db2777', - 600: '#be185d', - 700: '#9d174d', - 800: '#831843', - 900: '#500724', - }, - cyan: { - 25: '#ecfeff', - 50: '#cffafe', - 100: '#a5f3fc', - 200: '#67e8f9', - 300: '#22d3ee', - 400: '#06b6d4', - 500: '#0891b2', - 600: '#0e7490', - 700: '#155e75', - 800: '#164e63', - 900: '#083344', - }, - }, - alpha: { - 100: 'ff', - 90: 'e5', - 80: 'cc', - 70: 'b3', - 60: '99', - 50: '80', - 40: '66', - 30: '4d', - 20: '33', - 10: '1a', - 0: '00', - }, - font: { - size: { - '2xs': 'calc(var(--tsrd-font-size) * 0.625)', - xs: 'calc(var(--tsrd-font-size) * 0.75)', - sm: 'calc(var(--tsrd-font-size) * 0.875)', - md: 'var(--tsrd-font-size)', - lg: 'calc(var(--tsrd-font-size) * 1.125)', - xl: 'calc(var(--tsrd-font-size) * 1.25)', - '2xl': 'calc(var(--tsrd-font-size) * 1.5)', - '3xl': 'calc(var(--tsrd-font-size) * 1.875)', - '4xl': 'calc(var(--tsrd-font-size) * 2.25)', - '5xl': 'calc(var(--tsrd-font-size) * 3)', - '6xl': 'calc(var(--tsrd-font-size) * 3.75)', - '7xl': 'calc(var(--tsrd-font-size) * 4.5)', - '8xl': 'calc(var(--tsrd-font-size) * 6)', - '9xl': 'calc(var(--tsrd-font-size) * 8)', - }, - lineHeight: { - '3xs': 'calc(var(--tsrd-font-size) * 0.75)', - '2xs': 'calc(var(--tsrd-font-size) * 0.875)', - xs: 'calc(var(--tsrd-font-size) * 1)', - sm: 'calc(var(--tsrd-font-size) * 1.25)', - md: 'calc(var(--tsrd-font-size) * 1.5)', - lg: 'calc(var(--tsrd-font-size) * 1.75)', - xl: 'calc(var(--tsrd-font-size) * 2)', - '2xl': 'calc(var(--tsrd-font-size) * 2.25)', - '3xl': 'calc(var(--tsrd-font-size) * 2.5)', - '4xl': 'calc(var(--tsrd-font-size) * 2.75)', - '5xl': 'calc(var(--tsrd-font-size) * 3)', - '6xl': 'calc(var(--tsrd-font-size) * 3.25)', - '7xl': 'calc(var(--tsrd-font-size) * 3.5)', - '8xl': 'calc(var(--tsrd-font-size) * 3.75)', - '9xl': 'calc(var(--tsrd-font-size) * 4)', - }, - weight: { - thin: '100', - extralight: '200', - light: '300', - normal: '400', - medium: '500', - semibold: '600', - bold: '700', - extrabold: '800', - black: '900', - }, - fontFamily: { - sans: 'ui-sans-serif, Inter, system-ui, sans-serif, sans-serif', - mono: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace`, - }, - }, - breakpoints: { - xs: '320px', - sm: '640px', - md: '768px', - lg: '1024px', - xl: '1280px', - '2xl': '1536px', - }, - border: { - radius: { - none: '0px', - xs: 'calc(var(--tsrd-font-size) * 0.125)', - sm: 'calc(var(--tsrd-font-size) * 0.25)', - md: 'calc(var(--tsrd-font-size) * 0.375)', - lg: 'calc(var(--tsrd-font-size) * 0.5)', - xl: 'calc(var(--tsrd-font-size) * 0.75)', - '2xl': 'calc(var(--tsrd-font-size) * 1)', - '3xl': 'calc(var(--tsrd-font-size) * 1.5)', - full: '9999px', - }, - }, - size: { - 0: '0px', - 0.25: 'calc(var(--tsrd-font-size) * 0.0625)', - 0.5: 'calc(var(--tsrd-font-size) * 0.125)', - 1: 'calc(var(--tsrd-font-size) * 0.25)', - 1.5: 'calc(var(--tsrd-font-size) * 0.375)', - 2: 'calc(var(--tsrd-font-size) * 0.5)', - 2.5: 'calc(var(--tsrd-font-size) * 0.625)', - 3: 'calc(var(--tsrd-font-size) * 0.75)', - 3.5: 'calc(var(--tsrd-font-size) * 0.875)', - 4: 'calc(var(--tsrd-font-size) * 1)', - 4.5: 'calc(var(--tsrd-font-size) * 1.125)', - 5: 'calc(var(--tsrd-font-size) * 1.25)', - 5.5: 'calc(var(--tsrd-font-size) * 1.375)', - 6: 'calc(var(--tsrd-font-size) * 1.5)', - 6.5: 'calc(var(--tsrd-font-size) * 1.625)', - 7: 'calc(var(--tsrd-font-size) * 1.75)', - 8: 'calc(var(--tsrd-font-size) * 2)', - 9: 'calc(var(--tsrd-font-size) * 2.25)', - 10: 'calc(var(--tsrd-font-size) * 2.5)', - 11: 'calc(var(--tsrd-font-size) * 2.75)', - 12: 'calc(var(--tsrd-font-size) * 3)', - 14: 'calc(var(--tsrd-font-size) * 3.5)', - 16: 'calc(var(--tsrd-font-size) * 4)', - 20: 'calc(var(--tsrd-font-size) * 5)', - 24: 'calc(var(--tsrd-font-size) * 6)', - 28: 'calc(var(--tsrd-font-size) * 7)', - 32: 'calc(var(--tsrd-font-size) * 8)', - 36: 'calc(var(--tsrd-font-size) * 9)', - 40: 'calc(var(--tsrd-font-size) * 10)', - 44: 'calc(var(--tsrd-font-size) * 11)', - 48: 'calc(var(--tsrd-font-size) * 12)', - 52: 'calc(var(--tsrd-font-size) * 13)', - 56: 'calc(var(--tsrd-font-size) * 14)', - 60: 'calc(var(--tsrd-font-size) * 15)', - 64: 'calc(var(--tsrd-font-size) * 16)', - 72: 'calc(var(--tsrd-font-size) * 18)', - 80: 'calc(var(--tsrd-font-size) * 20)', - 96: 'calc(var(--tsrd-font-size) * 24)', - }, - shadow: { - xs: (_: string = 'rgb(0 0 0 / 0.1)') => - `0 1px 2px 0 rgb(0 0 0 / 0.05)` as const, - sm: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}` as const, - md: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}` as const, - lg: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}` as const, - xl: (color: string = 'rgb(0 0 0 / 0.1)') => - `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}` as const, - '2xl': (color: string = 'rgb(0 0 0 / 0.25)') => - `0 25px 50px -12px ${color}` as const, - inner: (color: string = 'rgb(0 0 0 / 0.05)') => - `inset 0 2px 4px 0 ${color}` as const, - none: () => `none` as const, - }, - zIndices: { - hide: -1, - auto: 'auto', - base: 0, - docked: 10, - dropdown: 1000, - sticky: 1100, - banner: 1200, - overlay: 1300, - modal: 1400, - popover: 1500, - skipLink: 1600, - toast: 1700, - tooltip: 1800, - }, -} as const diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/useLocalStorage.ts b/devtools-reference/tanstack-router/router-devtools-core/src/useLocalStorage.ts deleted file mode 100644 index 122bc9288..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/useLocalStorage.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { createEffect, createSignal } from 'solid-js' -import type { Accessor } from 'solid-js' - -const getItem = (key: string): unknown => { - try { - const itemValue = localStorage.getItem(key) - if (typeof itemValue === 'string') { - return JSON.parse(itemValue) - } - return undefined - } catch { - return undefined - } -} - -export default function useLocalStorage( - key: string, - defaultValue: T | undefined, -): [Accessor, (newVal: T | ((prevVal: T) => T)) => void] { - const [value, setValue] = createSignal() - - createEffect(() => { - const initialValue = getItem(key) as T | undefined - - if (typeof initialValue === 'undefined' || initialValue === null) { - setValue( - typeof defaultValue === 'function' ? defaultValue() : defaultValue, - ) - } else { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - setValue(initialValue) - } - }) - - const setter = (updater: any) => { - setValue((old) => { - let newVal = updater - - if (typeof updater == 'function') { - newVal = updater(old) - } - try { - localStorage.setItem(key, JSON.stringify(newVal)) - } catch {} - - return newVal - }) - } - - return [value, setter] -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/useMediaQuery.ts b/devtools-reference/tanstack-router/router-devtools-core/src/useMediaQuery.ts deleted file mode 100644 index 4d59a6bf2..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/useMediaQuery.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { createEffect, createSignal } from 'solid-js' -import type { Accessor } from 'solid-js' - -export default function useMediaQuery( - query: string, -): Accessor { - // Keep track of the preference in state, start with the current match - const [isMatch, setIsMatch] = createSignal(() => { - if (typeof window !== 'undefined') { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - return window.matchMedia && window.matchMedia(query).matches - } - return - }) - - // Watch for changes - createEffect(() => { - if (typeof window !== 'undefined') { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (!window.matchMedia) { - return - } - - // Create a matcher - const matcher = window.matchMedia(query) - - // Create our handler - const onChange = ({ matches }: { matches: boolean }) => - setIsMatch(() => () => matches) - - // Listen for changes - matcher.addListener(onChange) - - return () => { - // Stop listening for changes - matcher.removeListener(onChange) - } - } - - return - }) - - return isMatch() -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/useStyles.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/useStyles.tsx deleted file mode 100644 index d1a12ad57..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/useStyles.tsx +++ /dev/null @@ -1,614 +0,0 @@ -import * as goober from 'goober' -import { createSignal, useContext } from 'solid-js' -import { tokens } from './tokens' -import { ShadowDomTargetContext } from './context' -import type { Accessor } from 'solid-js' - -const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { - const { colors, font, size, alpha, shadow, border } = tokens - const { fontFamily, lineHeight, size: fontSize } = font - const css = shadowDOMTarget - ? goober.css.bind({ target: shadowDOMTarget }) - : goober.css - - return { - devtoolsPanelContainer: css` - direction: ltr; - position: fixed; - bottom: 0; - right: 0; - z-index: 99999; - width: 100%; - max-height: 90%; - border-top: 1px solid ${colors.gray[700]}; - transform-origin: top; - `, - devtoolsPanelContainerVisibility: (isOpen: boolean) => { - return css` - visibility: ${isOpen ? 'visible' : 'hidden'}; - ` - }, - devtoolsPanelContainerResizing: (isResizing: Accessor) => { - if (isResizing()) { - return css` - transition: none; - ` - } - - return css` - transition: all 0.4s ease; - ` - }, - devtoolsPanelContainerAnimation: (isOpen: boolean, height: number) => { - if (isOpen) { - return css` - pointer-events: auto; - transform: translateY(0); - ` - } - return css` - pointer-events: none; - transform: translateY(${height}px); - ` - }, - logo: css` - cursor: pointer; - display: flex; - flex-direction: column; - background-color: transparent; - border: none; - font-family: ${fontFamily.sans}; - gap: ${tokens.size[0.5]}; - padding: 0px; - &:hover { - opacity: 0.7; - } - &:focus-visible { - outline-offset: 4px; - border-radius: ${border.radius.xs}; - outline: 2px solid ${colors.blue[800]}; - } - `, - tanstackLogo: css` - font-size: ${font.size.md}; - font-weight: ${font.weight.bold}; - line-height: ${font.lineHeight.xs}; - white-space: nowrap; - color: ${colors.gray[300]}; - `, - routerLogo: css` - font-weight: ${font.weight.semibold}; - font-size: ${font.size.xs}; - background: linear-gradient(to right, #84cc16, #10b981); - background-clip: text; - -webkit-background-clip: text; - line-height: 1; - -webkit-text-fill-color: transparent; - white-space: nowrap; - `, - devtoolsPanel: css` - display: flex; - font-size: ${fontSize.sm}; - font-family: ${fontFamily.sans}; - background-color: ${colors.darkGray[700]}; - color: ${colors.gray[300]}; - - @media (max-width: 700px) { - flex-direction: column; - } - @media (max-width: 600px) { - font-size: ${fontSize.xs}; - } - `, - dragHandle: css` - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 4px; - cursor: row-resize; - z-index: 100000; - &:hover { - background-color: ${colors.purple[400]}${alpha[90]}; - } - `, - firstContainer: css` - flex: 1 1 500px; - min-height: 40%; - max-height: 100%; - overflow: auto; - border-right: 1px solid ${colors.gray[700]}; - display: flex; - flex-direction: column; - `, - routerExplorerContainer: css` - overflow-y: auto; - flex: 1; - `, - routerExplorer: css` - padding: ${tokens.size[2]}; - `, - row: css` - display: flex; - align-items: center; - padding: ${tokens.size[2]} ${tokens.size[2.5]}; - gap: ${tokens.size[2.5]}; - border-bottom: ${colors.darkGray[500]} 1px solid; - align-items: center; - `, - detailsHeader: css` - font-family: ui-sans-serif, Inter, system-ui, sans-serif, sans-serif; - position: sticky; - top: 0; - z-index: 2; - background-color: ${colors.darkGray[600]}; - padding: 0px ${tokens.size[2]}; - font-weight: ${font.weight.medium}; - font-size: ${font.size.xs}; - min-height: ${tokens.size[8]}; - line-height: ${font.lineHeight.xs}; - text-align: left; - display: flex; - align-items: center; - `, - maskedBadge: css` - background: ${colors.yellow[900]}${alpha[70]}; - color: ${colors.yellow[300]}; - display: inline-block; - padding: ${tokens.size[0]} ${tokens.size[2.5]}; - border-radius: ${border.radius.full}; - font-size: ${font.size.xs}; - font-weight: ${font.weight.normal}; - border: 1px solid ${colors.yellow[300]}; - `, - maskedLocation: css` - color: ${colors.yellow[300]}; - `, - detailsContent: css` - padding: ${tokens.size[1.5]} ${tokens.size[2]}; - display: flex; - align-items: center; - justify-content: space-between; - font-size: ${font.size.xs}; - `, - routeMatchesToggle: css` - display: flex; - align-items: center; - border: 1px solid ${colors.gray[500]}; - border-radius: ${border.radius.sm}; - overflow: hidden; - `, - routeMatchesToggleBtn: (active: boolean, showBorder: boolean) => { - const base = css` - appearance: none; - border: none; - font-size: 12px; - padding: 4px 8px; - background: transparent; - cursor: pointer; - font-family: ${fontFamily.sans}; - font-weight: ${font.weight.medium}; - ` - const classes = [base] - - if (active) { - const activeStyles = css` - background: ${colors.darkGray[400]}; - color: ${colors.gray[300]}; - ` - classes.push(activeStyles) - } else { - const inactiveStyles = css` - color: ${colors.gray[500]}; - background: ${colors.darkGray[800]}${alpha[20]}; - ` - classes.push(inactiveStyles) - } - - if (showBorder) { - classes.push(css` - border-right: 1px solid ${tokens.colors.gray[500]}; - `) - } - - return classes - }, - detailsHeaderInfo: css` - flex: 1; - justify-content: flex-end; - display: flex; - align-items: center; - font-weight: ${font.weight.normal}; - color: ${colors.gray[400]}; - `, - matchRow: (active: boolean) => { - const base = css` - display: flex; - border-bottom: 1px solid ${colors.darkGray[400]}; - cursor: pointer; - align-items: center; - padding: ${size[1]} ${size[2]}; - gap: ${size[2]}; - font-size: ${fontSize.xs}; - color: ${colors.gray[300]}; - ` - const classes = [base] - - if (active) { - const activeStyles = css` - background: ${colors.darkGray[500]}; - ` - classes.push(activeStyles) - } - - return classes - }, - matchIndicator: ( - color: 'green' | 'red' | 'yellow' | 'gray' | 'blue' | 'purple', - ) => { - const base = css` - flex: 0 0 auto; - width: ${size[3]}; - height: ${size[3]}; - background: ${colors[color][900]}; - border: 1px solid ${colors[color][500]}; - border-radius: ${border.radius.full}; - transition: all 0.25s ease-out; - box-sizing: border-box; - ` - const classes = [base] - - if (color === 'gray') { - const grayStyles = css` - background: ${colors.gray[700]}; - border-color: ${colors.gray[400]}; - ` - classes.push(grayStyles) - } - - return classes - }, - matchID: css` - flex: 1; - line-height: ${lineHeight['xs']}; - `, - ageTicker: (showWarning: boolean) => { - const base = css` - display: flex; - gap: ${size[1]}; - font-size: ${fontSize.xs}; - color: ${colors.gray[400]}; - font-variant-numeric: tabular-nums; - line-height: ${lineHeight['xs']}; - ` - - const classes = [base] - - if (showWarning) { - const warningStyles = css` - color: ${colors.yellow[400]}; - ` - classes.push(warningStyles) - } - - return classes - }, - secondContainer: css` - flex: 1 1 500px; - min-height: 40%; - max-height: 100%; - overflow: auto; - border-right: 1px solid ${colors.gray[700]}; - display: flex; - flex-direction: column; - `, - thirdContainer: css` - flex: 1 1 500px; - overflow: auto; - display: flex; - flex-direction: column; - height: 100%; - border-right: 1px solid ${colors.gray[700]}; - - @media (max-width: 700px) { - border-top: 2px solid ${colors.gray[700]}; - } - `, - fourthContainer: css` - flex: 1 1 500px; - min-height: 40%; - max-height: 100%; - overflow: auto; - display: flex; - flex-direction: column; - `, - routesContainer: css` - overflow-x: auto; - overflow-y: visible; - `, - routesRowContainer: (active: boolean, isMatch: boolean) => { - const base = css` - display: flex; - border-bottom: 1px solid ${colors.darkGray[400]}; - align-items: center; - padding: ${size[1]} ${size[2]}; - gap: ${size[2]}; - font-size: ${fontSize.xs}; - color: ${colors.gray[300]}; - cursor: ${isMatch ? 'pointer' : 'default'}; - line-height: ${lineHeight['xs']}; - ` - const classes = [base] - - if (active) { - const activeStyles = css` - background: ${colors.darkGray[500]}; - ` - classes.push(activeStyles) - } - - return classes - }, - routesRow: (isMatch: boolean) => { - const base = css` - flex: 1 0 auto; - display: flex; - justify-content: space-between; - align-items: center; - font-size: ${fontSize.xs}; - line-height: ${lineHeight['xs']}; - ` - - const classes = [base] - - if (!isMatch) { - const matchStyles = css` - color: ${colors.gray[400]}; - ` - classes.push(matchStyles) - } - - return classes - }, - routesRowInner: css` - display: 'flex'; - align-items: 'center'; - flex-grow: 1; - min-width: 0; - `, - routeParamInfo: css` - color: ${colors.gray[400]}; - font-size: ${fontSize.xs}; - line-height: ${lineHeight['xs']}; - `, - nestedRouteRow: (isRoot: boolean) => { - const base = css` - margin-left: ${isRoot ? 0 : size[3.5]}; - border-left: ${isRoot ? '' : `solid 1px ${colors.gray[700]}`}; - ` - return base - }, - code: css` - font-size: ${fontSize.xs}; - line-height: ${lineHeight['xs']}; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - `, - matchesContainer: css` - flex: 1 1 auto; - overflow-y: auto; - `, - cachedMatchesContainer: css` - flex: 1 1 auto; - overflow-y: auto; - max-height: 50%; - `, - maskedBadgeContainer: css` - flex: 1; - justify-content: flex-end; - display: flex; - `, - matchDetails: css` - display: flex; - flex-direction: column; - padding: ${tokens.size[2]}; - font-size: ${tokens.font.size.xs}; - color: ${tokens.colors.gray[300]}; - line-height: ${tokens.font.lineHeight.sm}; - `, - matchStatus: ( - status: 'pending' | 'success' | 'error' | 'notFound' | 'redirected', - isFetching: false | 'beforeLoad' | 'loader', - ) => { - const colorMap = { - pending: 'yellow', - success: 'green', - error: 'red', - notFound: 'purple', - redirected: 'gray', - } as const - - const color = - isFetching && status === 'success' - ? isFetching === 'beforeLoad' - ? 'purple' - : 'blue' - : colorMap[status] - - return css` - display: flex; - justify-content: center; - align-items: center; - height: 40px; - border-radius: ${tokens.border.radius.sm}; - font-weight: ${tokens.font.weight.normal}; - background-color: ${tokens.colors[color][900]}${tokens.alpha[90]}; - color: ${tokens.colors[color][300]}; - border: 1px solid ${tokens.colors[color][600]}; - margin-bottom: ${tokens.size[2]}; - transition: all 0.25s ease-out; - ` - }, - matchDetailsInfo: css` - display: flex; - justify-content: flex-end; - flex: 1; - `, - matchDetailsInfoLabel: css` - display: flex; - `, - mainCloseBtn: css` - background: ${colors.darkGray[700]}; - padding: ${size[1]} ${size[2]} ${size[1]} ${size[1.5]}; - border-radius: ${border.radius.md}; - position: fixed; - z-index: 99999; - display: inline-flex; - width: fit-content; - cursor: pointer; - appearance: none; - border: 0; - gap: 8px; - align-items: center; - border: 1px solid ${colors.gray[500]}; - font-size: ${font.size.xs}; - cursor: pointer; - transition: all 0.25s ease-out; - - &:hover { - background: ${colors.darkGray[500]}; - } - `, - mainCloseBtnPosition: ( - position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right', - ) => { - const base = css` - ${position === 'top-left' ? `top: ${size[2]}; left: ${size[2]};` : ''} - ${position === 'top-right' ? `top: ${size[2]}; right: ${size[2]};` : ''} - ${position === 'bottom-left' - ? `bottom: ${size[2]}; left: ${size[2]};` - : ''} - ${position === 'bottom-right' - ? `bottom: ${size[2]}; right: ${size[2]};` - : ''} - ` - return base - }, - mainCloseBtnAnimation: (isOpen: boolean) => { - if (!isOpen) { - return css` - opacity: 1; - pointer-events: auto; - visibility: visible; - ` - } - return css` - opacity: 0; - pointer-events: none; - visibility: hidden; - ` - }, - routerLogoCloseButton: css` - font-weight: ${font.weight.semibold}; - font-size: ${font.size.xs}; - background: linear-gradient(to right, #98f30c, #00f4a3); - background-clip: text; - -webkit-background-clip: text; - line-height: 1; - -webkit-text-fill-color: transparent; - white-space: nowrap; - `, - mainCloseBtnDivider: css` - width: 1px; - background: ${tokens.colors.gray[600]}; - height: 100%; - border-radius: 999999px; - color: transparent; - `, - mainCloseBtnIconContainer: css` - position: relative; - width: ${size[5]}; - height: ${size[5]}; - background: pink; - border-radius: 999999px; - overflow: hidden; - `, - mainCloseBtnIconOuter: css` - width: ${size[5]}; - height: ${size[5]}; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - filter: blur(3px) saturate(1.8) contrast(2); - `, - mainCloseBtnIconInner: css` - width: ${size[4]}; - height: ${size[4]}; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - `, - panelCloseBtn: css` - position: absolute; - cursor: pointer; - z-index: 100001; - display: flex; - align-items: center; - justify-content: center; - outline: none; - background-color: ${colors.darkGray[700]}; - &:hover { - background-color: ${colors.darkGray[500]}; - } - - top: 0; - right: ${size[2]}; - transform: translate(0, -100%); - border-right: ${colors.darkGray[300]} 1px solid; - border-left: ${colors.darkGray[300]} 1px solid; - border-top: ${colors.darkGray[300]} 1px solid; - border-bottom: none; - border-radius: ${border.radius.sm} ${border.radius.sm} 0px 0px; - padding: ${size[1]} ${size[1.5]} ${size[0.5]} ${size[1.5]}; - - &::after { - content: ' '; - position: absolute; - top: 100%; - left: -${size[2.5]}; - height: ${size[1.5]}; - width: calc(100% + ${size[5]}); - } - `, - panelCloseBtnIcon: css` - color: ${colors.gray[400]}; - width: ${size[2]}; - height: ${size[2]}; - `, - navigateButton: css` - background: none; - border: none; - padding: 0 0 0 4px; - margin: 0; - color: ${colors.gray[400]}; - font-size: ${fontSize.md}; - cursor: pointer; - line-height: 1; - vertical-align: middle; - margin-right: 0.5ch; - flex-shrink: 0; - &:hover { - color: ${colors.blue[300]}; - } - `, - } -} - -export function useStyles() { - const shadowDomTarget = useContext(ShadowDomTargetContext) - const [_styles] = createSignal(stylesFactory(shadowDomTarget)) - return _styles -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/src/utils.tsx b/devtools-reference/tanstack-router/router-devtools-core/src/utils.tsx deleted file mode 100644 index 8e497a09e..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/src/utils.tsx +++ /dev/null @@ -1,185 +0,0 @@ -import { Dynamic } from 'solid-js/web' -import { createEffect, createRenderEffect, createSignal } from 'solid-js' -import { useTheme } from './theme' -import useMediaQuery from './useMediaQuery' -import type { AnyRoute, AnyRouteMatch } from '@tanstack/router-core' - -import type { Theme } from './theme' -import type { JSX } from 'solid-js' - -export const isServer = typeof window === 'undefined' - -type StyledComponent = T extends 'button' - ? JSX.ButtonHTMLAttributes - : T extends 'input' - ? JSX.InputHTMLAttributes - : T extends 'select' - ? JSX.SelectHTMLAttributes - : T extends keyof HTMLElementTagNameMap - ? JSX.HTMLAttributes - : never - -export function getStatusColor(match: AnyRouteMatch) { - const colorMap = { - pending: 'yellow', - success: 'green', - error: 'red', - notFound: 'purple', - redirected: 'gray', - } as const - - return match.isFetching && match.status === 'success' - ? match.isFetching === 'beforeLoad' - ? 'purple' - : 'blue' - : colorMap[match.status] -} - -export function getRouteStatusColor( - matches: Array, - route: AnyRoute, -) { - const found = matches.find((d) => d.routeId === route.id) - if (!found) return 'gray' - return getStatusColor(found) -} - -type Styles = - | JSX.CSSProperties - | ((props: Record, theme: Theme) => JSX.CSSProperties) - -export function styled( - type: T, - newStyles: Styles, - queries: Record = {}, -) { - return ({ - ref, - style, - ...rest - }: StyledComponent & { - ref?: HTMLElementTagNameMap[T] | undefined - }) => { - const theme = useTheme() - - const mediaStyles = Object.entries(queries).reduce( - (current, [key, value]) => { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - return useMediaQuery(key) - ? { - ...current, - ...(typeof value === 'function' ? value(rest, theme) : value), - } - : current - }, - {}, - ) - - const baseStyles = - typeof newStyles === 'function' ? newStyles(rest, theme) : newStyles - - // Handle style being either a string or an object - const combinedStyles = - typeof style === 'string' - ? { ...baseStyles, ...mediaStyles, cssText: style } - : { ...baseStyles, ...style, ...mediaStyles } - - return ( - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - - ) - } -} - -export function useIsMounted() { - const [isMounted, setIsMounted] = createSignal(false) - - const effect = isServer ? createEffect : createRenderEffect - - effect(() => { - setIsMounted(true) - }) - - return isMounted -} - -/** - * Displays a string regardless the type of the data - * @param {unknown} value Value to be stringified - */ -export const displayValue = (value: unknown) => { - const name = Object.getOwnPropertyNames(Object(value)) - const newValue = typeof value === 'bigint' ? `${value.toString()}n` : value - try { - return JSON.stringify(newValue, name) - } catch (e) { - return `unable to stringify` - } -} - -/** - * This hook is a safe useState version which schedules state updates in microtasks - * to prevent updating a component state while React is rendering different components - * or when the component is not mounted anymore. - */ -export function useSafeState(initialState: T): [T, (value: T) => void] { - const isMounted = useIsMounted() - const [state, setState] = createSignal(initialState) - - const safeSetState = (value: T) => { - scheduleMicrotask(() => { - if (isMounted()) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - setState(value) - } - }) - } - - return [state(), safeSetState] -} - -/** - * Schedules a microtask. - * This can be useful to schedule state updates after rendering. - */ -function scheduleMicrotask(callback: () => void) { - Promise.resolve() - .then(callback) - .catch((error) => - setTimeout(() => { - throw error - }), - ) -} - -export function multiSortBy( - arr: Array, - accessors: Array<(item: T) => any> = [(d) => d], -): Array { - return arr - .map((d, i) => [d, i] as const) - .sort(([a, ai], [b, bi]) => { - for (const accessor of accessors) { - const ao = accessor(a) - const bo = accessor(b) - - if (typeof ao === 'undefined') { - if (typeof bo === 'undefined') { - continue - } - return 1 - } - - if (ao === bo) { - continue - } - - return ao > bo ? 1 : -1 - } - - return ai - bi - }) - .map(([d]) => d) -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/tsconfig.json b/devtools-reference/tanstack-router/router-devtools-core/tsconfig.json deleted file mode 100644 index 1b802b64d..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "jsx": "preserve", - "jsxImportSource": "solid-js" - }, - "include": ["src", "vite.config.ts"] -} diff --git a/devtools-reference/tanstack-router/router-devtools-core/vite.config.ts b/devtools-reference/tanstack-router/router-devtools-core/vite.config.ts deleted file mode 100644 index a464717a1..000000000 --- a/devtools-reference/tanstack-router/router-devtools-core/vite.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { defineConfig, mergeConfig } from 'vitest/config' -import { tanstackViteConfig } from '@tanstack/config/vite' -import solid from 'vite-plugin-solid' -import type { UserConfig } from 'vitest/config' - -const config = defineConfig({ - plugins: [solid()] as UserConfig['plugins'], -}) - -export default mergeConfig( - config, - tanstackViteConfig({ - entry: './src/index.tsx', - srcDir: './src', - }), -) diff --git a/devtools-reference/tanstack-router/router-devtools/README.md b/devtools-reference/tanstack-router/router-devtools/README.md deleted file mode 100644 index 7be76f46c..000000000 --- a/devtools-reference/tanstack-router/router-devtools/README.md +++ /dev/null @@ -1,5 +0,0 @@ - - -# TanStack React Router Devtools - -See https://tanstack.com/router/latest/docs/framework/react/devtools diff --git a/devtools-reference/tanstack-router/router-devtools/eslint.config.js b/devtools-reference/tanstack-router/router-devtools/eslint.config.js deleted file mode 100644 index d6dc46cc0..000000000 --- a/devtools-reference/tanstack-router/router-devtools/eslint.config.js +++ /dev/null @@ -1,32 +0,0 @@ -// @ts-check - -import pluginReact from '@eslint-react/eslint-plugin' -// @ts-expect-error -import pluginReactHooks from 'eslint-plugin-react-hooks' -import rootConfig from '../../eslint.config.js' - -export default [ - ...rootConfig, - { - files: ['**/*.{ts,tsx}'], - ...pluginReact.configs.recommended, - }, - { - plugins: { - 'react-hooks': pluginReactHooks, - }, - rules: { - '@eslint-react/no-unstable-context-value': 'off', - '@eslint-react/no-unstable-default-props': 'off', - '@eslint-react/dom/no-missing-button-type': 'off', - 'react-hooks/exhaustive-deps': 'error', - 'react-hooks/rules-of-hooks': 'error', - }, - }, - { - files: ['**/__tests__/**'], - rules: { - '@typescript-eslint/no-unnecessary-condition': 'off', - }, - }, -] diff --git a/devtools-reference/tanstack-router/router-devtools/package.json b/devtools-reference/tanstack-router/router-devtools/package.json deleted file mode 100644 index 3da372a9f..000000000 --- a/devtools-reference/tanstack-router/router-devtools/package.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "@tanstack/router-devtools", - "version": "1.127.3", - "description": "Modern and scalable routing for React applications", - "author": "Tanner Linsley", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/TanStack/router.git", - "directory": "packages/router-devtools" - }, - "homepage": "https://tanstack.com/router", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "keywords": [ - "react", - "location", - "router", - "routing", - "async", - "async router", - "typescript" - ], - "scripts": { - "clean": "rimraf ./dist && rimraf ./coverage", - "test:eslint": "eslint ./src", - "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", - "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", - "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", - "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", - "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js", - "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js", - "test:types:ts58": "tsc", - "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .", - "build": "vite build" - }, - "type": "module", - "types": "./dist/esm/index.d.ts", - "main": "./dist/cjs/index.cjs", - "module": "./dist/esm/index.js", - "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" - }, - "sideEffects": false, - "files": [ - "dist", - "src" - ], - "engines": { - "node": ">=12" - }, - "dependencies": { - "clsx": "^2.1.1", - "goober": "^2.1.16", - "@tanstack/react-router-devtools": "workspace:^" - }, - "devDependencies": { - "@vitejs/plugin-react": "^4.3.4", - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "peerDependencies": { - "@tanstack/react-router": "workspace:^", - "csstype": "^3.0.10", - "react": ">=18.0.0 || >=19.0.0", - "react-dom": ">=18.0.0 || >=19.0.0" - }, - "peerDependenciesMeta": { - "csstype": { - "optional": true - } - } -} diff --git a/devtools-reference/tanstack-router/router-devtools/src/index.tsx b/devtools-reference/tanstack-router/router-devtools/src/index.tsx deleted file mode 100644 index 8db17e377..000000000 --- a/devtools-reference/tanstack-router/router-devtools/src/index.tsx +++ /dev/null @@ -1,6 +0,0 @@ -console.warn( - '[@tanstack/router-devtools] This package has moved to @tanstack/react-router-devtools. Please switch to the new package at your earliest convenience, as this package will be dropped in the next major version release.', -) - -export { TanStackRouterDevtoolsInProd as TanStackRouterDevtools } from '@tanstack/react-router-devtools' -export { TanStackRouterDevtoolsPanelInProd as TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools' diff --git a/devtools-reference/tanstack-router/router-devtools/tsconfig.json b/devtools-reference/tanstack-router/router-devtools/tsconfig.json deleted file mode 100644 index 2f40bc971..000000000 --- a/devtools-reference/tanstack-router/router-devtools/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "jsx": "react-jsx" - }, - "include": ["src", "vite.config.ts"] -} diff --git a/devtools-reference/tanstack-router/router-devtools/vite.config.ts b/devtools-reference/tanstack-router/router-devtools/vite.config.ts deleted file mode 100644 index 2d87d3ac1..000000000 --- a/devtools-reference/tanstack-router/router-devtools/vite.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { defineConfig, mergeConfig } from 'vitest/config' -import { tanstackViteConfig } from '@tanstack/config/vite' -import react from '@vitejs/plugin-react' -import type { UserConfig } from 'vitest/config' - -const config = defineConfig({ - plugins: [react()] as UserConfig['plugins'], -}) - -export default mergeConfig( - config, - tanstackViteConfig({ - entry: './src/index.tsx', - srcDir: './src', - }), -) diff --git a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx index a5cad2fb6..d64bd6805 100644 --- a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx +++ b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx @@ -1,9 +1,8 @@ import { clsx as cx } from "clsx" -import { Show, createMemo, createSignal, onMount } from "solid-js" +import { Show, createEffect, createMemo, createSignal } from "solid-js" import { useDevtoolsOnClose } from "./contexts" import { useStyles } from "./useStyles" import { useLocalStorage } from "./useLocalStorage" -import { POLLING_INTERVAL_MS } from "./constants" import { CollectionsPanel, Logo, @@ -88,136 +87,35 @@ export const BaseTanStackDbDevtoolsPanel = return found }) - // Poll for collections and transactions data - onMount(() => { - const updateData = () => { - if (typeof window === `undefined`) return - try { - // Update collections - const newCollections = registry().getAllCollectionMetadata() - const currentCollections = collections() + // Use reactive signals for immediate updates + createEffect(() => { + try { + // Get collections from reactive signal + const newCollections = registry().collectionsSignal() - // Only update if collections data actually changed - if (hasCollectionsChanged(currentCollections, newCollections)) { - // Patch/update instead of replace: preserve references for unchanged collections - setCollections((prev) => - newCollections.map((newCol) => { - const oldCol = prev.find((c) => c.id === newCol.id) - if ( - oldCol && - oldCol.status === newCol.status && - oldCol.size === newCol.size && - oldCol.hasTransactions === newCol.hasTransactions && - oldCol.transactionCount === newCol.transactionCount && - oldCol.type === newCol.type && - oldCol.gcTime === newCol.gcTime - // Note: We intentionally ignore lastUpdated since it changes on every poll - ) { - return oldCol // preserve reference - } else { - return newCol // use new object if changed - } - }) - ) - // Simple auto-selection: if no collection is selected and we have collections, select the first one - if (activeCollectionId() === `` && newCollections.length > 0) { - setActiveCollectionId(newCollections[0]?.id ?? ``) - } - } - - // Update transactions - const newTransactions = registry().getTransactions() - const currentTransactions = transactions() - - // Only update if transactions data actually changed - if (hasTransactionsChanged(currentTransactions, newTransactions)) { - // Patch/update instead of replace: preserve references for unchanged transactions - setTransactions((prev) => - newTransactions.map((newTx) => { - const oldTx = prev.find((t) => t.id === newTx.id) - if ( - oldTx && - oldTx.state === newTx.state && - oldTx.isPersisted === newTx.isPersisted && - oldTx.mutations.length === newTx.mutations.length && - oldTx.collectionId === newTx.collectionId - // Note: We intentionally ignore updatedAt since it might change - ) { - return oldTx // preserve reference - } else { - return newTx // use new object if changed - } - }) - ) - } - } catch { - // console.error(`Error updating collections:`, error) + // Simple auto-selection: if no collection is selected and we have collections, select the first one + if (activeCollectionId() === `` && newCollections.length > 0) { + setActiveCollectionId(newCollections[0]?.id ?? ``) } - } - updateData() - const intervalId = setInterval(updateData, POLLING_INTERVAL_MS) - return () => clearInterval(intervalId) - }) - - // Helper function to detect if collections data actually changed - const hasCollectionsChanged = ( - oldCollections: Array, - newCollections: Array - ): boolean => { - if (oldCollections.length !== newCollections.length) return true - - // Create maps for O(1) lookup by ID - const oldMap = new Map(oldCollections.map((c) => [c.id, c])) - const newMap = new Map(newCollections.map((c) => [c.id, c])) - - // Check if any collection data changed by comparing by ID - for (const [id, old] of oldMap) { - const new_ = newMap.get(id) - if (!new_) return true // Collection was removed - - if (old.status !== new_.status) return true - if (old.size !== new_.size) return true - if (old.hasTransactions !== new_.hasTransactions) return true - if (old.transactionCount !== new_.transactionCount) return true - } - // Check if any new collections were added - for (const [id] of newMap) { - if (!oldMap.has(id)) return true + // Update collections state + setCollections(newCollections) + } catch { + // console.error(`Error updating collections:`, error) } + }) - return false - } - - // Helper function to detect if transactions data actually changed - const hasTransactionsChanged = ( - oldTransactions: Array, - newTransactions: Array - ): boolean => { - if (oldTransactions.length !== newTransactions.length) return true - - // Create maps for O(1) lookup by ID - const oldMap = new Map(oldTransactions.map((t) => [t.id, t])) - const newMap = new Map(newTransactions.map((t) => [t.id, t])) - - // Check if any transaction data changed by comparing by ID - for (const [id, old] of oldMap) { - const new_ = newMap.get(id) - if (!new_) return true // Transaction was removed - - if (old.state !== new_.state) return true - if (old.isPersisted !== new_.isPersisted) return true - if (old.mutations.length !== new_.mutations.length) return true - if (old.collectionId !== new_.collectionId) return true - } + createEffect(() => { + try { + // Get transactions from reactive signal + const newTransactions = registry().transactionsSignal() - // Check if any new transactions were added - for (const [id] of newMap) { - if (!oldMap.has(id)) return true + // Update transactions state + setTransactions(newTransactions) + } catch { + // console.error(`Error updating transactions:`, error) } - - return false - } + }) return (
- {([type, collections]) => ( - 0}> + {([type, groupCollections]) => ( + 0}>
- {getGroupDisplayName(type)} ({collections.length}) + {getGroupDisplayName(type)} ({groupCollections.length})
@@ -130,7 +130,7 @@ export function CollectionsPanel({
- + {(collection) => ( Last Updated` export const DEFAULT_MUTATION_SORT_FN_NAME = `Status > Last Updated` -export const POLLING_INTERVAL_MS = 1000 // Poll every second for metadata updates export const firstBreakpoint = 1024 export const secondBreakpoint = 796 diff --git a/packages/db-devtools/src/devtools.ts b/packages/db-devtools/src/devtools.ts index c931affbe..56dba3c84 100644 --- a/packages/db-devtools/src/devtools.ts +++ b/packages/db-devtools/src/devtools.ts @@ -21,17 +21,21 @@ export function initializeDbDevtools(): void { // Initialize the registry const registry = initializeDevtoolsRegistry() - // Store the registry globally - ;(window as any).__TANSTACK_DB_DEVTOOLS__ = registry - - // Set up global registration function that collections can call - ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__ = (collection: any) => { - registry.registerCollection(collection) - } - - // Set up global unregistration function - ;(window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__ = (id: string) => { - registry.unregisterCollection(id) + // Store the registry globally under the namespaced structure + ;(window as any).__TANSTACK_DB_DEVTOOLS__ = { + ...registry, + collectionsSignal: registry.collectionsSignal, + transactionsSignal: registry.transactionsSignal, + registerCollection: (collection: any) => { + const updateCallback = registry.registerCollection(collection) + // Store the callback on the collection for later use + if (updateCallback && collection) { + collection.__devtoolsUpdateCallback = updateCallback + } + }, + unregisterCollection: (id: string) => { + registry.unregisterCollection(id) + }, } } @@ -40,15 +44,18 @@ export function initializeDbDevtools(): void { * This is automatically called by collections when they are created if devtools are enabled. */ export function registerCollection( - collection: CollectionImpl + collection: CollectionImpl | undefined ): void { if (typeof window === `undefined`) return - const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as - | DbDevtoolsRegistry - | undefined - if (registry) { - registry.registerCollection(collection) + const devtools = (window as any).__TANSTACK_DB_DEVTOOLS__ as { + registerCollection: (collection: any) => (() => void) | undefined + } + const updateCallback: (() => void) | undefined = + devtools.registerCollection(collection) + // Store the callback on the collection for later use + if (updateCallback && collection) { + ;(collection as any).__devtoolsUpdateCallback = updateCallback } } @@ -59,12 +66,10 @@ export function registerCollection( export function unregisterCollection(id: string): void { if (typeof window === `undefined`) return - const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as - | DbDevtoolsRegistry - | undefined - if (registry) { - registry.unregisterCollection(id) + const devtools = (window as any).__TANSTACK_DB_DEVTOOLS__ as { + unregisterCollection: (id: string) => void } + devtools.unregisterCollection(id) } /** @@ -75,14 +80,62 @@ export function isDevtoolsEnabled(): boolean { return !!(window as any).__TANSTACK_DB_DEVTOOLS__ } -/** - * Get the current devtools registry instance. - */ export function getDevtoolsRegistry(): DbDevtoolsRegistry | undefined { if (typeof window === `undefined`) return undefined - return (window as any).__TANSTACK_DB_DEVTOOLS__ as - | DbDevtoolsRegistry - | undefined + const devtools = (window as any).__TANSTACK_DB_DEVTOOLS__! + + // Return the registry part of the devtools object + return { + collections: devtools.collections, + collectionsSignal: devtools.collectionsSignal, + transactionsSignal: devtools.transactionsSignal, + registerCollection: devtools.registerCollection, + unregisterCollection: devtools.unregisterCollection, + getCollection: devtools.getCollection, + releaseCollection: devtools.releaseCollection, + getAllCollectionMetadata: devtools.getAllCollectionMetadata, + getCollectionMetadata: devtools.getCollectionMetadata, + updateCollectionMetadata: devtools.updateCollectionMetadata, + updateTransactions: devtools.updateTransactions, + getTransactions: devtools.getTransactions, + getTransaction: devtools.getTransaction, + getTransactionDetails: devtools.getTransactionDetails, + clearTransactionHistory: devtools.clearTransactionHistory, + onTransactionStart: devtools.onTransactionStart, + onTransactionEnd: devtools.onTransactionEnd, + cleanup: devtools.cleanup, + garbageCollect: devtools.garbageCollect, + } as DbDevtoolsRegistry +} + +/** + * Trigger a metadata update for a collection in the devtools. + * This should be called by collections when their state changes significantly. + */ +export function triggerCollectionUpdate( + collection: CollectionImpl +): void { + if (typeof window === `undefined`) return + + const updateCallback = (collection as any).__devtoolsUpdateCallback + if (typeof updateCallback === `function`) { + updateCallback() + } +} + +/** + * Trigger a transaction update for a collection in the devtools. + * This should be called by collections when their transactions change. + */ +export function triggerTransactionUpdate( + collection: CollectionImpl +): void { + if (typeof window === `undefined`) return + + const devtools = (window as any).__TANSTACK_DB_DEVTOOLS__ + if (devtools?.updateTransactions) { + devtools.updateTransactions(collection.id) + } } /** @@ -92,11 +145,9 @@ export function getDevtoolsRegistry(): DbDevtoolsRegistry | undefined { export function cleanupDevtools(): void { if (typeof window === `undefined`) return - const registry = (window as any).__TANSTACK_DB_DEVTOOLS__ as - | DbDevtoolsRegistry - | undefined - if (registry) { - registry.cleanup() + const devtools = (window as any).__TANSTACK_DB_DEVTOOLS__ + if (devtools?.cleanup) { + devtools.cleanup() delete (window as any).__TANSTACK_DB_DEVTOOLS__ } } diff --git a/packages/db-devtools/src/registry.ts b/packages/db-devtools/src/registry.ts index 17de4083b..73d02509a 100644 --- a/packages/db-devtools/src/registry.ts +++ b/packages/db-devtools/src/registry.ts @@ -1,4 +1,4 @@ -import { POLLING_INTERVAL_MS } from "./constants" +import { createSignal } from "solid-js" import type { CollectionMetadata, CollectionRegistryEntry, @@ -8,14 +8,60 @@ import type { class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { public collections = new Map() - private pollingInterval: number | null = null + + // SolidJS signals for reactive updates + private _collectionsSignal = createSignal>([]) + private _transactionsSignal = createSignal>([]) constructor() { - // Start polling for metadata updates - this.startPolling() + // No polling needed; updates are now immediate via signals + } + + // Expose signals for reactive UI updates + public get collectionsSignal() { + return this._collectionsSignal[0] + } + + public get transactionsSignal() { + return this._transactionsSignal[0] + } + + private triggerUpdate = () => { + // Update collections signal + const collectionsData = this.getAllCollectionMetadata() + this._collectionsSignal[1](collectionsData) + + // Update transactions signal + const transactionsData = this.getTransactions() + this._transactionsSignal[1](transactionsData) + } + + private triggerCollectionUpdate = (id: string) => { + // Get the current collections array + const currentCollections = this._collectionsSignal[0]() + + // Find the index of the collection to update + const index = currentCollections.findIndex((c) => c.id === id) + + if (index !== -1) { + // Get updated metadata for this specific collection + const updatedMetadata = this.getCollectionMetadata(id) + if (updatedMetadata) { + // Create a new array with the updated collection + const newCollections = [...currentCollections] + newCollections[index] = updatedMetadata + this._collectionsSignal[1](newCollections) + } + } } - registerCollection = (collection: any): void => { + private triggerTransactionUpdate = (collectionId?: string) => { + // Get updated transactions data + const updatedTransactions = this.getTransactions(collectionId) + this._transactionsSignal[1](updatedTransactions) + } + + registerCollection = (collection: any): (() => void) | undefined => { const metadata: CollectionMetadata = { id: collection.id, type: this.detectCollectionType(collection), @@ -33,10 +79,23 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { : undefined, } + // Create a callback that updates metadata for this specific collection + // This callback doesn't hold strong references to the collection + const updateCallback = () => { + this.updateCollectionMetadata(collection.id) + } + + // Create a callback that updates only transactions for this collection + const updateTransactionsCallback = () => { + this.triggerTransactionUpdate(collection.id) + } + const entry: CollectionRegistryEntry = { weakRef: new WeakRef(collection), metadata, isActive: false, + updateCallback, + updateTransactionsCallback, } this.collections.set(collection.id, entry) @@ -45,6 +104,15 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { if (this.isLiveQuery(collection)) { this.instrumentLiveQuery(collection, entry) } + + // Call the update callback immediately so devtools UI updates right away + updateCallback() + + // Trigger reactive update for immediate UI refresh + this.triggerUpdate() + + // Return the update callback for the collection to use + return updateCallback } unregisterCollection = (id: string): void => { @@ -55,6 +123,9 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { entry.isActive = false this.collections.delete(id) } + + // Trigger reactive update for immediate UI refresh + this.triggerUpdate() } getCollectionMetadata = (id: string): CollectionMetadata | undefined => { @@ -99,6 +170,31 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { return results } + updateCollectionMetadata = (id: string): void => { + const entry = this.collections.get(id) + if (!entry) return + + const collection = entry.weakRef.deref() + if (collection) { + // Update metadata with fresh data from the collection + entry.metadata.status = collection.status + entry.metadata.size = collection.size + entry.metadata.hasTransactions = collection.transactions.size > 0 + entry.metadata.transactionCount = collection.transactions.size + entry.metadata.lastUpdated = new Date() + } + + // Use efficient update that only changes the specific collection + this.triggerCollectionUpdate(id) + + // Also update transactions since they may have changed + this.triggerTransactionUpdate(id) + } + + updateTransactions = (collectionId?: string): void => { + this.triggerTransactionUpdate(collectionId) + } + getCollection = (id: string): any => { const entry = this.collections.get(id) if (!entry) return undefined @@ -190,10 +286,7 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { cleanup = (): void => { // Stop polling - if (this.pollingInterval) { - clearInterval(this.pollingInterval) - this.pollingInterval = null - } + // No polling to stop // Release all hard references for (const [_id, entry] of this.collections) { @@ -214,29 +307,6 @@ class DbDevtoolsRegistryImpl implements DbDevtoolsRegistry { } } - private startPolling = (): void => { - if (this.pollingInterval) return - - this.pollingInterval = window.setInterval(() => { - // Garbage collect dead references - this.garbageCollect() - - // Update metadata for active collections - for (const [_id, entry] of this.collections) { - if (!entry.isActive) continue // Only update metadata for inactive collections to avoid holding refs - - const collection = entry.weakRef.deref() - if (collection) { - entry.metadata.status = collection.status - entry.metadata.size = collection.size - entry.metadata.hasTransactions = collection.transactions.size > 0 - entry.metadata.transactionCount = collection.transactions.size - entry.metadata.lastUpdated = new Date() - } - } - }, POLLING_INTERVAL_MS) - } - private detectCollectionType = (collection: any): string => { // Check the new collection type marker first if (collection.config.collectionType) { @@ -276,14 +346,21 @@ export function initializeDevtoolsRegistry(): DbDevtoolsRegistry { // SSR safety check if (typeof window === `undefined`) { // Return a no-op registry for server-side rendering + const [collectionsSignal] = createSignal>([]) + const [transactionsSignal] = createSignal>([]) + return { collections: new Map(), - registerCollection: () => {}, + collectionsSignal, + transactionsSignal, + registerCollection: () => undefined, unregisterCollection: () => {}, getCollection: () => undefined, releaseCollection: () => {}, getAllCollectionMetadata: () => [], getCollectionMetadata: () => undefined, + updateCollectionMetadata: () => {}, + updateTransactions: () => {}, getTransactions: () => [], getTransaction: () => undefined, getTransactionDetails: () => undefined, diff --git a/packages/db-devtools/src/types.ts b/packages/db-devtools/src/types.ts index efcf817c1..34eaeaf99 100644 --- a/packages/db-devtools/src/types.ts +++ b/packages/db-devtools/src/types.ts @@ -75,6 +75,8 @@ export interface CollectionRegistryEntry { metadata: CollectionMetadata isActive: boolean // Whether we're currently viewing this collection (hard ref held) hardRef?: CollectionImpl // Only set when actively viewing + updateCallback?: () => void // Callback to trigger metadata update (doesn't hold strong refs) + updateTransactionsCallback?: () => void // Callback to trigger transaction update only (doesn't hold strong refs) } export interface TransactionDetails { @@ -99,13 +101,21 @@ export interface TransactionDetails { export interface DbDevtoolsRegistry { collections: Map + // SolidJS signals for reactive UI updates + collectionsSignal: () => Array + transactionsSignal: () => Array + // Registration methods - registerCollection: (collection: CollectionImpl) => void + registerCollection: ( + collection: CollectionImpl + ) => (() => void) | undefined unregisterCollection: (id: string) => void // Metadata access getCollectionMetadata: (id: string) => CollectionMetadata | undefined getAllCollectionMetadata: () => Array + updateCollectionMetadata: (id: string) => void // Trigger immediate metadata update + updateTransactions: (collectionId?: string) => void // Trigger immediate transaction update // Collection access (creates hard refs) getCollection: (id: string) => CollectionImpl | undefined diff --git a/packages/db-devtools/tsconfig.json b/packages/db-devtools/tsconfig.json index 97a82aa3a..c40804a13 100644 --- a/packages/db-devtools/tsconfig.json +++ b/packages/db-devtools/tsconfig.json @@ -8,8 +8,8 @@ "jsxImportSource": "solid-js", "module": "ESNext", "moduleResolution": "Bundler", - "target": "ES2021", - "lib": ["ES2021", "DOM"] + "target": "ES2022", + "lib": ["ES2022", "DOM"] }, "include": ["src/**/*", "*.config.ts"], "exclude": ["build", "dist", "node_modules"] diff --git a/packages/db/src/collection.ts b/packages/db/src/collection.ts index 5d5291ecd..d8550c329 100644 --- a/packages/db/src/collection.ts +++ b/packages/db/src/collection.ts @@ -25,8 +25,8 @@ export const collectionsStore = new Map>() // Check for devtools registry and register collection if available function registerWithDevtools(collection: CollectionImpl): void { if (typeof window !== `undefined`) { - if ((window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__) { - ;(window as any).__TANSTACK_DB_DEVTOOLS_REGISTER__(collection) + if ((window as any).__TANSTACK_DB_DEVTOOLS__?.registerCollection) { + ;(window as any).__TANSTACK_DB_DEVTOOLS__.registerCollection(collection) ;(collection as any).isRegisteredWithDevtools = true } else { ;(collection as any).isRegisteredWithDevtools = false @@ -34,13 +34,27 @@ function registerWithDevtools(collection: CollectionImpl): void { } } +// Helper function to trigger devtools updates +function triggerDevtoolsUpdate( + collection: CollectionImpl +): void { + if (typeof window !== `undefined`) { + const updateCallback = (collection as any).__devtoolsUpdateCallback + if (typeof updateCallback === `function`) { + updateCallback() + } + } +} + // Declare the devtools registry on window declare global { interface Window { - __TANSTACK_DB_DEVTOOLS_REGISTER__?: ( - collection: CollectionImpl - ) => void - __TANSTACK_DB_DEVTOOLS_UNREGISTER__?: (id: string) => void + __TANSTACK_DB_DEVTOOLS__?: { + registerCollection: ( + collection: CollectionImpl + ) => (() => void) | undefined + unregisterCollection: (id: string) => void + } } } @@ -327,6 +341,9 @@ export class CollectionImpl< private setStatus(newStatus: CollectionStatus): void { this.validateStatusTransition(this._status, newStatus) this._status = newStatus + + // Trigger devtools update when status changes + triggerDevtoolsUpdate(this) } /** @@ -556,9 +573,9 @@ export class CollectionImpl< // Unregister from devtools if available if ( typeof window !== `undefined` && - (window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__ + (window as any).__TANSTACK_DB_DEVTOOLS__?.unregisterCollection ) { - ;(window as any).__TANSTACK_DB_DEVTOOLS_UNREGISTER__(this.id) + ;(window as any).__TANSTACK_DB_DEVTOOLS__.unregisterCollection(this.id) this.isRegisteredWithDevtools = false } @@ -749,6 +766,9 @@ export class CollectionImpl< // Emit all events if no pending sync transactions this.emitEvents(filteredEventsBySyncStatus) } + + // Trigger devtools update after optimistic state changes + triggerDevtoolsUpdate(this) } /** @@ -1209,6 +1229,9 @@ export class CollectionImpl< this.onFirstCommitCallbacks = [] callbacks.forEach((callback) => callback()) } + + // Trigger devtools update after sync operations + triggerDevtoolsUpdate(this) } } @@ -1993,5 +2016,8 @@ export class CollectionImpl< this.capturePreSyncVisibleState() this.recomputeOptimisticState() + + // Trigger devtools update after transaction state changes + triggerDevtoolsUpdate(this) } } diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json index 7e586bab3..7875a3de7 100644 --- a/packages/db/tsconfig.json +++ b/packages/db/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "target": "ES2020", + "target": "ES2022", "module": "ESNext", "moduleResolution": "Bundler", "declaration": true, diff --git a/tsconfig.json b/tsconfig.json index 621862e89..7814866aa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -35,5 +35,5 @@ "examples/**/*.tsx", "eslint.config.mjs" ], - "exclude": ["node_modules", "devtools-reference/**"] + "exclude": ["node_modules"] } From ffb9cfc705f265d6e33aba73ffd1cea77e9f2daa Mon Sep 17 00:00:00 2001 From: Sam Willis Date: Tue, 15 Jul 2025 17:28:40 +0100 Subject: [PATCH 18/25] more --- .../src/BaseTanStackDbDevtoolsPanel.tsx | 18 +- .../src/components/CollectionDetailsPanel.tsx | 196 ++++++++++++++++++ .../src/components/DetailsPanel.tsx | 20 +- .../db-devtools/src/components/Explorer.tsx | 42 ++-- packages/db-devtools/src/components/index.ts | 18 +- packages/db-devtools/src/useStyles.tsx | 102 +++++++++ 6 files changed, 361 insertions(+), 35 deletions(-) create mode 100644 packages/db-devtools/src/components/CollectionDetailsPanel.tsx diff --git a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx index d64bd6805..2ddc6ba9b 100644 --- a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx +++ b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx @@ -4,11 +4,12 @@ import { useDevtoolsOnClose } from "./contexts" import { useStyles } from "./useStyles" import { useLocalStorage } from "./useLocalStorage" import { + CollectionDetailsPanel, CollectionsPanel, + GenericDetailsPanel, Logo, TabNavigation, TransactionsPanel, - UnifiedDetailsPanel, } from "./components" import type { Accessor, JSX } from "solid-js" import type { @@ -193,11 +194,16 @@ export const BaseTanStackDbDevtoolsPanel =
- + + + + + +
) diff --git a/packages/db-devtools/src/components/CollectionDetailsPanel.tsx b/packages/db-devtools/src/components/CollectionDetailsPanel.tsx new file mode 100644 index 000000000..d8ac93e7c --- /dev/null +++ b/packages/db-devtools/src/components/CollectionDetailsPanel.tsx @@ -0,0 +1,196 @@ +import { Show, createMemo, createSignal } from "solid-js" +import { clsx as cx } from "clsx" +import { useStyles } from "../useStyles" +import { getDevtoolsRegistry } from "../devtools" +import { Explorer } from "./Explorer" +import { TransactionsPanel } from "./TransactionsPanel" +import { GenericDetailsPanel } from "./DetailsPanel" +import type { CollectionMetadata } from "../types" +import type { Accessor } from "solid-js" + +export interface CollectionDetailsPanelProps { + activeCollection: Accessor +} + +type CollectionTab = `summary` | `config` | `state` | `transactions` | `data` + +export function CollectionDetailsPanel({ + activeCollection, +}: CollectionDetailsPanelProps) { + const styles = useStyles() + const [selectedTab, setSelectedTab] = createSignal(`summary`) + const [selectedTransaction, setSelectedTransaction] = createSignal< + string | null + >(null) + const registry = getDevtoolsRegistry() + + const collection = createMemo(() => { + const metadata = activeCollection() + if (!metadata || !registry) return null + + // Get the actual collection instance + const collectionInstance = registry.getCollection(metadata.id) + return { metadata, instance: collectionInstance } + }) + + const collectionTransactions = createMemo(() => { + const metadata = activeCollection() + if (!metadata || !registry) return [] + + return registry.getTransactions(metadata.id) + }) + + const activeTransaction = createMemo(() => { + const transactions = collectionTransactions() + const selectedId = selectedTransaction() + return transactions.find((t) => t.id === selectedId) + }) + + const tabs: Array<{ id: CollectionTab; label: string }> = [ + { id: `summary`, label: `Summary` }, + { id: `config`, label: `Config` }, + { id: `state`, label: `State` }, + { id: `transactions`, label: `Transactions` }, + { id: `data`, label: `Data` }, + ] + + const renderTabContent = () => { + const currentCollection = collection() + if (!currentCollection) return null + + const { metadata, instance } = currentCollection + + switch (selectedTab()) { + case `summary`: { + return ( + metadata} + defaultExpanded={{}} + /> + ) + } + + case `config`: { + return instance ? ( + instance.config} + defaultExpanded={{}} + /> + ) : ( +
+ Collection instance not available +
+ ) + } + + case `state`: { + if (!instance) { + return ( +
+ Collection instance not available +
+ ) + } + + const stateData = { + syncedData: instance.syncedData, + optimisticUpserts: instance.optimisticUpserts, + optimisticDeletes: instance.optimisticDeletes, + } + + return ( + stateData} + defaultExpanded={{}} + /> + ) + } + + case `transactions`: { + const transactions = collectionTransactions() + return ( +
+
+ transactions} + selectedTransaction={selectedTransaction} + onSelectTransaction={setSelectedTransaction} + /> +
+
+ `transactions` as const} + activeCollection={() => undefined} + activeTransaction={activeTransaction} + isSubPanel={true} + /> +
+
+ ) + } + + case `data`: { + return ( +
Grid view coming soon...
+ ) + } + + default: + return null + } + } + + return ( + +
+ Select a collection to view details +
+
+ } + > + {(collectionMetadata) => ( +
+
+
{collectionMetadata().id}
+
+ {tabs.map((tab) => ( + + ))} +
+
+ + {/* Tab Content */} +
+ {renderTabContent()} +
+
+ )} + + ) +} diff --git a/packages/db-devtools/src/components/DetailsPanel.tsx b/packages/db-devtools/src/components/DetailsPanel.tsx index 8d6f5869e..7feda39ec 100644 --- a/packages/db-devtools/src/components/DetailsPanel.tsx +++ b/packages/db-devtools/src/components/DetailsPanel.tsx @@ -8,6 +8,7 @@ export interface DetailsPanelProps { selectedView: Accessor<`collections` | `transactions`> activeCollection: Accessor activeTransaction: Accessor + isSubPanel?: boolean } export function DetailsPanel({ @@ -83,10 +84,11 @@ export function TransactionDetailsPanel({ ) } -export function UnifiedDetailsPanel({ +export function GenericDetailsPanel({ selectedView, activeCollection, activeTransaction, + isSubPanel = false, }: DetailsPanelProps) { const styles = useStyles() @@ -127,7 +129,13 @@ export function UnifiedDetailsPanel({ when={activeTransaction()} fallback={
-
+
Select a transaction to view details
@@ -135,7 +143,13 @@ export function UnifiedDetailsPanel({ > {(transaction) => (
-
+
Transaction {transaction().id}
diff --git a/packages/db-devtools/src/components/Explorer.tsx b/packages/db-devtools/src/components/Explorer.tsx index cab1ec490..e1a3b97ad 100644 --- a/packages/db-devtools/src/components/Explorer.tsx +++ b/packages/db-devtools/src/components/Explorer.tsx @@ -96,6 +96,9 @@ function displayValue(value: unknown): string { if (typeof value === `number`) return value.toString() if (typeof value === `boolean`) return value.toString() if (typeof value === `function`) return `function` + if (value instanceof Date) return `Date('${value.toISOString()}')` + if (value instanceof Map) return `Map(${value.size})` + if (value instanceof Set) return `Set(${value.size})` if (Array.isArray(value)) return `Array(${value.length})` if (typeof value === `object`) return `Object` return String(value) @@ -135,6 +138,23 @@ export function Explorer({ value: d, }) ) + } else if (value() instanceof Map) { + // Map + entries = Array.from((value() as Map).entries()).map( + ([key, val]) => + makeProperty({ + label: String(key), + value: val, + }) + ) + } else if (value() instanceof Set) { + // Set + entries = Array.from(value() as Set, (val, i) => + makeProperty({ + label: i.toString(), + value: val, + }) + ) } else if ( value() !== null && typeof value() === `object` && @@ -164,12 +184,11 @@ export function Explorer({ const subEntryPages = createMemo(() => chunkArray(subEntries(), pageSize)) const [expandedPages, setExpandedPages] = createSignal>([]) - const [valueSnapshot, setValueSnapshot] = createSignal(undefined) const styles = useStyles() - const refreshValueSnapshot = () => { - setValueSnapshot((value() as () => any)()) - } + // const refreshValueSnapshot = () => { + // setValueSnapshot((value() as () => any)()) + // } const handleEntry = (entry: Entry) => ( ) : type() === `function` ? ( <> - - {rest.label} 🔄{` `} - - } - value={valueSnapshot} - defaultExpanded={{}} - /> + {rest.label}: + {` `} + {displayValue(value())} ) : ( <> diff --git a/packages/db-devtools/src/components/index.ts b/packages/db-devtools/src/components/index.ts index 8ae980b9b..34f5c4d21 100644 --- a/packages/db-devtools/src/components/index.ts +++ b/packages/db-devtools/src/components/index.ts @@ -1,13 +1,11 @@ +export { CollectionsPanel } from "./CollectionsPanel" +export { DetailsPanel, GenericDetailsPanel } from "./DetailsPanel" +export { Explorer } from "./Explorer" export { Logo } from "./Logo" -export { CollectionStats } from "./CollectionStats" -export { TransactionStats } from "./TransactionStats" -export { CollectionItem } from "./CollectionItem" +export { TabNavigation } from "./TabNavigation" export { TransactionItem } from "./TransactionItem" -export { CollectionsPanel } from "./CollectionsPanel" +export { TransactionStats } from "./TransactionStats" export { TransactionsPanel } from "./TransactionsPanel" -export { - DetailsPanel, - TransactionDetailsPanel, - UnifiedDetailsPanel, -} from "./DetailsPanel" -export { TabNavigation } from "./TabNavigation" +export { CollectionItem } from "./CollectionItem" +export { CollectionStats } from "./CollectionStats" +export { CollectionDetailsPanel } from "./CollectionDetailsPanel" diff --git a/packages/db-devtools/src/useStyles.tsx b/packages/db-devtools/src/useStyles.tsx index b54d326f7..1746672ed 100644 --- a/packages/db-devtools/src/useStyles.tsx +++ b/packages/db-devtools/src/useStyles.tsx @@ -346,23 +346,57 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { background-color: ${colors.darkGray[700]}; color: ${colors.gray[300]}; width: 100%; + height: 100%; overflow-y: auto; `, detailsHeader: css` display: flex; align-items: center; + font-weight: ${font.weight.semibold}; + color: ${colors.gray[200]}; + font-size: ${fontSize.sm}; + `, + transactionHeader: css` + display: flex; + align-items: center; + padding: ${size[1.5]} ${size[2]}; + background-color: ${colors.darkGray[600]}; + border-bottom: 1px solid ${colors.gray[700]}; + font-weight: ${font.weight.semibold}; + color: ${colors.gray[200]}; + font-size: ${fontSize.sm}; + `, + transactionSubHeader: css` + display: flex; + align-items: center; + padding: ${size[1.5]} ${size[2]}; + background-color: ${colors.darkGray[600]}; + border-bottom: 1px solid ${colors.gray[700]}; + font-weight: ${font.weight.semibold}; + color: ${colors.gray[200]}; + font-size: ${fontSize.xs}; + `, + detailsHeaderRow: css` + display: flex; + align-items: center; + justify-content: space-between; padding: ${size[2]}; background-color: ${colors.darkGray[600]}; border-bottom: 1px solid ${colors.gray[700]}; font-weight: ${font.weight.semibold}; color: ${colors.gray[200]}; font-size: ${fontSize.sm}; + width: 100%; `, detailsContent: css` flex: 1; padding: ${size[2]}; overflow-y: auto; `, + detailsContentNoPadding: css` + flex: 1; + overflow-y: auto; + `, explorerContainer: css` font-family: ${fontFamily.mono}; font-size: ${fontSize.xs}; @@ -457,6 +491,74 @@ const stylesFactory = (shadowDOMTarget?: ShadowRoot) => { flex-direction: column; flex: 1; `, + noDataMessage: css` + padding: ${size[4]}; + text-align: center; + color: ${colors.gray[500]}; + font-style: italic; + `, + collectionTabNav: css` + display: flex; + gap: ${size[1]}; + `, + collectionTabBtn: css` + padding: ${size[1]} ${size[2]}; + background: transparent; + border: 1px solid ${colors.gray[600]}; + border-radius: ${border.radius.sm}; + color: ${colors.gray[400]}; + cursor: pointer; + font-size: ${fontSize.xs}; + font-weight: ${font.weight.medium}; + position: relative; + + &:hover { + background: ${colors.darkGray[500]}; + border-color: ${colors.gray[500]}; + } + `, + collectionTabBtnActive: css` + background: ${colors.blue[500]} !important; + color: ${colors.white} !important; + border-color: ${colors.blue[400]} !important; + + &:hover { + background: ${colors.blue[600]} !important; + border-color: ${colors.blue[500]} !important; + } + `, + tabBadge: css` + position: absolute; + top: -${size[0.5]}; + right: -${size[0.5]}; + background: ${colors.red[500]}; + color: ${colors.white}; + border-radius: 50%; + width: ${size[3]}; + height: ${size[3]}; + display: flex; + align-items: center; + justify-content: center; + font-size: ${fontSize.xs}; + font-weight: ${font.weight.bold}; + line-height: 1; + `, + splitPanelContainer: css` + display: flex; + width: 100%; + height: 100%; + `, + splitPanelLeft: css` + flex: 0 0 50%; + height: 100%; + border-right: 1px solid ${colors.gray[700]}; + overflow-y: auto; + `, + splitPanelRight: css` + flex: 1; + height: 100%; + overflow-y: auto; + `, } } From a20c3592a4e5189ed62bd55521596f6d0874beba Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 7 Aug 2025 22:34:00 +0000 Subject: [PATCH 19/25] Fix merge conflict in recomputeOptimisticState method call Co-authored-by: sam.willis --- packages/db/src/collection.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/db/src/collection.ts b/packages/db/src/collection.ts index 89f77a6e7..5e9137c0b 100644 --- a/packages/db/src/collection.ts +++ b/packages/db/src/collection.ts @@ -499,7 +499,7 @@ export class CollectionImpl< this.validateStatusTransition(this._status, newStatus) this._status = newStatus -// Resolve indexes when collection becomes ready + // Resolve indexes when collection becomes ready if (newStatus === `ready` && !this.isIndexesResolved) { // Resolve indexes asynchronously without blocking this.resolveAllIndexes().catch((error) => { @@ -2431,13 +2431,9 @@ export class CollectionImpl< // CRITICAL: Capture visible state BEFORE clearing optimistic state this.capturePreSyncVisibleState() -<<<<<<< HEAD - this.recomputeOptimisticState() + this.recomputeOptimisticState(false) // Trigger devtools update after transaction state changes triggerDevtoolsUpdate(this) -======= - this.recomputeOptimisticState(false) ->>>>>>> origin/main } } From 0235f0c67b534f4afa27dd0fbbdac991d80591b5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 7 Aug 2025 22:50:16 +0000 Subject: [PATCH 20/25] Add devtools events and placeholders for collection details panel Co-authored-by: sam.willis --- packages/db-devtools/package.json | 3 + .../src/components/CollectionDetailsPanel.tsx | 27 ++++++- packages/db-devtools/src/index.ts | 2 + packages/db/src/collection.ts | 3 + packages/db/src/devtools-events.ts | 80 +++++++++++++++++++ 5 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 packages/db/src/devtools-events.ts diff --git a/packages/db-devtools/package.json b/packages/db-devtools/package.json index c04c67c58..9541af3a0 100644 --- a/packages/db-devtools/package.json +++ b/packages/db-devtools/package.json @@ -80,6 +80,9 @@ "@solid-primitives/resize-observer": "^2.0.26", "@solid-primitives/storage": "^1.3.11", "@tanstack/match-sorter-utils": "^8.19.4", + "@tanstack/table-core": "^8.20.5", + "@tanstack/virtual-core": "^3.11.0", + "@tanstack/solid-db": "workspace:*", "clsx": "^2.1.1", "goober": "^2.1.16", "npm-run-all2": "^5.0.0", diff --git a/packages/db-devtools/src/components/CollectionDetailsPanel.tsx b/packages/db-devtools/src/components/CollectionDetailsPanel.tsx index d8ac93e7c..a9963dc81 100644 --- a/packages/db-devtools/src/components/CollectionDetailsPanel.tsx +++ b/packages/db-devtools/src/components/CollectionDetailsPanel.tsx @@ -8,11 +8,30 @@ import { GenericDetailsPanel } from "./DetailsPanel" import type { CollectionMetadata } from "../types" import type { Accessor } from "solid-js" +// Temporary stub types for the grid integration +// These will be replaced by @tanstack/table-core + virtualizer wiring +function DataGridPlaceholder() { + return ( +
+ Tabular grid view (TanStack Table + virtualizer) coming next +
+ ) +} + +function RawQueryPlaceholder() { + return ( +
+ Raw query/IR display for live queries coming next +
+ ) +} + export interface CollectionDetailsPanelProps { activeCollection: Accessor } type CollectionTab = `summary` | `config` | `state` | `transactions` | `data` + | `raw` export function CollectionDetailsPanel({ activeCollection, @@ -52,6 +71,7 @@ export function CollectionDetailsPanel({ { id: `state`, label: `State` }, { id: `transactions`, label: `Transactions` }, { id: `data`, label: `Data` }, + { id: `raw`, label: `Raw Query` }, ] const renderTabContent = () => { @@ -133,9 +153,10 @@ export function CollectionDetailsPanel({ } case `data`: { - return ( -
Grid view coming soon...
- ) + return + } + case `raw`: { + return } default: diff --git a/packages/db-devtools/src/index.ts b/packages/db-devtools/src/index.ts index af09fec3d..71235ab01 100644 --- a/packages/db-devtools/src/index.ts +++ b/packages/db-devtools/src/index.ts @@ -10,6 +10,8 @@ export { Explorer } from "./components/Explorer" // Main Devtools Class (follows TanStack pattern) export { TanstackDbDevtools } from "./TanstackDbDevtools" export type { TanstackDbDevtoolsConfig } from "./TanstackDbDevtools" +export type { DbDevtoolsConfig } from "./types" +export { onDevtoolsEvent } from "../../db/src/devtools-events" // Export the initialization function export { initializeDbDevtools } from "./devtools" diff --git a/packages/db/src/collection.ts b/packages/db/src/collection.ts index 5e9137c0b..3366e66c8 100644 --- a/packages/db/src/collection.ts +++ b/packages/db/src/collection.ts @@ -61,6 +61,7 @@ import type { } from "./types" import type { IndexOptions } from "./indexes/index-options.js" import type { BaseIndex, IndexResolver } from "./indexes/base-index.js" +import { emitDevtoolsEvent } from "./devtools-events" // Check for devtools registry and register collection if available function registerWithDevtools(collection: CollectionImpl): void { @@ -68,6 +69,7 @@ function registerWithDevtools(collection: CollectionImpl): void { if ((window as any).__TANSTACK_DB_DEVTOOLS__?.registerCollection) { ;(window as any).__TANSTACK_DB_DEVTOOLS__.registerCollection(collection) ;(collection as any).isRegisteredWithDevtools = true + emitDevtoolsEvent("collectionRegistered", { id: collection.id }) } else { ;(collection as any).isRegisteredWithDevtools = false } @@ -84,6 +86,7 @@ function triggerDevtoolsUpdate( updateCallback() } } + emitDevtoolsEvent("collectionUpdated", { id: collection.id }) } // Declare the devtools registry on window diff --git a/packages/db/src/devtools-events.ts b/packages/db/src/devtools-events.ts new file mode 100644 index 000000000..bad122e77 --- /dev/null +++ b/packages/db/src/devtools-events.ts @@ -0,0 +1,80 @@ +export type DevtoolsEventName = + | "collectionRegistered" + | "collectionUpdated" + | "collectionUnregistered" + | "transactionsUpdated" + +export type DevtoolsEventPayloads = { + collectionRegistered: { id: string } + collectionUpdated: { id: string } + collectionUnregistered: { id: string } + transactionsUpdated: { collectionId: string } +} + +export type DevtoolsEventListener = ( + payload: DevtoolsEventPayloads[K] +) => void + +interface DevtoolsEventBus { + on: ( + name: K, + listener: DevtoolsEventListener + ) => void + off: ( + name: K, + listener: DevtoolsEventListener + ) => void + emit: ( + name: K, + payload: DevtoolsEventPayloads[K] + ) => void +} + +function ensureGlobalBus(): DevtoolsEventBus { + const g = globalThis as any + if (!g.__TANSTACK_DB_DEVTOOLS_EVENTS__) { + const listeners = new Map>() + g.__TANSTACK_DB_DEVTOOLS_EVENTS__ = { + on: (name: DevtoolsEventName, listener: Function) => { + const set = listeners.get(name) ?? new Set() + set.add(listener) + listeners.set(name, set as Set) + }, + off: (name: DevtoolsEventName, listener: Function) => { + const set = listeners.get(name) + if (set) { + set.delete(listener) + } + }, + emit: (name: DevtoolsEventName, payload: unknown) => { + const set = listeners.get(name) + if (set) { + for (const fn of set) { + try { + fn(payload) + } catch { + // ignore listener errors + } + } + } + }, + } satisfies DevtoolsEventBus + } + return g.__TANSTACK_DB_DEVTOOLS_EVENTS__ as DevtoolsEventBus +} + +export function emitDevtoolsEvent( + name: K, + payload: DevtoolsEventPayloads[K] +): void { + ensureGlobalBus().emit(name, payload) +} + +export function onDevtoolsEvent( + name: K, + listener: DevtoolsEventListener +): () => void { + const bus = ensureGlobalBus() + bus.on(name, listener as any) + return () => bus.off(name, listener as any) +} \ No newline at end of file From 328075c158990e009205a9e2f8138dd036a14e2d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 8 Aug 2025 05:20:19 +0000 Subject: [PATCH 21/25] Add raw query IR display for devtools in collection details panel Co-authored-by: sam.willis --- .../src/components/CollectionDetailsPanel.tsx | 31 +++++++++++++++---- .../db/src/query/live-query-collection.ts | 5 +++ packages/db/src/types.ts | 5 +++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/packages/db-devtools/src/components/CollectionDetailsPanel.tsx b/packages/db-devtools/src/components/CollectionDetailsPanel.tsx index a9963dc81..58296b913 100644 --- a/packages/db-devtools/src/components/CollectionDetailsPanel.tsx +++ b/packages/db-devtools/src/components/CollectionDetailsPanel.tsx @@ -18,11 +18,13 @@ function DataGridPlaceholder() { ) } -function RawQueryPlaceholder() { +function RawQueryPlaceholder(props: { value: () => any }) { + const value = props.value + const data = () => value() return ( -
- Raw query/IR display for live queries coming next -
+
+      {JSON.stringify(data(), null, 2)}
+    
) } @@ -30,7 +32,12 @@ export interface CollectionDetailsPanelProps { activeCollection: Accessor } -type CollectionTab = `summary` | `config` | `state` | `transactions` | `data` +type CollectionTab = + | `summary` + | `config` + | `state` + | `transactions` + | `data` | `raw` export function CollectionDetailsPanel({ @@ -156,7 +163,19 @@ export function CollectionDetailsPanel({ return } case `raw`: { - return + if (!instance) + return
No instance
+ const anyInstance = instance as any + const devtools = + anyInstance.config?.__devtools ?? anyInstance.__devtools + if (!devtools?.getIR) { + return ( +
Raw query not available
+ ) + } + const ir = devtools.getIR?.() + const where = devtools.getWhereClauses?.() ?? null + return ({ ir, where })} /> } default: diff --git a/packages/db/src/query/live-query-collection.ts b/packages/db/src/query/live-query-collection.ts index 2c8957d87..61d3c947c 100644 --- a/packages/db/src/query/live-query-collection.ts +++ b/packages/db/src/query/live-query-collection.ts @@ -385,6 +385,11 @@ export function liveQueryCollectionOptions< startSync: config.startSync, // Mark as live query for devtools collectionType: `live-query` as const, + // Non-public devtools metadata hook + __devtools: { + getIR: () => query, + getWhereClauses: () => collectionWhereClausesCache, + }, } } diff --git a/packages/db/src/types.ts b/packages/db/src/types.ts index 6ab46519b..6dc6d89ac 100644 --- a/packages/db/src/types.ts +++ b/packages/db/src/types.ts @@ -402,6 +402,11 @@ export interface CollectionConfig< * @internal */ collectionType?: string + /** + * Internal Devtools metadata hook (not part of public API) + * @internal + */ + __devtools?: Record /** * Optional asynchronous handler function called before an insert operation * @param params Object containing transaction and collection information From 24f8f7f62c20e2e5cfb6baf5072a8f6eb6c7a64d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 8 Aug 2025 06:11:27 +0000 Subject: [PATCH 22/25] Refactor devtools state management using TanStack Solid DB collections Co-authored-by: sam.willis --- .../src/BaseTanStackDbDevtoolsPanel.tsx | 49 ++------- packages/db-devtools/src/state.tsx | 100 ++++++++++++++++++ packages/db-devtools/vite.config.ts | 7 +- 3 files changed, 117 insertions(+), 39 deletions(-) create mode 100644 packages/db-devtools/src/state.tsx diff --git a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx index 2ddc6ba9b..b7e061022 100644 --- a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx +++ b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx @@ -1,5 +1,5 @@ import { clsx as cx } from "clsx" -import { Show, createEffect, createMemo, createSignal } from "solid-js" +import { Show, createMemo, createSignal } from "solid-js" import { useDevtoolsOnClose } from "./contexts" import { useStyles } from "./useStyles" import { useLocalStorage } from "./useLocalStorage" @@ -17,6 +17,7 @@ import type { DbDevtoolsRegistry, TransactionDetails, } from "./types" +import { useDevtoolsCollections, useDevtoolsTransactions } from "./state" export interface BaseDbDevtoolsPanelOptions { /** @@ -70,12 +71,8 @@ export const BaseTanStackDbDevtoolsPanel = const [selectedTransaction, setSelectedTransaction] = createSignal< string | null >(null) - const [collections, setCollections] = createSignal< - Array - >([]) - const [transactions, setTransactions] = createSignal< - Array - >([]) + const collections = () => useDevtoolsCollections() + const transactions = () => useDevtoolsTransactions() // Computed values const activeCollection = createMemo(() => { @@ -88,35 +85,11 @@ export const BaseTanStackDbDevtoolsPanel = return found }) - // Use reactive signals for immediate updates - createEffect(() => { - try { - // Get collections from reactive signal - const newCollections = registry().collectionsSignal() - - // Simple auto-selection: if no collection is selected and we have collections, select the first one - if (activeCollectionId() === `` && newCollections.length > 0) { - setActiveCollectionId(newCollections[0]?.id ?? ``) - } - - // Update collections state - setCollections(newCollections) - } catch { - // console.error(`Error updating collections:`, error) - } - }) - - createEffect(() => { - try { - // Get transactions from reactive signal - const newTransactions = registry().transactionsSignal() - - // Update transactions state - setTransactions(newTransactions) - } catch { - // console.error(`Error updating transactions:`, error) - } - }) + // Auto-select first collection if none selected + const currentCollections = () => collections() ?? [] + if (activeCollectionId() === `` && currentCollections().length > 0) { + setActiveCollectionId(currentCollections()[0]?.id ?? ``) + } return (
currentCollections()} activeCollectionId={activeCollectionId} onSelectCollection={(c) => setActiveCollectionId(c.id)} /> @@ -184,7 +157,7 @@ export const BaseTanStackDbDevtoolsPanel = transactions() ?? []} selectedTransaction={selectedTransaction} onSelectTransaction={setSelectedTransaction} /> diff --git a/packages/db-devtools/src/state.tsx b/packages/db-devtools/src/state.tsx new file mode 100644 index 000000000..3f057bf37 --- /dev/null +++ b/packages/db-devtools/src/state.tsx @@ -0,0 +1,100 @@ +/** @jsxImportSource solid-js */ +import { onCleanup, onMount } from "solid-js" +import { createCollection, useLiveQuery } from "@tanstack/solid-db" +import { localOnlyCollectionOptions } from "@tanstack/db" +import { onDevtoolsEvent } from "./index" +import { getDevtoolsRegistry } from "./devtools" +import type { CollectionMetadata, TransactionDetails } from "./types" + +// Collections metadata store +const collectionsStore = createCollection( + localOnlyCollectionOptions({ + id: "__devtools-collections__", + getKey: (m) => m.id, + initialData: [], + }) +) + +// Transactions store (flattened list) +const transactionsStore = createCollection( + localOnlyCollectionOptions({ + id: "__devtools-transactions__", + getKey: (t) => t.id, + initialData: [], + }) +) + +function seedFromRegistry() { + const registry = getDevtoolsRegistry() + if (!registry) return + const metas = registry.getAllCollectionMetadata() + // Diff apply (simple replace for now) + const existingIds = new Set() + for (const meta of metas) { + existingIds.add(meta.id) + const current = collectionsStore.get(meta.id) + if (current) { + collectionsStore.update(meta.id, (draft) => Object.assign(draft, meta)) + } else { + collectionsStore.insert(meta) + } + } + // Remove deleted + for (const { id } of collectionsStore.syncedData.values()) { + if (!existingIds.has(id)) { + collectionsStore.delete(id) + } + } + + // Seed transactions + const txs = registry.getTransactions() + const txIds = new Set() + for (const tx of txs) { + txIds.add(tx.id) + const current = transactionsStore.get(tx.id) + if (current) { + transactionsStore.update(tx.id, (draft) => Object.assign(draft, tx)) + } else { + transactionsStore.insert(tx) + } + } + for (const { id } of transactionsStore.syncedData.values()) { + if (!txIds.has(id)) transactionsStore.delete(id) + } +} + +export function useDevtoolsCollections() { + // Subscribe to events and mirror registry into store + onMount(() => { + // Initial seed + seedFromRegistry() + + const offRegister = onDevtoolsEvent("collectionRegistered", () => { + seedFromRegistry() + }) + const offUpdate = onDevtoolsEvent("collectionUpdated", () => { + seedFromRegistry() + }) + const offTx = onDevtoolsEvent("transactionsUpdated", () => { + seedFromRegistry() + }) + + onCleanup(() => { + offRegister() + offUpdate() + offTx() + }) + }) + + const { data } = useLiveQuery((q) => q.from({ c: collectionsStore }).select(({ c }) => c)) + return data +} + +export function useDevtoolsTransactions() { + onMount(() => { + // keep in sync via seed + seedFromRegistry() + }) + const { data } = useLiveQuery((q) => q.from({ t: transactionsStore }).select(({ t }) => t)) + return data +} \ No newline at end of file diff --git a/packages/db-devtools/vite.config.ts b/packages/db-devtools/vite.config.ts index 7ff1ef8c4..b335ae6d7 100644 --- a/packages/db-devtools/vite.config.ts +++ b/packages/db-devtools/vite.config.ts @@ -19,7 +19,12 @@ export default defineConfig({ fileName: (format) => `index.${format === `es` ? `js` : `cjs`}`, }, rollupOptions: { - external: [`solid-js`, `solid-js/web`, `@tanstack/db`], + external: [ + `solid-js`, + `solid-js/web`, + `@tanstack/db`, + `@tanstack/solid-db`, + ], }, }, }) From 4ef2bb88cd32e718b391c3e8750397507b5fd9ae Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 8 Aug 2025 06:26:22 +0000 Subject: [PATCH 23/25] Implement DataGrid component for collection data view with editing support Co-authored-by: sam.willis --- .../src/components/CollectionDetailsPanel.tsx | 4 +- .../db-devtools/src/components/DataGrid.tsx | 162 ++++++++++++++++++ 2 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 packages/db-devtools/src/components/DataGrid.tsx diff --git a/packages/db-devtools/src/components/CollectionDetailsPanel.tsx b/packages/db-devtools/src/components/CollectionDetailsPanel.tsx index 58296b913..38b12a753 100644 --- a/packages/db-devtools/src/components/CollectionDetailsPanel.tsx +++ b/packages/db-devtools/src/components/CollectionDetailsPanel.tsx @@ -7,6 +7,7 @@ import { TransactionsPanel } from "./TransactionsPanel" import { GenericDetailsPanel } from "./DetailsPanel" import type { CollectionMetadata } from "../types" import type { Accessor } from "solid-js" +import { DataGrid } from "./DataGrid" // Temporary stub types for the grid integration // These will be replaced by @tanstack/table-core + virtualizer wiring @@ -160,7 +161,8 @@ export function CollectionDetailsPanel({ } case `data`: { - return + if (!instance) return
No instance
+ return } case `raw`: { if (!instance) diff --git a/packages/db-devtools/src/components/DataGrid.tsx b/packages/db-devtools/src/components/DataGrid.tsx new file mode 100644 index 000000000..3a807d51f --- /dev/null +++ b/packages/db-devtools/src/components/DataGrid.tsx @@ -0,0 +1,162 @@ +/** @jsxImportSource solid-js */ +import { createEffect, createMemo, createSignal, onCleanup, onMount } from "solid-js" +import { useStyles } from "../useStyles" +import { onDevtoolsEvent } from "../index" + +export interface DataGridProps { + instance: any +} + +export function DataGrid(props: DataGridProps) { + const styles = useStyles() + const [rows, setRows] = createSignal>([]) + const [limit, setLimit] = createSignal(100) + const [editingKey, setEditingKey] = createSignal(null) + const [draftRow, setDraftRow] = createSignal | null>(null) + + const fetchRows = () => { + try { + const entries = Array.from(props.instance.entries?.() ?? []) as Array<[ + any, + any, + ]> + setRows(entries) + } catch { + setRows([]) + } + } + + onMount(() => { + fetchRows() + const off = onDevtoolsEvent("collectionUpdated", ({ id }) => { + if (id === props.instance.id) fetchRows() + }) + onCleanup(off) + }) + + createEffect(() => { + // When instance changes + fetchRows() + }) + + const columns = createMemo(() => { + const first = rows()[0]?.[1] + if (!first || typeof first !== "object") return [] as Array + return Object.keys(first) + }) + + const canEdit = createMemo(() => { + const cfg = props.instance?.config + return Boolean(cfg?.onInsert || cfg?.onUpdate || cfg?.onDelete) + }) + + const visibleRows = createMemo(() => rows().slice(0, limit())) + + let containerRef: HTMLDivElement | undefined + const onScroll = () => { + if (!containerRef) return + const { scrollTop, clientHeight, scrollHeight } = containerRef + if (scrollTop + clientHeight >= scrollHeight - 200) { + setLimit((v) => v + 100) + } + } + + const startEdit = (key: any, value: any) => { + if (!canEdit()) return + setEditingKey(key) + setDraftRow({ ...value }) + } + + const cancelEdit = () => { + setEditingKey(null) + setDraftRow(null) + } + + const saveEdit = async () => { + const key = editingKey() + const draft = draftRow() + if (key == null || !draft) return + try { + props.instance.update(key, (d: any) => { + Object.assign(d, draft) + }) + cancelEdit() + } catch { + // ignore + } + } + + const removeRow = async (key: any) => { + try { + props.instance.delete(key) + } catch { + // ignore + } + } + + const updateDraftField = (field: string, value: any) => { + setDraftRow((prev) => ({ ...(prev ?? {}), [field]: value })) + } + + return ( +
+
(containerRef = el)} + onScroll={onScroll} + style={{ "max-height": "400px", overflow: "auto" }} + > + + + + + {columns().map((col) => ( + + ))} + {canEdit() ? : null} + + + + {visibleRows().map(([key, value]) => { + const isEditing = editingKey() === key + return ( + + + {columns().map((col) => ( + + ))} + {canEdit() ? ( + + ) : null} + + ) + })} + +
key{col}
{String(key)} + {isEditing ? ( + updateDraftField(col, (e.target as HTMLInputElement).value)} + style={{ width: "100%" }} + /> + ) : ( + {String(value?.[col])} + )} + + {!isEditing ? ( + + ) : ( + <> + + + + )} + +
+
+
+ ) +} \ No newline at end of file From f9d4c9085536ffaf94304b19268963751d35b416 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 8 Aug 2025 07:00:56 +0000 Subject: [PATCH 24/25] Add TypeScript types to db devtools state and components Co-authored-by: sam.willis --- .../src/BaseTanStackDbDevtoolsPanel.tsx | 6 +--- .../src/components/CollectionDetailsPanel.tsx | 10 ------- packages/db-devtools/src/state.tsx | 29 ++++++++++--------- 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx index b7e061022..e97bc5560 100644 --- a/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx +++ b/packages/db-devtools/src/BaseTanStackDbDevtoolsPanel.tsx @@ -12,11 +12,7 @@ import { TransactionsPanel, } from "./components" import type { Accessor, JSX } from "solid-js" -import type { - CollectionMetadata, - DbDevtoolsRegistry, - TransactionDetails, -} from "./types" +import type { DbDevtoolsRegistry } from "./types" import { useDevtoolsCollections, useDevtoolsTransactions } from "./state" export interface BaseDbDevtoolsPanelOptions { diff --git a/packages/db-devtools/src/components/CollectionDetailsPanel.tsx b/packages/db-devtools/src/components/CollectionDetailsPanel.tsx index 38b12a753..638bdcb9e 100644 --- a/packages/db-devtools/src/components/CollectionDetailsPanel.tsx +++ b/packages/db-devtools/src/components/CollectionDetailsPanel.tsx @@ -9,16 +9,6 @@ import type { CollectionMetadata } from "../types" import type { Accessor } from "solid-js" import { DataGrid } from "./DataGrid" -// Temporary stub types for the grid integration -// These will be replaced by @tanstack/table-core + virtualizer wiring -function DataGridPlaceholder() { - return ( -
- Tabular grid view (TanStack Table + virtualizer) coming next -
- ) -} - function RawQueryPlaceholder(props: { value: () => any }) { const value = props.value const data = () => value() diff --git a/packages/db-devtools/src/state.tsx b/packages/db-devtools/src/state.tsx index 3f057bf37..b05712ded 100644 --- a/packages/db-devtools/src/state.tsx +++ b/packages/db-devtools/src/state.tsx @@ -7,19 +7,19 @@ import { getDevtoolsRegistry } from "./devtools" import type { CollectionMetadata, TransactionDetails } from "./types" // Collections metadata store -const collectionsStore = createCollection( +const collectionsStore = createCollection( localOnlyCollectionOptions({ id: "__devtools-collections__", - getKey: (m) => m.id, + getKey: (m: CollectionMetadata) => m.id, initialData: [], }) ) // Transactions store (flattened list) -const transactionsStore = createCollection( +const transactionsStore = createCollection( localOnlyCollectionOptions({ id: "__devtools-transactions__", - getKey: (t) => t.id, + getKey: (t: TransactionDetails) => t.id, initialData: [], }) ) @@ -34,13 +34,13 @@ function seedFromRegistry() { existingIds.add(meta.id) const current = collectionsStore.get(meta.id) if (current) { - collectionsStore.update(meta.id, (draft) => Object.assign(draft, meta)) + collectionsStore.update(meta.id, (draft: CollectionMetadata) => Object.assign(draft, meta)) } else { collectionsStore.insert(meta) } } // Remove deleted - for (const { id } of collectionsStore.syncedData.values()) { + for (const { id } of collectionsStore.syncedData.values() as IterableIterator) { if (!existingIds.has(id)) { collectionsStore.delete(id) } @@ -53,18 +53,17 @@ function seedFromRegistry() { txIds.add(tx.id) const current = transactionsStore.get(tx.id) if (current) { - transactionsStore.update(tx.id, (draft) => Object.assign(draft, tx)) + transactionsStore.update(tx.id, (draft: TransactionDetails) => Object.assign(draft, tx)) } else { transactionsStore.insert(tx) } } - for (const { id } of transactionsStore.syncedData.values()) { + for (const { id } of transactionsStore.syncedData.values() as IterableIterator) { if (!txIds.has(id)) transactionsStore.delete(id) } } -export function useDevtoolsCollections() { - // Subscribe to events and mirror registry into store +export function useDevtoolsCollections(): Array { onMount(() => { // Initial seed seedFromRegistry() @@ -86,15 +85,19 @@ export function useDevtoolsCollections() { }) }) - const { data } = useLiveQuery((q) => q.from({ c: collectionsStore }).select(({ c }) => c)) + const { data } = useLiveQuery((q) => + q.from({ c: collectionsStore }).select(({ c }) => c) + ) return data } -export function useDevtoolsTransactions() { +export function useDevtoolsTransactions(): Array { onMount(() => { // keep in sync via seed seedFromRegistry() }) - const { data } = useLiveQuery((q) => q.from({ t: transactionsStore }).select(({ t }) => t)) + const { data } = useLiveQuery((q) => + q.from({ t: transactionsStore }).select(({ t }) => t) + ) return data } \ No newline at end of file From 577be89108b3fe95d70ba9908b73757d17419c6e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 9 Aug 2025 14:10:05 +0000 Subject: [PATCH 25/25] Emit devtools event for transaction state updates Co-authored-by: sam.willis --- packages/db/src/collection.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/db/src/collection.ts b/packages/db/src/collection.ts index 3366e66c8..03f2994b4 100644 --- a/packages/db/src/collection.ts +++ b/packages/db/src/collection.ts @@ -37,6 +37,7 @@ import { UpdateKeyNotFoundError, } from "./errors" import { createFilteredCallback, currentStateAsChanges } from "./change-events" +import { emitDevtoolsEvent } from "./devtools-events" import type { Transaction } from "./transactions" import type { StandardSchemaV1 } from "@standard-schema/spec" import type { SingleRowRefProxy } from "./query/builder/ref-proxy" @@ -61,7 +62,6 @@ import type { } from "./types" import type { IndexOptions } from "./indexes/index-options.js" import type { BaseIndex, IndexResolver } from "./indexes/base-index.js" -import { emitDevtoolsEvent } from "./devtools-events" // Check for devtools registry and register collection if available function registerWithDevtools(collection: CollectionImpl): void { @@ -69,7 +69,7 @@ function registerWithDevtools(collection: CollectionImpl): void { if ((window as any).__TANSTACK_DB_DEVTOOLS__?.registerCollection) { ;(window as any).__TANSTACK_DB_DEVTOOLS__.registerCollection(collection) ;(collection as any).isRegisteredWithDevtools = true - emitDevtoolsEvent("collectionRegistered", { id: collection.id }) + emitDevtoolsEvent(`collectionRegistered`, { id: collection.id }) } else { ;(collection as any).isRegisteredWithDevtools = false } @@ -86,7 +86,7 @@ function triggerDevtoolsUpdate( updateCallback() } } - emitDevtoolsEvent("collectionUpdated", { id: collection.id }) + emitDevtoolsEvent(`collectionUpdated`, { id: collection.id }) } // Declare the devtools registry on window @@ -2438,5 +2438,6 @@ export class CollectionImpl< // Trigger devtools update after transaction state changes triggerDevtoolsUpdate(this) + emitDevtoolsEvent(`transactionsUpdated`, { collectionId: this.id }) } }