diff --git a/.agents/index.md b/.agents/index.md deleted file mode 100644 index ce5a7945c..000000000 --- a/.agents/index.md +++ /dev/null @@ -1,17 +0,0 @@ -# Agent Guidelines - -TanStack.com marketing site built with TanStack Start. - -## Essentials - -- Package manager: `pnpm` -- Run `pnpm test` at end of task batches (not after every tiny change) -- Don't run builds after every change. This is a visual site; assume changes work unless reported otherwise. -- **Typesafety is paramount.** Never cast types; fix at source instead. See [typescript.md](.agents/typescript.md). - -## Topic Guides - -- [TypeScript Conventions](.agents/typescript.md): Type inference, casting rules, generic naming -- [TanStack Patterns](.agents/tanstack-patterns.md): Loaders, server functions, environment shaking -- [UI Style Guide](.agents/ui-style.md): Visual design principles for 2026 -- [Workflow](.agents/workflow.md): Build commands, debugging, Playwright diff --git a/.agents/tanstack-patterns.md b/.agents/tanstack-patterns.md deleted file mode 100644 index d0ff4e278..000000000 --- a/.agents/tanstack-patterns.md +++ /dev/null @@ -1,76 +0,0 @@ -# TanStack Patterns - -## loaderDeps Must Be Specific - -Only include properties actually used in the loader. This ensures proper cache invalidation. - -```typescript -// Bad: includes everything -loaderDeps: ({ search }) => search, -loader: async ({ deps }) => { - await fetchData({ page: deps.page, pageSize: deps.pageSize }) -} - -// Good: only what's used -loaderDeps: ({ search }) => ({ - page: search.page, - pageSize: search.pageSize, -}), -loader: async ({ deps }) => { - await fetchData({ page: deps.page, pageSize: deps.pageSize }) -} -``` - -## Loaders Are Isomorphic - -Loaders run on both server and client. They cannot directly access server-only APIs. - -```typescript -// Bad: direct server API access -loader: async () => { - const data = await fs.readFile('data.json') - return { data } -} - -// Good: call a server function -loader: async () => { - const data = await serverFn({ data: { id: '123' } }) - return { data } -} -``` - -## Environment Shaking - -TanStack Start strips any code not referenced by a `createServerFn` handler from the client build. - -- Server-only code (database, fs) is automatically excluded from client bundles -- Only code inside `createServerFn` handlers goes to server bundles -- Code outside handlers is included in both bundles - -## Importing Server Functions - -Server functions wrapped in `createServerFn` can be imported statically. Never use dynamic imports for server-only code in components. - -```typescript -// Bad: dynamic import causes bundler issues -const rolesQuery = useQuery({ - queryFn: async () => { - const { listRoles } = await import('~/utils/roles.server') - return listRoles({ data: {} }) - }, -}) - -// Good: static import -import { listRoles } from '~/utils/roles.server' - -const rolesQuery = useQuery({ - queryFn: async () => listRoles({ data: {} }), -}) -``` - -## Server-Only Import Rules - -1. `createServerFn` wrappers can be imported statically anywhere -2. Direct server-only code (database clients, fs) must only be imported: - - Inside `createServerFn` handlers - - In `*.server.ts` files diff --git a/.agents/typescript.md b/.agents/typescript.md deleted file mode 100644 index e63301ec4..000000000 --- a/.agents/typescript.md +++ /dev/null @@ -1,45 +0,0 @@ -# TypeScript Conventions - -## Avoid Type Casting - -Never cast types unless absolutely necessary. This includes: - -- Manual generic type parameters (e.g., ``) -- Type assertions using `as` -- Type assertions using `satisfies` - -## Prefer Type Inference - -Infer types by going up the logical chain: - -1. **Schema validation** as source of truth (Convex, Zod, etc.) -2. **Type inference** from function return types, API responses -3. **Fix at source** (schema, API definition, function signature) rather than casting at point of use - -```typescript -// Bad -const result = api.getData() as MyType -const value = getValue() - -// Good -const result = api.getData() // Type inferred from return type -const value = getValue() // Type inferred from implementation -``` - -## Generic Type Parameter Naming - -All generic type parameters must be prefixed with `T`. - -```typescript -// Bad -function withCapability( - handler: (user: AuthUser, ...args: Args) => R, -) { ... } - -// Good -function withCapability( - handler: (user: AuthUser, ...args: TArgs) => TReturn, -) { ... } -``` - -Common names: `T`, `TArgs`, `TReturn`, `TData`, `TError`, `TKey`, `TValue` diff --git a/.agents/ui-style.md b/.agents/ui-style.md deleted file mode 100644 index d696b3346..000000000 --- a/.agents/ui-style.md +++ /dev/null @@ -1,52 +0,0 @@ -# UI Style Guide 2026 - -## Layout - -- Fewer, well-defined containers over many small sections -- Generous spacing creates separation before adding visual effects -- Cards are acceptable when they express grouping or hierarchy - -## Corners - -- Rounded corners are standard -- Subtle radius values that feel intentional, not playful -- Avoid sharp 90-degree corners unless intentionally industrial - -## Shadows and Depth - -- Soft, low-contrast, diffused shadows -- Shadows imply separation, not elevation theatrics -- No heavy drop shadows or strong directional lighting -- One to two shadow layers max - -## Cards - -- Cards should feel grounded, not floating -- Light elevation, border plus shadow, or surface contrast -- Don't overuse cards as a default layout primitive - -## Color and Surfaces - -- Soft neutrals, off-whites, warm grays -- Surface contrast or translucency instead of strong outlines -- Glass/frosted effects acceptable when subtle and accessible - -## Interaction - -- Micro transitions reinforce spatial relationships -- Hover/focus states feel responsive, not animated -- No excessive motion or springy effects - -## Typography - -- Strong headings, calm body text -- No visual noise around content - -## What to Avoid - -- Chunky shadows -- Overly flat, sterile layouts -- Neumorphism as primary style -- Over-designed card grids - -**Summary: If depth does not improve comprehension, remove it.** diff --git a/.agents/workflow.md b/.agents/workflow.md deleted file mode 100644 index 07838ff50..000000000 --- a/.agents/workflow.md +++ /dev/null @@ -1,46 +0,0 @@ -# Workflow - -## Build Commands - -- `pnpm test`: Run at end of task batches -- `pnpm build`: Only for build/bundler issues or verifying production output -- `pnpm lint`: Check for code issues -- `dev` runs indefinitely in watch mode - -Don't build after every change. This is a visual site; assume changes work. - -## Dev Authentication - -The dev server uses the real production database and OAuth. There are no auth bypasses. - -To authenticate a dev session, the human must run: - -```sh -pnpm auth:login -``` - -This opens `tanstack.com`, completes OAuth, and saves `DEV_SESSION_TOKEN` to `.env.local`. The dev server then auto-injects that token as a session cookie on startup. - -If the user asks for help with anything requiring authentication (account pages, admin, mutations) and `DEV_SESSION_TOKEN` is not set in `.env.local`, tell them to run `pnpm auth:login` first and restart the dev server. - -## Debugging Visual Issues - -When something doesn't work or look right: - -1. Use Playwright MCP to view the page and debug visually -2. Use `pnpm build` only for build/bundler issues -3. Use `pnpm lint` for code issues - -## Playwright - -Playwright is available via `npx playwright` and should be used freely to interact with the running dev server like a human would. This includes testing, debugging, visual verification, design iteration, and general development workflows. - -Since the dev server runs with a real authenticated session (via `DEV_SESSION_TOKEN`), Playwright has full access to gated pages, account features, admin areas, and authenticated mutations — exactly as the signed-in user would. - -Common uses: - -- `npx playwright screenshot ` — capture current state of any page -- Navigate to a page, interact with elements, re-screenshot to verify changes -- Debug layout/visual issues without needing a human to look -- Verify authenticated flows end-to-end (account, showcase submissions, admin, etc.) -- Iterate on UI by screenshotting, editing, screenshotting again diff --git a/.claude/tanstack-patterns.md b/.claude/tanstack-patterns.md deleted file mode 120000 index 7335c6c22..000000000 --- a/.claude/tanstack-patterns.md +++ /dev/null @@ -1 +0,0 @@ -../.agents/tanstack-patterns.md \ No newline at end of file diff --git a/.claude/typescript.md b/.claude/typescript.md deleted file mode 120000 index bf4e25139..000000000 --- a/.claude/typescript.md +++ /dev/null @@ -1 +0,0 @@ -../.agents/typescript.md \ No newline at end of file diff --git a/.claude/ui-style.md b/.claude/ui-style.md deleted file mode 120000 index f59b7412f..000000000 --- a/.claude/ui-style.md +++ /dev/null @@ -1 +0,0 @@ -../.agents/ui-style.md \ No newline at end of file diff --git a/.claude/workflow.md b/.claude/workflow.md deleted file mode 120000 index c19e63b75..000000000 --- a/.claude/workflow.md +++ /dev/null @@ -1 +0,0 @@ -../.agents/workflow.md \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..af7fa28f8 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,5 @@ +{ + "extends": ["react-app"], + "parser": "@typescript-eslint/parser", + "plugins": ["react-hooks"] +} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index fd99b3b17..000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: tannerlinsley diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml deleted file mode 100644 index e4a484469..000000000 --- a/.github/workflows/autofix.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: autofix.ci # needed to securely identify the workflow - -on: - pull_request: - push: - branches: [main] - -concurrency: - group: ${{ github.workflow }}-${{ github.event.number || github.ref }} - cancel-in-progress: true - -permissions: - contents: read - -jobs: - autofix: - name: autofix - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v5.0.0 - with: - fetch-depth: 0 - - name: Setup Tools - uses: tanstack/config/.github/setup@main - - name: Fix formatting - run: pnpm format - - name: Apply fixes - uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 - with: - commit-message: 'ci: apply automated fixes' diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml new file mode 100644 index 000000000..0a534520b --- /dev/null +++ b/.github/workflows/pr.yaml @@ -0,0 +1,25 @@ +name: PR + +on: + pull_request: + +jobs: + pr: + name: PR + runs-on: ubuntu-latest + steps: + - name: Git Checkout + uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: pnpm + - name: Install Packages + run: pnpm install --frozen-lockfile + - name: Run Lint + run: pnpm lint + - name: Run Build + run: pnpm build diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml deleted file mode 100644 index 41aec48b4..000000000 --- a/.github/workflows/pr.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: PR - -on: - pull_request: - -jobs: - pr: - name: PR - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v5.0.0 - with: - fetch-depth: 0 - - name: Setup Tools - uses: tanstack/config/.github/setup@main - - name: Run Build - run: pnpm build - - name: Run Tests - run: pnpm test diff --git a/.github/workflows/update-tanstack-deps.yml b/.github/workflows/update-tanstack-deps.yaml similarity index 100% rename from .github/workflows/update-tanstack-deps.yml rename to .github/workflows/update-tanstack-deps.yaml diff --git a/.gitignore b/.gitignore index 0f36f54fa..acab2d4c5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ node_modules package-lock.json yarn.lock -drizzle/migrations +convex/generated .tanstack .DS_Store @@ -28,8 +28,3 @@ dist # Content Collections generated files .content-collections -test-results -.claude/CLAUDE.md -.eslintcache -.tsbuildinfo -src/routeTree.gen.ts diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100644 index 63860b5bd..000000000 --- a/.husky/pre-commit +++ /dev/null @@ -1 +0,0 @@ -pnpm husky diff --git a/.nvmrc b/.nvmrc index ae0e6a25c..c12134be3 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20.19.6 +v20.15.0 diff --git a/.prettierignore b/.prettierignore index 48a895e6e..84d40a821 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,8 +3,6 @@ **/public pnpm-lock.yaml routeTree.gen.ts +convex/_generated +convex/README.md src/blog/tanstack-db-0.1-the-embedded-client-database-for-tanstack-query.md -.content-collections -.claude -dist/** -.output/** \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index e3b414c7e..fd496a820 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,4 @@ { - "semi": false, "singleQuote": true, - "trailingComma": "all" + "semi": false } diff --git a/.tanstack-start/server-routes/routeTree.gen.ts b/.tanstack-start/server-routes/routeTree.gen.ts new file mode 100644 index 000000000..b24ca836e --- /dev/null +++ b/.tanstack-start/server-routes/routeTree.gen.ts @@ -0,0 +1,153 @@ +/* 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 Routes + +import type { + FileRoutesByPath, + CreateServerFileRoute, +} from '@tanstack/react-start/server' +import { + createServerRoute, + createServerFileRoute, +} from '@tanstack/react-start/server' + +import { ServerRoute as LibraryIdVersionDocsChar123Char125DotmdRouteImport } from './../../src/routes/$libraryId/$version.docs.{$}[.]md' +import { ServerRoute as LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRouteImport } from './../../src/routes/$libraryId/$version.docs.framework.$framework.{$}[.]md' + +// Create/Update Routes + +const rootRoute = createServerRoute() + +const LibraryIdVersionDocsChar123Char125DotmdRoute = + LibraryIdVersionDocsChar123Char125DotmdRouteImport.update({ + id: '/$libraryId/$version/docs/{$}.md', + path: '/$libraryId/$version/docs/{$}.md', + getParentRoute: () => rootRoute, + } as any) + +const LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRoute = + LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRouteImport.update({ + id: '/$libraryId/$version/docs/framework/$framework/{$}.md', + path: '/$libraryId/$version/docs/framework/$framework/{$}.md', + getParentRoute: () => rootRoute, + } as any) + +// Populate the FileRoutesByPath interface + +declare module '@tanstack/react-start/server' { + interface FileRoutesByPath { + '/$libraryId/$version/docs/{$}.md': { + id: '/$libraryId/$version/docs/{$}.md' + path: '/$libraryId/$version/docs/{$}.md' + fullPath: '/$libraryId/$version/docs/{$}.md' + preLoaderRoute: typeof LibraryIdVersionDocsChar123Char125DotmdRouteImport + parentRoute: typeof rootRoute + } + '/$libraryId/$version/docs/framework/$framework/{$}.md': { + id: '/$libraryId/$version/docs/framework/$framework/{$}.md' + path: '/$libraryId/$version/docs/framework/$framework/{$}.md' + fullPath: '/$libraryId/$version/docs/framework/$framework/{$}.md' + preLoaderRoute: typeof LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRouteImport + parentRoute: typeof rootRoute + } + } +} + +// Add type-safety to the createFileRoute function across the route tree + +declare module './../../src/routes/$libraryId/$version.docs.{$}[.]md' { + const createServerFileRoute: CreateServerFileRoute< + FileRoutesByPath['/$libraryId/$version/docs/{$}.md']['parentRoute'], + FileRoutesByPath['/$libraryId/$version/docs/{$}.md']['id'], + FileRoutesByPath['/$libraryId/$version/docs/{$}.md']['path'], + FileRoutesByPath['/$libraryId/$version/docs/{$}.md']['fullPath'], + unknown + > +} +declare module './../../src/routes/$libraryId/$version.docs.framework.$framework.{$}[.]md' { + const createServerFileRoute: CreateServerFileRoute< + FileRoutesByPath['/$libraryId/$version/docs/framework/$framework/{$}.md']['parentRoute'], + FileRoutesByPath['/$libraryId/$version/docs/framework/$framework/{$}.md']['id'], + FileRoutesByPath['/$libraryId/$version/docs/framework/$framework/{$}.md']['path'], + FileRoutesByPath['/$libraryId/$version/docs/framework/$framework/{$}.md']['fullPath'], + unknown + > +} + +// Create and export the route tree + +export interface FileRoutesByFullPath { + '/$libraryId/$version/docs/{$}.md': typeof LibraryIdVersionDocsChar123Char125DotmdRoute + '/$libraryId/$version/docs/framework/$framework/{$}.md': typeof LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRoute +} + +export interface FileRoutesByTo { + '/$libraryId/$version/docs/{$}.md': typeof LibraryIdVersionDocsChar123Char125DotmdRoute + '/$libraryId/$version/docs/framework/$framework/{$}.md': typeof LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/$libraryId/$version/docs/{$}.md': typeof LibraryIdVersionDocsChar123Char125DotmdRoute + '/$libraryId/$version/docs/framework/$framework/{$}.md': typeof LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/$libraryId/$version/docs/{$}.md' + | '/$libraryId/$version/docs/framework/$framework/{$}.md' + fileRoutesByTo: FileRoutesByTo + to: + | '/$libraryId/$version/docs/{$}.md' + | '/$libraryId/$version/docs/framework/$framework/{$}.md' + id: + | '__root__' + | '/$libraryId/$version/docs/{$}.md' + | '/$libraryId/$version/docs/framework/$framework/{$}.md' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + LibraryIdVersionDocsChar123Char125DotmdRoute: typeof LibraryIdVersionDocsChar123Char125DotmdRoute + LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRoute: typeof LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRoute +} + +const rootRouteChildren: RootRouteChildren = { + LibraryIdVersionDocsChar123Char125DotmdRoute: + LibraryIdVersionDocsChar123Char125DotmdRoute, + LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRoute: + LibraryIdVersionDocsFrameworkFrameworkChar123Char125DotmdRoute, +} + +export const routeTree = rootRoute + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/$libraryId/$version/docs/{$}.md", + "/$libraryId/$version/docs/framework/$framework/{$}.md" + ] + }, + "/$libraryId/$version/docs/{$}.md": { + "filePath": "$libraryId/$version.docs.{$}[.]md.tsx" + }, + "/$libraryId/$version/docs/framework/$framework/{$}.md": { + "filePath": "$libraryId/$version.docs.framework.$framework.{$}[.]md.tsx" + } + } +} +ROUTE_MANIFEST_END */ diff --git a/AGENTS.md b/AGENTS.md deleted file mode 120000 index 49055565e..000000000 --- a/AGENTS.md +++ /dev/null @@ -1 +0,0 @@ -.agents/index.md \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 120000 index 49055565e..000000000 --- a/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -.agents/index.md \ No newline at end of file diff --git a/README.md b/README.md index e46644d25..90cba4aac 100644 --- a/README.md +++ b/README.md @@ -19,28 +19,6 @@ pnpm dev This starts your app in development mode, rebuilding assets on file changes. -## Authentication in Development - -The dev server uses the production database and real OAuth, so dev and production behave identically. To authenticate your local session, run: - -```sh -pnpm auth:login -``` - -This opens `tanstack.com` in your browser. Sign in with GitHub or Google, and the resulting session token is saved to `.env.local` as `DEV_SESSION_TOKEN`. Restart the dev server and you will be signed in automatically. - -To authenticate against a locally running server instead: - -```sh -pnpm auth:login --url http://localhost:3000 -``` - -> [!NOTE] -> The token is a real signed session cookie tied to your production account. It expires in 30 days. Re-run `pnpm auth:login` to refresh it. - -> [!NOTE] -> If you are using an AI agent (Claude, Cursor, etc.) to help develop, run `pnpm auth:login` once before starting your session so the agent can interact with authenticated features on your behalf. - ## Editing and previewing the docs of TanStack projects locally The documentations for all TanStack projects except for `React Charts` are hosted on [https://tanstack.com](https://tanstack.com), powered by this TanStack Router app. diff --git a/agents/tasks/code-splitting-fixes.md b/agents/tasks/code-splitting-fixes.md new file mode 100644 index 000000000..6adfcc836 --- /dev/null +++ b/agents/tasks/code-splitting-fixes.md @@ -0,0 +1,37 @@ +## Code-splitting cleanup (TanStack Router warnings) + +Fix: Remove named exports from route files so they can be code-split. If symbols are needed elsewhere, move them to a non-route module (e.g., `src/components/` or `src/routes/_shared/`) and import locally. + +Checklist + +- [x] `src/routes/$libraryId/route.tsx`: remove export of `RouteForm` +- [x] `src/routes/_libraries/terms.tsx`: remove export of `RouteComp` +- [x] `src/routes/_libraries/privacy.tsx`: remove export of `RouteComp` +- [x] `src/routes/_libraries/partners.tsx`: remove export of `RouteComp` +- [x] `src/routes/_libraries/ethos.tsx`: remove export of `RouteComp` +- [x] `src/routes/_libraries/brand-guide.tsx`: remove export of `RouteComponent` +- [x] `src/routes/_libraries/blog.$.tsx`: remove export of `BlogPost` +- [x] `src/routes/_libraries/virtual.$version.index.tsx`: remove export of `RouteComp` +- [x] `src/routes/_libraries/table.$version.index.tsx`: remove export of `TableVersionIndex` +- [x] `src/routes/_libraries/store.$version.index.tsx`: remove export of `StoreVersionIndex` +- [x] `src/routes/_libraries/start.$version.index.tsx`: remove export of `VersionIndex` +- [x] `src/routes/_libraries/ranger.$version.index.tsx`: remove export of `VersionIndex` +- [x] `src/routes/_libraries/query.$version.index.tsx`: remove export of `VersionIndex` +- [x] `src/routes/_libraries/pacer.$version.index.tsx`: remove export of `PacerVersionIndex` +- [x] `src/routes/_libraries/form.$version.index.tsx`: remove export of `FormVersionIndex` +- [x] `src/routes/_libraries/devtools.$version.index.tsx`: remove export of `DevtoolsVersionIndex` +- [x] `src/routes/_libraries/db.$version.index.tsx`: remove export of `DBVersionIndex` +- [x] `src/routes/_libraries/config.$version.index.tsx`: remove export of `FormVersionIndex` + +Notes + +- If any of the above symbols are imported from other modules, migrate them to a non-route file and re-import locally. +- After edits, run the build and ensure warnings are gone. + +Open issue + +- [x] `TypeError: (intermediate value).routerEntry.getRouter is not a function` → Verified router export and build succeeded + +Additional + +- Updated `src/server/sponsors.ts` to use `setResponseHeaders` API for headers. diff --git a/agents/tasks/tanstack-com-task-list.md b/agents/tasks/tanstack-com-task-list.md new file mode 100644 index 000000000..3a9509a8c --- /dev/null +++ b/agents/tasks/tanstack-com-task-list.md @@ -0,0 +1,252 @@ +## TanStack.com Task Tracker + +- Updated: 2025-08-14 +- Scope: Marketing/brand site tasks that signal growth, leadership, and commercial readiness without deep implementation in this file. +- Convention: + - Status: Backlog | In Progress | Blocked | Done | Partial + - Owners: GitHub handles or team names + - Links: PRs, issues, routes, components + +### How to use this file + +- Update status/notes as tasks progress. Keep routes/components and data sources referenced so any agent can continue seamlessly. +- Prefer reusing existing components and content models referenced below. + +--- + +## 1. Metrics & Market Leadership Signals + +**Goal:** Visible proof of dominance and growth. + +### Audit snapshot + +- Homepage metrics: `OpenSourceStats` counters present on homepage (`src/routes/_libraries/index.tsx` uses `OpenSourceStats`). Partial. +- "Trusted By": Component exists as text marquee (`src/components/TrustedByMarquee.tsx`). Not on homepage yet; currently used on some library pages (e.g. `src/routes/_libraries/table.$version.index.tsx`). Partial. +- NPM stats: Extensive interactive page exists at `src/routes/stats/npm/index.tsx` with charts and comparisons. Done (separate page). +- Backend metrics: `convex/stats.ts` + `@erquhart/convex-oss-stats` provides GitHub/NPM org metrics; `OpenSourceStats.tsx` consumes `api.stats.getGithubOwner`, `api.stats.getNpmOrg`. Done for aggregate; per-library not yet surfaced. + +### Tasks + +- [ ] Implement “Trusted By” on homepage + + - Status: Backlog + - Notes: + - Reuse `TrustedByMarquee` but upgrade to support logos + links + tooltip proof. + - Create a central data source `src/data/trustedBy.ts` (or `content/trusted-by.json`) with: `{ id, name, logoLight, logoDark, link, proofUrl, proofType }`. + - Only include publicly confirmed adopters; store proof URLs (tweets, case studies, repos). + - Add hover tooltips with proof text and click-through to proof. + - Placement: in `src/routes/_libraries/index.tsx`, below the hero and above library grid. + - Acceptance: + - Renders without CLS, loops smoothly, accessible (ARIA, alt text). Logos swap dark/light. + - All entries have a proof link; no unverified brands. + - Links: `src/components/TrustedByMarquee.tsx`, `src/routes/_libraries/index.tsx`. + - Owner: + +- [ ] Add Real-Time Metrics Counters (per-library + org rollup) + + - Status: Partial (org rollup live via `OpenSourceStats`) + - Notes: + - Extend counters to per-library pages using existing Convex endpoints or add repo-level endpoints via `convex-oss-stats` if needed. + - Display: npm weekly/monthly downloads and GitHub stars per library. + - Consider compact display component `components/MetricsBadge.tsx` (new) for reuse. + - Performance: hydrate safely (avoid locale formatting mismatch noted in `OpenSourceStats.tsx`). + - Acceptance: + - Per-library counters render on each library landing page (e.g., `query.$version.index.tsx`, etc.). + - Numbers update without layout shift; links to npm and GitHub. + - Links: `src/components/OpenSourceStats.tsx`, `convex/stats.ts`, library routes under `src/routes/_libraries/*.$version.index.tsx`. + - Owner: + +- [ ] Create “State of TanStack” page + - Status: Backlog + - Notes: + - Route: `src/routes/state-of-tanstack.tsx`. + - Include growth charts (npm downloads: reuse `NpmStatsChart.tsx` or embed portions of `stats/npm`), GitHub stars, contributors, dependents (available via Convex aggregation already powering `OpenSourceStats`). + - Community stats: Discord members (needs server function), newsletter subscribers (manual or vendor API), X/Twitter followers (manual or API), repository contributors (Convex or GitHub GraphQL on server). + - Ecosystem counts: partners (derive from `src/utils/partners.tsx`), plugins/tools (manual list or content collection). + - CTA to GitHub org. + - Acceptance: + - Page loads instantly with cached metrics; charts are responsive and accessible. + - Sources and last-updated timestamps shown. + - Links: `src/components/NpmStatsChart.tsx`, `src/components/OpenSourceStats.tsx`, `src/routes/stats/npm/index.tsx`, `src/utils/partners.tsx`. + - Owner: + +### Tech/context + +- Data: `@erquhart/convex-oss-stats` via `convex/stats.ts` (org-level GitHub star/contributor/dependent counts, npm downloads). Consider adding per-repo endpoints if needed. +- Secrets: Configure any tokens via Netlify/Convex env; never expose client-side. +- Accessibility: Ensure counters/animations are readable and respect `prefers-reduced-motion`. + +--- + +## 2. Founder & Team Story + +**Goal:** Frame the team as visionary and credible. + +### Audit snapshot + +- Ethos page exists: `src/routes/_libraries/ethos.tsx` (narrative and positioning). +- Maintainers directory page exists: `src/routes/_libraries/maintainers.tsx` with `MaintainerCard` variants and filters; bios sourced from `src/libraries/maintainers`. +- No dedicated "About" route; no speaking engagements index; no curated endorsements/tweets. + +### Tasks + +- [ ] Redesign/Create “About” page + + - Status: Backlog + - Notes: + - Route: `src/routes/about.tsx`. + - Include founder bio (photo, key achievements, notable talks), milestones timeline, and key contributor mini-bios (reuse `MaintainerCard` in compact mode). + - Timeline: create `src/data/milestones.ts` (date, title, link, type: release/adoption/partnership). + - Acceptance: Page showcases founder, timeline, top contributors; links to `maintainers` page. + - Links: `src/components/MaintainerCard.tsx`, `src/routes/_libraries/maintainers.tsx`. + +- [ ] Speaking Engagements section + + - Status: Backlog + - Notes: + - Add to About or standalone `src/routes/speaking.tsx`. + - Data: `src/data/talks.ts` with title, event, date, videoUrl, slidesUrl, tags. + - Embed YouTube/Vimeo or slides (oEmbed). + - Acceptance: Grid/list of talks with playable embeds and links. + +- [ ] Highlight Industry Influence (quotes + tweets) + - Status: Backlog + - Notes: + - Quotes: `src/data/endorsements.ts` with person, title, quote, avatar, link. + - Tweets: a curated list using embed script by URL to avoid API complexity; if API required, add server function with token. + - Component: `components/Endorsements.tsx` and `components/TweetsWall.tsx` (new). + - Acceptance: Renders endorsements with attribution and embedded tweets with proper theming. + +### Tech/context + +- Reuse `MaintainerCard` and existing images in `src/images/`. +- Avoid fetching social embeds at build if rate-limited; hydrate on client or cache server-side. + +--- + +## 4. Commercial Hooks + +**Goal:** Show monetizable pathways. + +### Audit snapshot + +- Enterprise/Support: `src/routes/_libraries/paid-support.tsx` exists with HubSpot script and CTAs. Partial substitute for "Enterprise" page. +- No dedicated Partner Program page. + +### Tasks + +- [ ] “Enterprise” page + + - Status: Partial + - Notes: + - Option 1: Rename and expand `paid-support` into `enterprise` (route alias + updated copy) while keeping legacy route. + - Content: packages, priority support, consulting, integration assistance; lead capture form (HubSpot already wired via `useScript`). + - Acceptance: Clear tiers/benefits, contact CTA, form submission tracked. + - Links: `src/routes/_libraries/paid-support.tsx`. + +- [ ] Partner Program page + - Status: Backlog + - Notes: + - Route: `src/routes/partners-program.tsx`. + - Tiers: Integration Partner, Strategic Partner; benefits: co-marketing, spotlight, early access. + - Link to Partners page. + - Acceptance: Published page with clear application CTA. + +--- + +## 5. Future Vision Page + +**Goal:** Show long-term upside. + +### Audit snapshot + +- No public roadmap found; ethos narrative exists but not a vision statement page. + +### Tasks + +- [ ] Public Roadmap page + + - Status: Backlog + - Notes: + - Route: `src/routes/roadmap.tsx`. + - Source: GitHub Projects (read-only) or Notion API (curated). Avoid sensitive IP; create server fetch with caching. + - Columns: Now, Next, Future. + - Acceptance: Roadmap renders from source with manual override fallback. + +- [ ] Vision Statement page + - Status: Backlog + - Notes: + - Route: `src/routes/vision.tsx`. + - Narrative: “The Future of Web Tooling”; diagrams showing TanStack as connective tissue. + - Assets: add diagrams to `public/vision/*` or `media/`. + - Acceptance: Page published with visuals and links to roadmap. + +--- + +## 6. Media & Momentum + +**Goal:** Make hype and credibility easy to digest. + +### Audit snapshot + +- No dedicated media kit, in-the-news, or social proof feeds found. + +### Tasks + +- [ ] Press/Media Kit page + + - Status: Backlog + - Notes: + - Route: `src/routes/media-kit.tsx`. + - Include logo assets (light/dark SVG/PNG), founder bio, product screenshots, downloadable one-pager PDF/zip. + - Store assets under `public/brand/*` or `media/` and provide usage guidelines. + - Acceptance: Page provides direct downloads and usage rules. + +- [ ] In the News page + + - Status: Backlog + - Notes: + - Route: `src/routes/news.tsx`. + - Data: `src/data/news.ts` with `{ year, outlet, title, url, logo }`. + - Group by year with outlet logos. + - Acceptance: List renders with working links; new items easy to add. + +- [ ] Social Proof section + - Status: Backlog + - Notes: + - Component: `components/SocialProof.tsx` (new) consuming curated data `src/data/social-proof.ts` (tweets, GH discussions, testimonials). + - Tweets: prefer embed by URL; if API needed, add server function and cache. + - Acceptance: Mixed feed renders, accessible, themable. + +--- + +### Shared implementation notes + +- Routing: New pages should be added under `src/routes/*` using TanStack Start conventions; update nav/footers as needed. +- Data placement: Prefer `src/data/*.ts` (typed) or `content/*.(json|yaml)` for editorial lists. Avoid hardcoding in components unless small. +- Theming: Provide dark/light logo variants; `public/` is ideal for static assets. +- Performance: Use suspense-friendly server fetches and cache. Respect `prefers-reduced-motion` for marquees/counters. +- Accessibility: Alt text for logos, focus states for carousels, keyboard operability. +- SEO: Use `utils/seo` to set titles/descriptions on new routes. +- Analytics: Add outbound link tracking if available (future). + +### Potential blockers + +- External API limits (GitHub GraphQL, Discord member count, X/Twitter API). Prefer server-side fetch with caching or public embed widgets. +- Legal/branding approvals for “Trusted By” logos—require proof links. + +### Quick links to relevant code + +- Homepage: `src/routes/_libraries/index.tsx` +- Metrics: `src/components/OpenSourceStats.tsx`, `convex/stats.ts`, `src/components/NpmStatsChart.tsx`, `src/routes/stats/npm/index.tsx` +- Trusted By: `src/components/TrustedByMarquee.tsx` +- Team/Ethos: `src/routes/_libraries/ethos.tsx`, `src/routes/_libraries/maintainers.tsx`, `src/components/MaintainerCard.tsx` +- SEO helper: `src/utils/seo` + +### Ownership & tracking + +- For each task above, fill in: + - Owner: + - Issue/PR links: + - Status: + - Next step: diff --git a/content-collections.ts b/content-collections.ts index 1ef0f4a10..577e5172a 100644 --- a/content-collections.ts +++ b/content-collections.ts @@ -8,22 +8,15 @@ const posts = defineCollection({ schema: (z) => ({ title: z.string(), published: z.string().date(), - draft: z.boolean().optional(), authors: z.string().array(), }), transform: ({ content, ...post }) => { const frontMatter = extractFrontMatter(content) - - // Extract header image (first image after frontmatter) - const headerImageMatch = content.match(/!\[([^\]]*)\]\(([^)]+)\)/) - const headerImage = headerImageMatch ? headerImageMatch[2] : undefined - return { ...post, slug: post._meta.path, excerpt: frontMatter.excerpt, description: frontMatter.data.description, - headerImage, content, } }, diff --git a/convex/README.md b/convex/README.md new file mode 100644 index 000000000..4d82e1363 --- /dev/null +++ b/convex/README.md @@ -0,0 +1,90 @@ +# Welcome to your Convex functions directory! + +Write your Convex functions here. +See https://docs.convex.dev/functions for more. + +A query function that takes two arguments looks like: + +```ts +// functions.js +import { query } from "./_generated/server"; +import { v } from "convex/values"; + +export const myQueryFunction = query({ + // Validators for arguments. + args: { + first: v.number(), + second: v.string(), + }, + + // Function implementation. + handler: async (ctx, args) => { + // Read the database as many times as you need here. + // See https://docs.convex.dev/database/reading-data. + const documents = await ctx.db.query("tablename").collect(); + + // Arguments passed from the client are properties of the args object. + console.log(args.first, args.second); + + // Write arbitrary JavaScript here: filter, aggregate, build derived data, + // remove non-public properties, or create new objects. + return documents; + }, +}); +``` + +Using this query function in a React component looks like: + +```ts +const data = useQuery(api.functions.myQueryFunction, { + first: 10, + second: "hello", +}); +``` + +A mutation function looks like: + +```ts +// functions.js +import { mutation } from "./_generated/server"; +import { v } from "convex/values"; + +export const myMutationFunction = mutation({ + // Validators for arguments. + args: { + first: v.string(), + second: v.string(), + }, + + // Function implementation. + handler: async (ctx, args) => { + // Insert or modify documents in the database here. + // Mutations can also read from the database like queries. + // See https://docs.convex.dev/database/writing-data. + const message = { body: args.first, author: args.second }; + const id = await ctx.db.insert("messages", message); + + // Optionally, return a value from your mutation. + return await ctx.db.get(id); + }, +}); +``` + +Using this mutation function in a React component looks like: + +```ts +const mutation = useMutation(api.functions.myMutationFunction); +function handleButtonPress() { + // fire and forget, the most common way to use mutations + mutation({ first: "Hello!", second: "me" }); + // OR + // use the result once the mutation has completed + mutation({ first: "Hello!", second: "me" }).then((result) => + console.log(result), + ); +} +``` + +Use the Convex CLI to push your functions to a deployment. See everything +the Convex CLI can do by running `npx convex -h` in your project root +directory. To learn more, launch the docs with `npx convex docs`. diff --git a/convex/_generated/api.d.ts b/convex/_generated/api.d.ts new file mode 100644 index 000000000..1c6f029a4 --- /dev/null +++ b/convex/_generated/api.d.ts @@ -0,0 +1,2362 @@ +/* eslint-disable */ +/** + * Generated `api` utility. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import type * as auth from "../auth.js"; +import type * as http from "../http.js"; +import type * as stats from "../stats.js"; +import type * as users from "../users.js"; + +import type { + ApiFromModules, + FilterApi, + FunctionReference, +} from "convex/server"; + +/** + * A utility for referencing Convex functions in your app's API. + * + * Usage: + * ```js + * const myFunctionReference = api.myModule.myFunction; + * ``` + */ +declare const fullApi: ApiFromModules<{ + auth: typeof auth; + http: typeof http; + stats: typeof stats; + users: typeof users; +}>; +declare const fullApiWithMounts: typeof fullApi; + +export declare const api: FilterApi< + typeof fullApiWithMounts, + FunctionReference +>; +export declare const internal: FilterApi< + typeof fullApiWithMounts, + FunctionReference +>; + +export declare const components: { + ossStats: { + github: { + getGithubOwners: FunctionReference< + "query", + "internal", + { owners: Array }, + Array + >; + getGithubRepo: FunctionReference< + "query", + "internal", + { name: string }, + null | { + contributorCount: number; + dependentCount: number; + dependentCountPrevious?: { count: number; updatedAt: number }; + dependentCountUpdatedAt?: number; + name: string; + nameNormalized: string; + owner: string; + ownerNormalized: string; + starCount: number; + updatedAt: number; + } + >; + getGithubRepos: FunctionReference< + "query", + "internal", + { names: Array }, + Array + >; + updateGithubOwner: FunctionReference< + "mutation", + "internal", + { name: string }, + any + >; + updateGithubOwnerStats: FunctionReference< + "action", + "internal", + { githubAccessToken: string; owner: string; page?: number }, + any + >; + updateGithubRepoStars: FunctionReference< + "mutation", + "internal", + { name: string; owner: string; starCount: number }, + any + >; + updateGithubRepoStats: FunctionReference< + "action", + "internal", + { githubAccessToken: string; repo: string }, + any + >; + updateGithubRepos: FunctionReference< + "mutation", + "internal", + { + repos: Array<{ + contributorCount: number; + dependentCount: number; + name: string; + owner: string; + starCount: number; + }>; + }, + any + >; + }; + lib: { + clearAndSync: FunctionReference< + "action", + "internal", + { + githubAccessToken: string; + githubOwners?: Array; + githubRepos?: Array; + minStars?: number; + npmOrgs?: Array; + npmPackages?: Array; + }, + any + >; + clearPage: FunctionReference< + "mutation", + "internal", + { tableName: "githubRepos" | "npmPackages" }, + { isDone: boolean } + >; + clearTable: FunctionReference< + "action", + "internal", + { tableName: "githubRepos" | "npmPackages" }, + null + >; + sync: FunctionReference< + "action", + "internal", + { + githubAccessToken: string; + githubOwners?: Array; + githubRepos?: Array; + minStars?: number; + npmOrgs?: Array; + npmPackages?: Array; + }, + null + >; + }; + npm: { + getNpmOrgs: FunctionReference< + "query", + "internal", + { names: Array }, + Array; + downloadCount: number; + downloadCountUpdatedAt: number; + name: string; + updatedAt: number; + }> + >; + getNpmPackage: FunctionReference< + "query", + "internal", + { name: string }, + null | { + dayOfWeekAverages: Array; + downloadCount: number; + downloadCountUpdatedAt?: number; + name: string; + org?: string; + updatedAt: number; + } + >; + getNpmPackages: FunctionReference< + "query", + "internal", + { names: Array }, + { + dayOfWeekAverages: Array; + downloadCount: number; + downloadCountUpdatedAt: number; + updatedAt: number; + } + >; + updateNpmOrg: FunctionReference< + "mutation", + "internal", + { name: string }, + any + >; + updateNpmOrgStats: FunctionReference< + "action", + "internal", + { org: string; page?: number }, + any + >; + updateNpmPackage: FunctionReference< + "mutation", + "internal", + { + dayOfWeekAverages: Array; + downloadCount: number; + name: string; + }, + any + >; + updateNpmPackageStats: FunctionReference< + "action", + "internal", + { name: string }, + any + >; + updateNpmPackagesForOrg: FunctionReference< + "mutation", + "internal", + { + org: string; + packages: Array<{ + dayOfWeekAverages: Array; + downloadCount: number; + isNotFound?: boolean; + name: string; + }>; + }, + any + >; + }; + }; + betterAuth: { + adapterTest: { + count: FunctionReference<"query", "internal", any, any>; + create: FunctionReference<"mutation", "internal", any, any>; + delete: FunctionReference<"mutation", "internal", any, any>; + deleteMany: FunctionReference<"mutation", "internal", any, any>; + findMany: FunctionReference<"query", "internal", any, any>; + findOne: FunctionReference<"query", "internal", any, any>; + isAuthenticated: FunctionReference<"query", "internal", {}, any>; + update: FunctionReference<"mutation", "internal", any, any>; + updateMany: FunctionReference<"mutation", "internal", any, any>; + }; + lib: { + create: FunctionReference< + "mutation", + "internal", + { + input: + | { + data: { + banExpires?: null | number; + banReason?: null | string; + banned?: null | boolean; + createdAt: number; + displayUsername?: null | string; + email: string; + emailVerified: boolean; + image?: null | string; + isAnonymous?: null | boolean; + name: string; + phoneNumber?: null | string; + phoneNumberVerified?: null | boolean; + role?: null | string; + stripeCustomerId?: null | string; + teamId?: null | string; + twoFactorEnabled?: null | boolean; + updatedAt: number; + userId?: null | string; + username?: null | string; + }; + model: "user"; + } + | { + data: { + activeOrganizationId?: null | string; + activeTeamId?: null | string; + createdAt: number; + expiresAt: number; + impersonatedBy?: null | string; + ipAddress?: null | string; + token: string; + updatedAt: number; + userAgent?: null | string; + userId: string; + }; + model: "session"; + } + | { + data: { + accessToken?: null | string; + accessTokenExpiresAt?: null | number; + accountId: string; + createdAt: number; + idToken?: null | string; + password?: null | string; + providerId: string; + refreshToken?: null | string; + refreshTokenExpiresAt?: null | number; + scope?: null | string; + updatedAt: number; + userId: string; + }; + model: "account"; + } + | { + data: { + createdAt: number; + expiresAt: number; + identifier: string; + updatedAt: number; + value: string; + }; + model: "verification"; + } + | { + data: { backupCodes: string; secret: string; userId: string }; + model: "twoFactor"; + } + | { + data: { + aaguid?: null | string; + backedUp: boolean; + counter: number; + createdAt?: null | number; + credentialID: string; + deviceType: string; + name?: null | string; + publicKey: string; + transports?: null | string; + userId: string; + }; + model: "passkey"; + } + | { + data: { + createdAt: number; + enabled?: null | boolean; + expiresAt?: null | number; + key: string; + lastRefillAt?: null | number; + lastRequest?: null | number; + metadata?: null | string; + name?: null | string; + permissions?: null | string; + prefix?: null | string; + rateLimitEnabled?: null | boolean; + rateLimitMax?: null | number; + rateLimitTimeWindow?: null | number; + refillAmount?: null | number; + refillInterval?: null | number; + remaining?: null | number; + requestCount?: null | number; + start?: null | string; + updatedAt: number; + userId: string; + }; + model: "apikey"; + } + | { + data: { + clientId?: null | string; + clientSecret?: null | string; + createdAt?: null | number; + disabled?: null | boolean; + icon?: null | string; + metadata?: null | string; + name?: null | string; + redirectURLs?: null | string; + type?: null | string; + updatedAt?: null | number; + userId?: null | string; + }; + model: "oauthApplication"; + } + | { + data: { + accessToken?: null | string; + accessTokenExpiresAt?: null | number; + clientId?: null | string; + createdAt?: null | number; + refreshToken?: null | string; + refreshTokenExpiresAt?: null | number; + scopes?: null | string; + updatedAt?: null | number; + userId?: null | string; + }; + model: "oauthAccessToken"; + } + | { + data: { + clientId?: null | string; + consentGiven?: null | boolean; + createdAt?: null | number; + scopes?: null | string; + updatedAt?: null | number; + userId?: null | string; + }; + model: "oauthConsent"; + } + | { + data: { + createdAt: number; + name: string; + organizationId: string; + updatedAt?: null | number; + }; + model: "team"; + } + | { + data: { + createdAt?: null | number; + teamId: string; + userId: string; + }; + model: "teamMember"; + } + | { + data: { + createdAt: number; + logo?: null | string; + metadata?: null | string; + name: string; + slug?: null | string; + }; + model: "organization"; + } + | { + data: { + createdAt: number; + organizationId: string; + role: string; + userId: string; + }; + model: "member"; + } + | { + data: { + email: string; + expiresAt: number; + inviterId: string; + organizationId: string; + role?: null | string; + status: string; + teamId?: null | string; + }; + model: "invitation"; + } + | { + data: { + domain: string; + issuer: string; + oidcConfig?: null | string; + organizationId?: null | string; + providerId: string; + samlConfig?: null | string; + userId?: null | string; + }; + model: "ssoProvider"; + } + | { + data: { + createdAt: number; + privateKey: string; + publicKey: string; + }; + model: "jwks"; + } + | { + data: { + cancelAtPeriodEnd?: null | boolean; + periodEnd?: null | number; + periodStart?: null | number; + plan: string; + referenceId: string; + seats?: null | number; + status?: null | string; + stripeCustomerId?: null | string; + stripeSubscriptionId?: null | string; + trialEnd?: null | number; + trialStart?: null | number; + }; + model: "subscription"; + } + | { + data: { + address: string; + chainId: number; + createdAt: number; + isPrimary?: null | boolean; + userId: string; + }; + model: "walletAddress"; + } + | { + data: { + count?: null | number; + key?: null | string; + lastRequest?: null | number; + }; + model: "rateLimit"; + }; + }, + any + >; + deleteMany: FunctionReference< + "mutation", + "internal", + { + limit?: number; + model: string; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + }, + any + >; + deleteOne: FunctionReference< + "mutation", + "internal", + { + limit?: number; + model: string; + offset?: number; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + }, + any + >; + findMany: FunctionReference< + "query", + "internal", + { + limit?: number; + model: string; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + }, + any + >; + findOne: FunctionReference< + "query", + "internal", + { + limit?: number; + model: string; + offset?: number; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + }, + any + >; + getCurrentSession: FunctionReference<"query", "internal", {}, any>; + updateMany: FunctionReference< + "mutation", + "internal", + { + input: + | { + limit?: number; + model: "user"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + banExpires?: null | number; + banReason?: null | string; + banned?: null | boolean; + createdAt?: number; + displayUsername?: null | string; + email?: string; + emailVerified?: boolean; + image?: null | string; + isAnonymous?: null | boolean; + name?: string; + phoneNumber?: null | string; + phoneNumberVerified?: null | boolean; + role?: null | string; + stripeCustomerId?: null | string; + teamId?: null | string; + twoFactorEnabled?: null | boolean; + updatedAt?: number; + userId?: null | string; + username?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "session"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + activeOrganizationId?: null | string; + activeTeamId?: null | string; + createdAt?: number; + expiresAt?: number; + impersonatedBy?: null | string; + ipAddress?: null | string; + token?: string; + updatedAt?: number; + userAgent?: null | string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "account"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + accessToken?: null | string; + accessTokenExpiresAt?: null | number; + accountId?: string; + createdAt?: number; + idToken?: null | string; + password?: null | string; + providerId?: string; + refreshToken?: null | string; + refreshTokenExpiresAt?: null | number; + scope?: null | string; + updatedAt?: number; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "verification"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + createdAt?: number; + expiresAt?: number; + identifier?: string; + updatedAt?: number; + value?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "twoFactor"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + backupCodes?: string; + secret?: string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "passkey"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + aaguid?: null | string; + backedUp?: boolean; + counter?: number; + createdAt?: null | number; + credentialID?: string; + deviceType?: string; + name?: null | string; + publicKey?: string; + transports?: null | string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "apikey"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + createdAt?: number; + enabled?: null | boolean; + expiresAt?: null | number; + key?: string; + lastRefillAt?: null | number; + lastRequest?: null | number; + metadata?: null | string; + name?: null | string; + permissions?: null | string; + prefix?: null | string; + rateLimitEnabled?: null | boolean; + rateLimitMax?: null | number; + rateLimitTimeWindow?: null | number; + refillAmount?: null | number; + refillInterval?: null | number; + remaining?: null | number; + requestCount?: null | number; + start?: null | string; + updatedAt?: number; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "oauthApplication"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + clientId?: null | string; + clientSecret?: null | string; + createdAt?: null | number; + disabled?: null | boolean; + icon?: null | string; + metadata?: null | string; + name?: null | string; + redirectURLs?: null | string; + type?: null | string; + updatedAt?: null | number; + userId?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "oauthAccessToken"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + accessToken?: null | string; + accessTokenExpiresAt?: null | number; + clientId?: null | string; + createdAt?: null | number; + refreshToken?: null | string; + refreshTokenExpiresAt?: null | number; + scopes?: null | string; + updatedAt?: null | number; + userId?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "oauthConsent"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + clientId?: null | string; + consentGiven?: null | boolean; + createdAt?: null | number; + scopes?: null | string; + updatedAt?: null | number; + userId?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "team"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + createdAt?: number; + name?: string; + organizationId?: string; + updatedAt?: null | number; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "teamMember"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + createdAt?: null | number; + teamId?: string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "organization"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + createdAt?: number; + logo?: null | string; + metadata?: null | string; + name?: string; + slug?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "member"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + createdAt?: number; + organizationId?: string; + role?: string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "invitation"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + email?: string; + expiresAt?: number; + inviterId?: string; + organizationId?: string; + role?: null | string; + status?: string; + teamId?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "ssoProvider"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + domain?: string; + issuer?: string; + oidcConfig?: null | string; + organizationId?: null | string; + providerId?: string; + samlConfig?: null | string; + userId?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "jwks"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + createdAt?: number; + privateKey?: string; + publicKey?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "subscription"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + cancelAtPeriodEnd?: null | boolean; + periodEnd?: null | number; + periodStart?: null | number; + plan?: string; + referenceId?: string; + seats?: null | number; + status?: null | string; + stripeCustomerId?: null | string; + stripeSubscriptionId?: null | string; + trialEnd?: null | number; + trialStart?: null | number; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "walletAddress"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + address?: string; + chainId?: number; + createdAt?: number; + isPrimary?: null | boolean; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + limit?: number; + model: "rateLimit"; + offset?: number; + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + select?: Array; + sortBy?: { direction: "asc" | "desc"; field: string }; + unique?: boolean; + update: { + count?: null | number; + key?: null | string; + lastRequest?: null | number; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + }; + }, + any + >; + updateOne: FunctionReference< + "mutation", + "internal", + { + input: + | { + model: "user"; + update: { + banExpires?: null | number; + banReason?: null | string; + banned?: null | boolean; + createdAt?: number; + displayUsername?: null | string; + email?: string; + emailVerified?: boolean; + image?: null | string; + isAnonymous?: null | boolean; + name?: string; + phoneNumber?: null | string; + phoneNumberVerified?: null | boolean; + role?: null | string; + stripeCustomerId?: null | string; + teamId?: null | string; + twoFactorEnabled?: null | boolean; + updatedAt?: number; + userId?: null | string; + username?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "session"; + update: { + activeOrganizationId?: null | string; + activeTeamId?: null | string; + createdAt?: number; + expiresAt?: number; + impersonatedBy?: null | string; + ipAddress?: null | string; + token?: string; + updatedAt?: number; + userAgent?: null | string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "account"; + update: { + accessToken?: null | string; + accessTokenExpiresAt?: null | number; + accountId?: string; + createdAt?: number; + idToken?: null | string; + password?: null | string; + providerId?: string; + refreshToken?: null | string; + refreshTokenExpiresAt?: null | number; + scope?: null | string; + updatedAt?: number; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "verification"; + update: { + createdAt?: number; + expiresAt?: number; + identifier?: string; + updatedAt?: number; + value?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "twoFactor"; + update: { + backupCodes?: string; + secret?: string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "passkey"; + update: { + aaguid?: null | string; + backedUp?: boolean; + counter?: number; + createdAt?: null | number; + credentialID?: string; + deviceType?: string; + name?: null | string; + publicKey?: string; + transports?: null | string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "apikey"; + update: { + createdAt?: number; + enabled?: null | boolean; + expiresAt?: null | number; + key?: string; + lastRefillAt?: null | number; + lastRequest?: null | number; + metadata?: null | string; + name?: null | string; + permissions?: null | string; + prefix?: null | string; + rateLimitEnabled?: null | boolean; + rateLimitMax?: null | number; + rateLimitTimeWindow?: null | number; + refillAmount?: null | number; + refillInterval?: null | number; + remaining?: null | number; + requestCount?: null | number; + start?: null | string; + updatedAt?: number; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "oauthApplication"; + update: { + clientId?: null | string; + clientSecret?: null | string; + createdAt?: null | number; + disabled?: null | boolean; + icon?: null | string; + metadata?: null | string; + name?: null | string; + redirectURLs?: null | string; + type?: null | string; + updatedAt?: null | number; + userId?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "oauthAccessToken"; + update: { + accessToken?: null | string; + accessTokenExpiresAt?: null | number; + clientId?: null | string; + createdAt?: null | number; + refreshToken?: null | string; + refreshTokenExpiresAt?: null | number; + scopes?: null | string; + updatedAt?: null | number; + userId?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "oauthConsent"; + update: { + clientId?: null | string; + consentGiven?: null | boolean; + createdAt?: null | number; + scopes?: null | string; + updatedAt?: null | number; + userId?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "team"; + update: { + createdAt?: number; + name?: string; + organizationId?: string; + updatedAt?: null | number; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "teamMember"; + update: { + createdAt?: null | number; + teamId?: string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "organization"; + update: { + createdAt?: number; + logo?: null | string; + metadata?: null | string; + name?: string; + slug?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "member"; + update: { + createdAt?: number; + organizationId?: string; + role?: string; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "invitation"; + update: { + email?: string; + expiresAt?: number; + inviterId?: string; + organizationId?: string; + role?: null | string; + status?: string; + teamId?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "ssoProvider"; + update: { + domain?: string; + issuer?: string; + oidcConfig?: null | string; + organizationId?: null | string; + providerId?: string; + samlConfig?: null | string; + userId?: null | string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "jwks"; + update: { + createdAt?: number; + privateKey?: string; + publicKey?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "subscription"; + update: { + cancelAtPeriodEnd?: null | boolean; + periodEnd?: null | number; + periodStart?: null | number; + plan?: string; + referenceId?: string; + seats?: null | number; + status?: null | string; + stripeCustomerId?: null | string; + stripeSubscriptionId?: null | string; + trialEnd?: null | number; + trialStart?: null | number; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "walletAddress"; + update: { + address?: string; + chainId?: number; + createdAt?: number; + isPrimary?: null | boolean; + userId?: string; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + } + | { + model: "rateLimit"; + update: { + count?: null | number; + key?: null | string; + lastRequest?: null | number; + }; + where?: Array<{ + connector?: "AND" | "OR"; + field: string; + operator?: + | "lt" + | "lte" + | "gt" + | "gte" + | "eq" + | "in" + | "ne" + | "contains" + | "starts_with" + | "ends_with"; + value: + | string + | number + | boolean + | Array + | Array + | null; + }>; + }; + }, + any + >; + }; + }; +}; diff --git a/convex/_generated/api.js b/convex/_generated/api.js new file mode 100644 index 000000000..44bf98583 --- /dev/null +++ b/convex/_generated/api.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +/** + * Generated `api` utility. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import { anyApi, componentsGeneric } from "convex/server"; + +/** + * A utility for referencing Convex functions in your app's API. + * + * Usage: + * ```js + * const myFunctionReference = api.myModule.myFunction; + * ``` + */ +export const api = anyApi; +export const internal = anyApi; +export const components = componentsGeneric(); diff --git a/convex/_generated/dataModel.d.ts b/convex/_generated/dataModel.d.ts new file mode 100644 index 000000000..8541f319e --- /dev/null +++ b/convex/_generated/dataModel.d.ts @@ -0,0 +1,60 @@ +/* eslint-disable */ +/** + * Generated data model types. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import type { + DataModelFromSchemaDefinition, + DocumentByName, + TableNamesInDataModel, + SystemTableNames, +} from "convex/server"; +import type { GenericId } from "convex/values"; +import schema from "../schema.js"; + +/** + * The names of all of your Convex tables. + */ +export type TableNames = TableNamesInDataModel; + +/** + * The type of a document stored in Convex. + * + * @typeParam TableName - A string literal type of the table name (like "users"). + */ +export type Doc = DocumentByName< + DataModel, + TableName +>; + +/** + * An identifier for a document in Convex. + * + * Convex documents are uniquely identified by their `Id`, which is accessible + * on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids). + * + * Documents can be loaded using `db.get(id)` in query and mutation functions. + * + * IDs are just strings at runtime, but this type can be used to distinguish them from other + * strings when type checking. + * + * @typeParam TableName - A string literal type of the table name (like "users"). + */ +export type Id = + GenericId; + +/** + * A type describing your Convex data model. + * + * This type includes information about what tables you have, the type of + * documents stored in those tables, and the indexes defined on them. + * + * This type is used to parameterize methods like `queryGeneric` and + * `mutationGeneric` to make them type-safe. + */ +export type DataModel = DataModelFromSchemaDefinition; diff --git a/convex/_generated/server.d.ts b/convex/_generated/server.d.ts new file mode 100644 index 000000000..b5c682886 --- /dev/null +++ b/convex/_generated/server.d.ts @@ -0,0 +1,149 @@ +/* eslint-disable */ +/** + * Generated utilities for implementing server-side Convex query and mutation functions. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import { + ActionBuilder, + AnyComponents, + HttpActionBuilder, + MutationBuilder, + QueryBuilder, + GenericActionCtx, + GenericMutationCtx, + GenericQueryCtx, + GenericDatabaseReader, + GenericDatabaseWriter, + FunctionReference, +} from "convex/server"; +import type { DataModel } from "./dataModel.js"; + +type GenericCtx = + | GenericActionCtx + | GenericMutationCtx + | GenericQueryCtx; + +/** + * Define a query in this Convex app's public API. + * + * This function will be allowed to read your Convex database and will be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export declare const query: QueryBuilder; + +/** + * Define a query that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to read from your Convex database. It will not be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export declare const internalQuery: QueryBuilder; + +/** + * Define a mutation in this Convex app's public API. + * + * This function will be allowed to modify your Convex database and will be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export declare const mutation: MutationBuilder; + +/** + * Define a mutation that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to modify your Convex database. It will not be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export declare const internalMutation: MutationBuilder; + +/** + * Define an action in this Convex app's public API. + * + * An action is a function which can execute any JavaScript code, including non-deterministic + * code and code with side-effects, like calling third-party services. + * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive. + * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}. + * + * @param func - The action. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped action. Include this as an `export` to name it and make it accessible. + */ +export declare const action: ActionBuilder; + +/** + * Define an action that is only accessible from other Convex functions (but not from the client). + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Include this as an `export` to name it and make it accessible. + */ +export declare const internalAction: ActionBuilder; + +/** + * Define an HTTP action. + * + * This function will be used to respond to HTTP requests received by a Convex + * deployment if the requests matches the path and method where this action + * is routed. Be sure to route your action in `convex/http.js`. + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Import this function from `convex/http.js` and route it to hook it up. + */ +export declare const httpAction: HttpActionBuilder; + +/** + * A set of services for use within Convex query functions. + * + * The query context is passed as the first argument to any Convex query + * function run on the server. + * + * This differs from the {@link MutationCtx} because all of the services are + * read-only. + */ +export type QueryCtx = GenericQueryCtx; + +/** + * A set of services for use within Convex mutation functions. + * + * The mutation context is passed as the first argument to any Convex mutation + * function run on the server. + */ +export type MutationCtx = GenericMutationCtx; + +/** + * A set of services for use within Convex action functions. + * + * The action context is passed as the first argument to any Convex action + * function run on the server. + */ +export type ActionCtx = GenericActionCtx; + +/** + * An interface to read from the database within Convex query functions. + * + * The two entry points are {@link DatabaseReader.get}, which fetches a single + * document by its {@link Id}, or {@link DatabaseReader.query}, which starts + * building a query. + */ +export type DatabaseReader = GenericDatabaseReader; + +/** + * An interface to read from and write to the database within Convex mutation + * functions. + * + * Convex guarantees that all writes within a single mutation are + * executed atomically, so you never have to worry about partial writes leaving + * your data in an inconsistent state. See [the Convex Guide](https://docs.convex.dev/understanding/convex-fundamentals/functions#atomicity-and-optimistic-concurrency-control) + * for the guarantees Convex provides your functions. + */ +export type DatabaseWriter = GenericDatabaseWriter; diff --git a/convex/_generated/server.js b/convex/_generated/server.js new file mode 100644 index 000000000..4a21df4f7 --- /dev/null +++ b/convex/_generated/server.js @@ -0,0 +1,90 @@ +/* eslint-disable */ +/** + * Generated utilities for implementing server-side Convex query and mutation functions. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import { + actionGeneric, + httpActionGeneric, + queryGeneric, + mutationGeneric, + internalActionGeneric, + internalMutationGeneric, + internalQueryGeneric, + componentsGeneric, +} from "convex/server"; + +/** + * Define a query in this Convex app's public API. + * + * This function will be allowed to read your Convex database and will be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export const query = queryGeneric; + +/** + * Define a query that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to read from your Convex database. It will not be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export const internalQuery = internalQueryGeneric; + +/** + * Define a mutation in this Convex app's public API. + * + * This function will be allowed to modify your Convex database and will be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export const mutation = mutationGeneric; + +/** + * Define a mutation that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to modify your Convex database. It will not be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export const internalMutation = internalMutationGeneric; + +/** + * Define an action in this Convex app's public API. + * + * An action is a function which can execute any JavaScript code, including non-deterministic + * code and code with side-effects, like calling third-party services. + * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive. + * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}. + * + * @param func - The action. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped action. Include this as an `export` to name it and make it accessible. + */ +export const action = actionGeneric; + +/** + * Define an action that is only accessible from other Convex functions (but not from the client). + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Include this as an `export` to name it and make it accessible. + */ +export const internalAction = internalActionGeneric; + +/** + * Define a Convex HTTP action. + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument, and a `Request` object + * as its second. + * @returns The wrapped endpoint function. Route a URL path to this function in `convex/http.js`. + */ +export const httpAction = httpActionGeneric; diff --git a/convex/auth.config.ts b/convex/auth.config.ts new file mode 100644 index 000000000..afc62641f --- /dev/null +++ b/convex/auth.config.ts @@ -0,0 +1,8 @@ +export default { + providers: [ + { + domain: process.env.CONVEX_SITE_URL, + applicationID: 'convex', + }, + ], +} diff --git a/convex/auth.ts b/convex/auth.ts new file mode 100644 index 000000000..d2ca06d14 --- /dev/null +++ b/convex/auth.ts @@ -0,0 +1,90 @@ +import { + BetterAuth, + type AuthFunctions, + type PublicAuthFunctions, +} from '@convex-dev/better-auth' +import { api, components, internal } from './_generated/api' +import { query, QueryCtx } from './_generated/server' +import type { Id, DataModel } from './_generated/dataModel' +import schema from './schema' + +import { Infer } from 'convex/values' + +// Typesafe way to pass Convex functions defined in this file +const authFunctions: AuthFunctions = internal.auth +const publicAuthFunctions: PublicAuthFunctions = api.auth + +// Initialize the component +export const betterAuthComponent = new BetterAuth(components.betterAuth, { + authFunctions, + publicAuthFunctions, +}) + +// These are required named exports +export const { + createUser, + updateUser, + deleteUser, + createSession, + isAuthenticated, +} = betterAuthComponent.createAuthFunctions({ + // Must create a user and return the user id + onCreateUser: async (ctx, user) => { + return ctx.db.insert('users', { + createdAt: user.createdAt, + email: user.email, + updatedAt: user.updatedAt, + displayUsername: user.displayUsername ?? '', + image: user.image ?? '', + name: user.name, + capabilities: [], + }) + }, + + // Delete the user when they are deleted from Better Auth + onDeleteUser: async (ctx, userId) => { + await ctx.db.delete(userId as Id<'users'>) + }, + + onUpdateUser: async (ctx, user) => { + await ctx.db.patch(user.userId as Id<'users'>, { + email: user.email, + updatedAt: user.updatedAt, + displayUsername: user.displayUsername ?? '', + image: user.image ?? '', + name: user.name, + }) + }, +}) + +// Example function for getting the current user +// Feel free to edit, omit, etc. +export const getCurrentUser = query({ + args: {}, + handler: async (ctx) => { + return getCurrentUserConvex(ctx) + }, +}) + +export async function getCurrentUserConvex(ctx: QueryCtx) { + // Get user data from Better Auth - email, name, image, etc. + const user = await getBetterAuthUser(ctx) + + if (!user) { + return null + } + // Get user data from your application's database + // (skip this if you have no fields in your users table schema) + const userMetaData = await ctx.db.get(user.userId as Id<'users'>) + return { + ...user, + ...userMetaData, + } as TanStackUser +} + +export type TanStackUser = Awaited> & + Infer + +function getBetterAuthUser(ctx: QueryCtx) { + return betterAuthComponent.getAuthUser(ctx) +} diff --git a/convex/convex.config.ts b/convex/convex.config.ts new file mode 100644 index 000000000..9818392fc --- /dev/null +++ b/convex/convex.config.ts @@ -0,0 +1,9 @@ +import { defineApp } from 'convex/server' +import ossStats from '@erquhart/convex-oss-stats/convex.config' +import betterAuth from '@convex-dev/better-auth/convex.config' + +const app = defineApp() +app.use(ossStats) +app.use(betterAuth) + +export default app diff --git a/convex/http.ts b/convex/http.ts new file mode 100644 index 000000000..b0cb04465 --- /dev/null +++ b/convex/http.ts @@ -0,0 +1,11 @@ +import { ossStats } from './stats' +import { httpRouter } from 'convex/server' +import { betterAuthComponent } from './auth' +import { createAuth } from '../src/server/auth.server' + +const http = httpRouter() + +ossStats.registerRoutes(http) +betterAuthComponent.registerRoutes(http, createAuth) + +export default http diff --git a/convex/schema.ts b/convex/schema.ts new file mode 100644 index 000000000..0320d1459 --- /dev/null +++ b/convex/schema.ts @@ -0,0 +1,41 @@ +import { defineSchema, defineTable } from 'convex/server' +import { authTables } from '@convex-dev/auth/server' +import { v } from 'convex/values' +import { z } from 'zod' + +// Zod schema for valid capabilities +// Valid capabilities list (exported for use throughout the app) +export const VALID_CAPABILITIES = ['admin', 'disableAds', 'builder'] as const +export const CapabilitySchema = z.enum(VALID_CAPABILITIES) +export type Capability = z.infer + +// Helper function to validate a capability +export function validateCapability( + capability: string +): capability is Capability { + return VALID_CAPABILITIES.includes(capability as Capability) +} + +// Valid capabilities for Convex validation +const validCapabilities = VALID_CAPABILITIES + +const schema = defineSchema({ + ...authTables, + users: defineTable({ + displayUsername: v.optional(v.string()), + createdAt: v.number(), + image: v.optional(v.string()), + name: v.optional(v.string()), + email: v.string(), + updatedAt: v.number(), + capabilities: v.array( + v.union(...validCapabilities.map((cap) => v.literal(cap))) + ), + adsDisabled: v.optional(v.boolean()), + }).searchIndex('search_email', { + searchField: 'email', + }), + // .index('by_email', ['email']), +}) + +export default schema diff --git a/convex/stats.ts b/convex/stats.ts new file mode 100644 index 000000000..40aa60376 --- /dev/null +++ b/convex/stats.ts @@ -0,0 +1,48 @@ +import { OssStats } from '@erquhart/convex-oss-stats' +import { components } from './_generated/api' +import { query } from './_generated/server' +import { v } from 'convex/values' + +export const ossStats = new OssStats(components.ossStats, { + githubOwners: ['tanstack'], + npmOrgs: ['tanstack', 'tannerlinsley'], +}) + +export const getStats = query({ + args: { + library: v.optional( + v.object({ + id: v.string(), + repo: v.string(), + frameworks: v.array(v.string()), + }) + ), + }, + handler: async (ctx, args) => { + const githubData = args.library + ? await ossStats.getGithubRepo(ctx, args.library.repo) + : await ossStats.getGithubOwner(ctx, 'tanstack') + const npmData = args.library + ? await ossStats.getNpmPackages( + ctx, + args.library.frameworks.map( + (framework) => `@tanstack/${framework}-${args.library?.id}` + ) + ) + : await ossStats.getNpmOrg(ctx, 'tanstack') + return { + github: githubData, + npm: npmData, + } + }, +}) + +export const { + getGithubOwner, + getNpmOrg, + getGithubRepo, + getGithubRepos, + getNpmPackages, + sync, + clearAndSync, +} = ossStats.api() diff --git a/convex/tsconfig.json b/convex/tsconfig.json new file mode 100644 index 000000000..6fa874e81 --- /dev/null +++ b/convex/tsconfig.json @@ -0,0 +1,25 @@ +{ + /* This TypeScript project config describes the environment that + * Convex functions run in and is used to typecheck them. + * You can modify it, but some settings required to use Convex. + */ + "compilerOptions": { + /* These settings are not required by Convex and can be modified. */ + "allowJs": true, + "strict": true, + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + + /* These compiler options are required by Convex */ + "target": "ESNext", + "lib": ["ES2021", "dom"], + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "isolatedModules": true, + "noEmit": true + }, + "include": ["./**/*"], + "exclude": ["./_generated"] +} diff --git a/convex/users.ts b/convex/users.ts new file mode 100644 index 000000000..3a1fdfdf8 --- /dev/null +++ b/convex/users.ts @@ -0,0 +1,173 @@ +import { v } from 'convex/values' +import { mutation, query, QueryCtx } from './_generated/server' +import { Capability, CapabilitySchema } from './schema' +import { getCurrentUserConvex } from './auth' +import { Id } from './_generated/dataModel' + +export const updateUserCapabilities = mutation({ + args: { + userId: v.id('users'), + capabilities: v.array( + v.union(v.literal('admin'), v.literal('disableAds'), v.literal('builder')) + ), + }, + handler: async (ctx, args) => { + // Validate admin capability + await requireCapability(ctx, 'admin') + + // Validate that target user exists + const targetUser = await ctx.db.get(args.userId) + if (!targetUser) { + throw new Error('Target user not found') + } + + let capabilities = args.capabilities + + // Ensure that tannerlinsley@gmail.com always has the admin capability + // as a fail safe + if (targetUser.email === 'tannerlinsley@gmail.com') { + capabilities = [ + ...new Set(['admin', ...capabilities]).values(), + ] + } + + // Validate capabilities using schema helper + const validatedCapabilities = CapabilitySchema.array().parse(capabilities) + + // Update target user's capabilities + await ctx.db.patch(args.userId, { + capabilities: validatedCapabilities, + }) + + return { success: true } + }, +}) + +// List users with pagination (admin only) +export const listUsers = query({ + args: { + pagination: v.object({ + limit: v.number(), + page: v.optional(v.number()), + }), + emailFilter: v.optional(v.string()), + capabilityFilter: v.optional( + v.union(v.literal('admin'), v.literal('disableAds'), v.literal('builder')) + ), + adsDisabledFilter: v.optional(v.boolean()), + }, + handler: async (ctx, args) => { + // Validate admin capability + await requireCapability(ctx, 'admin') + + const limit = args.pagination.limit + const pageIndex = args.pagination.page ?? 0 + + const emailFilter = args.emailFilter ?? '' + + // Collect users (email search when provided), then filter/sort in-memory + const candidates = + emailFilter && emailFilter.length > 0 + ? await ctx.db + .query('users') + .withSearchIndex('search_email', (q2) => + q2.search('email', emailFilter) + ) + .collect() + : await ctx.db.query('users').collect() + + // Stable newest-first ordering + candidates.sort((a: any, b: any) => b._creationTime - a._creationTime) + + const filtered = candidates.filter((user: any) => { + if (args.capabilityFilter) { + if ( + !Array.isArray(user.capabilities) || + !user.capabilities.includes(args.capabilityFilter) + ) { + return false + } + } + if (typeof args.adsDisabledFilter === 'boolean') { + if (Boolean(user.adsDisabled) !== args.adsDisabledFilter) return false + } + return true + }) + + const start = Math.max(0, pageIndex * limit) + const end = start + limit + const page = filtered.slice(start, end) + const hasMore = end < filtered.length + + return { + page, + isDone: !hasMore, + counts: { + total: (await ctx.db.query('users').collect()).length, + filtered: filtered.length, + pages: Math.max(1, Math.ceil(filtered.length / limit)), + }, + } + }, +}) + +// countUsers removed; counts are included in listUsers response + +// Helper function to validate user capability +async function requireCapability(ctx: QueryCtx, capability: Capability) { + // Get the current user (caller) + const currentUser = await getCurrentUserConvex(ctx) + if (!currentUser) { + throw new Error('Not authenticated') + } + + // Validate that caller has the required capability + if (!currentUser.capabilities.includes(capability)) { + throw new Error(`${capability} capability required`) + } + + return { currentUser } +} + +// Toggle ad preference (only for users with disableAds capability) +export const updateAdPreference = mutation({ + args: { + adsDisabled: v.boolean(), + }, + handler: async (ctx, args) => { + // Validate admin capability + const { currentUser } = await requireCapability(ctx, 'disableAds') + + // Update target user's capabilities + await ctx.db.patch(currentUser.userId as Id<'users'>, { + adsDisabled: args.adsDisabled, + }) + + return { success: true } + }, +}) + +// Admin override to set a user's adsDisabled flag +export const adminSetAdsDisabled = mutation({ + args: { + userId: v.id('users'), + adsDisabled: v.boolean(), + }, + handler: async (ctx, args) => { + // Validate admin capability + await requireCapability(ctx, 'admin') + + // Validate that target user exists + const targetUser = await ctx.db.get(args.userId) + if (!targetUser) { + throw new Error('Target user not found') + } + + // Update target user's adsDisabled flag + await ctx.db.patch(args.userId, { + adsDisabled: args.adsDisabled, + }) + + return { success: true } + }, +}) diff --git a/discord-bot/package.json b/discord-bot/package.json new file mode 100644 index 000000000..9ec542801 --- /dev/null +++ b/discord-bot/package.json @@ -0,0 +1,22 @@ +{ + "name": "discord-bot", + "version": "1.0.0", + "main": "dist/index.js", + "author": "Tanner Linsley", + "license": "MIT", + "private": true, + "scripts": { + "start": "rollup src/index.js --file dist/index.js --format cjs --watch", + "build": "rollup src/index.js --file dist/index.js --format cjs", + "serve": "nodemon ./dist/index.js localhost 8080", + "heroku-serve": "node ./dist/index.js" + }, + "dependencies": { + "discord.js": "^12.5.1", + "dotenv": "^8.2.0" + }, + "devDependencies": { + "nodemon": "^2.0.7", + "rollup": "^2.38.0" + } +} diff --git a/discord-bot/src/index.js b/discord-bot/src/index.js new file mode 100644 index 000000000..e583e3c03 --- /dev/null +++ b/discord-bot/src/index.js @@ -0,0 +1,73 @@ +import path from 'path' +import Discord from 'discord.js' + +if (process.env.NODE_ENV !== 'production') { + require('dotenv').config({ + path: path.resolve(process.cwd(), '../', '.env'), + }) +} + +const guildId = '719702312431386674' + +const channelIds = { + welcome: '725435640673468500', + fan: '803508045627654155', + supporter: '803508117752119307', + premierSponsor: '803508359378370600', +} + +const roles = { + fan: '🤘Fan', + supporter: '🎗Supporter', + permierSponsor: '🏅Premier Sponsor', +} + +let clientPromise + +init() + +function getClient() { + if (!clientPromise) { + clientPromise = new Promise((resolve) => { + const client = new Discord.Client() + + client.on('ready', async () => { + console.info('Logged in to Discord.') + resolve(client) + }) + + client.login(process.env.DISCORD_TOKEN) + }) + } + + return clientPromise +} + +async function getGuild() { + const client = await getClient() + return await client.guilds.fetch(guildId) +} + +async function init() { + const client = await getClient() + + // const guild = await getGuild() + + // console.info(guild) + + client.on('message', (message) => { + // console.info(message) + // let tierRole = message.guild.roles.cache.find( + // (role) => role.name === roles[tier.sponsorType] + // ) + }) + + //Welcome & goodbye messages\\ + client.on('guildMemberAdd', (member) => { + console.info(member) + + member.roles.add( + member.guild.roles.cache.find((i) => i.name === 'Among The Server') + ) + }) +} diff --git a/docs/proposals/source-packages.md b/docs/proposals/source-packages.md deleted file mode 100644 index 5c4a41685..000000000 --- a/docs/proposals/source-packages.md +++ /dev/null @@ -1,138 +0,0 @@ -# Proposal: `-source` Companion Packages for AI Code Exploration - -## Problem - -AI agents (Claude, Cursor, Copilot, etc.) work best when they can grep and read actual source code. Our npm packages only contain built output (transpiled JS, type definitions), not the original TypeScript source. - -Current workarounds: - -- Clone repos to `/tmp` manually -- Ask the agent to clone and explore -- Read minified/transpiled code (poor results) - -These are clunky and break the flow of AI-assisted development. - -## Proposal - -Publish companion `-source` packages alongside every TanStack library release: - -```bash -# Normal install (built output, what runs in production) -npm install @tanstack/react-query@5.62.0 - -# Source install for AI exploration (dev only) -npm install @tanstack/react-query-source@5.62.0 --save-dev -``` - -The `-source` package contains the `src/` directory from the monorepo package (TypeScript and JavaScript source). It's not meant to be imported at runtime, only explored by AI agents. - -## Structure - -``` -node_modules/@tanstack/react-query-source/ - src/ - useQuery.ts - useMutation.ts - QueryClient.ts - ... - package.json -``` - -## MCP Integration - -The hosted MCP server gets a simple tool: - -```typescript -get_source_instructions({ library: 'query' }) -``` - -Returns: - -```json -{ - "package": "@tanstack/react-query-source", - "install": "npm install @tanstack/react-query-source@5.62.0 --save-dev", - "explorePath": "node_modules/@tanstack/react-query-source/src/", - "note": "Install this package to explore TanStack Query source code. Use your file tools to grep and read." -} -``` - -The agent installs the package, then uses its native file system tools (grep, read) to explore. No custom MCP tooling for search/read needed. - -## Implementation - -### 1. CI/CD Changes - -On every release, publish two packages: - -```yaml -# Pseudocode -- name: Publish main package - run: npm publish - -- name: Publish source package - run: | - # Create temp package with only src/ - cp -r src/ dist-source/src/ - cp package.json dist-source/ - # Modify package name to add -source suffix - jq '.name += "-source"' dist-source/package.json > tmp && mv tmp dist-source/package.json - # Modify files field to only include src/ - jq '.files = ["src"]' dist-source/package.json > tmp && mv tmp dist-source/package.json - cd dist-source && npm publish -``` - -### 2. MCP Server Changes - -Add one tool to the hosted MCP: - -- `get_source_instructions` - Returns install command and explore path for a library - -### 3. Documentation - -Update MCP docs to explain the `-source` package convention. - -## Benefits - -1. **No local CLI needed** - Hosted MCP only, agents handle the rest -2. **Standard npm workflow** - No new tooling for developers to learn -3. **Version alignment** - Source version always matches installed version -4. **Works with any AI agent** - Just needs file system access -5. **Minimal overhead** - Source packages are small (just source files) - -## Tradeoffs - -1. **Double publish** - Every release publishes 2 packages per library -2. **npm registry usage** - More packages, though source packages are small -3. **Agent must run npm install** - One extra step, but agents already know how - -## Alternatives Considered - -### Local CLI that caches repos - -Rejected: Adds complexity, requires users to install a CLI, duplicates what npm already does. - -### Hosted grep API (Sourcegraph-backed) - -Rejected: External dependency, rate limits, adds context overhead for every query. - -### Include source in main package - -Rejected: Bloats production installs, source isn't needed at runtime. - -### GitHub raw content proxy via MCP - -Rejected: Can't grep across files, need to know exact paths upfront. - -## Open Questions - -1. Should we include related packages? (e.g., `@tanstack/query-core` source in `@tanstack/react-query-source`) -2. What about monorepo-level files like shared utilities? -3. Should we include tests in the source package? - -## Next Steps - -1. Prototype the publish workflow for one library (react-query) -2. Test with Claude/Cursor to validate the agent experience -3. Roll out to all TanStack libraries -4. Add MCP tool and documentation diff --git a/drizzle.config.ts b/drizzle.config.ts deleted file mode 100644 index bf351e642..000000000 --- a/drizzle.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { Config } from 'drizzle-kit' - -export default { - schema: './src/db/schema.ts', - out: './drizzle/migrations', - dialect: 'postgresql', - dbCredentials: { - url: process.env.DATABASE_URL!, - }, -} satisfies Config diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index dc98466a7..000000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,68 +0,0 @@ -import js from '@eslint/js' -import * as tseslint from 'typescript-eslint' -import react from 'eslint-plugin-react' -import reactHooks from 'eslint-plugin-react-hooks' -import jsxA11y from 'eslint-plugin-jsx-a11y' -import path from 'node:path' -import { fileURLToPath } from 'node:url' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename) - -const ignores = [ - 'node_modules', - 'dist', - 'build', - '.content-collections', - '.tanstack-start', - '.netlify', - 'public', - 'convex/.temp', -] - -export default [ - { ignores }, - { - files: ['**/*.{js,jsx}'], - ...js.configs.recommended, - }, - ...tseslint.configs.recommended, - { - files: ['**/*.{ts,tsx}'], - languageOptions: { - parserOptions: { - tsconfigRootDir: __dirname, - }, - }, - rules: { - '@typescript-eslint/no-unused-vars': [ - 'warn', - { - argsIgnorePattern: '(^_)|(^__+$)|(^e$)|(^error$)', - varsIgnorePattern: '(^_)|(^__+$)|(^e$)|(^error$)', - caughtErrorsIgnorePattern: '(^_)|(^__+$)|(^e$)|(^error$)', - }, - ], - 'no-redeclare': 'off', - '@typescript-eslint/no-redeclare': 'error', - 'no-shadow': 'off', - '@typescript-eslint/no-explicit-any': 'off', - }, - }, - { - files: ['**/*.{ts,tsx,js,jsx}'], - plugins: { - react, - 'react-hooks': reactHooks, - 'jsx-a11y': jsxA11y, - }, - settings: { - react: { version: 'detect' }, - }, - rules: { - ...reactHooks.configs.recommended.rules, - ...jsxA11y.configs.recommended.rules, - 'react-hooks/set-state-in-effect': 'warn', - }, - }, -] diff --git a/media/brand.sketch b/media/brand.sketch index 4dd73c51f..07d17daa8 100644 Binary files a/media/brand.sketch and b/media/brand.sketch differ diff --git a/netlify.toml b/netlify.toml index 841bed99e..67ba2b74b 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,37 +1,7 @@ -[build.environment] - NODE_OPTIONS = "--max-old-space-size=4096" - +[context.production] +command = "npx convex deploy --cmd 'pnpm run build'" +[context.deploy-preview] +command = "npx convex deploy --cmd 'pnpm run build'" [build] - command = "vite build && cp src/instrument.server.mjs dist/server" - publish = "dist/client" - -[functions] - directory = "netlify/functions" - -[[headers]] - for = "/*" - [headers.values] - X-Frame-Options = "DENY" - X-Content-Type-Options = "nosniff" - X-XSS-Protection = "1; mode=block" - Referrer-Policy = "strict-origin-when-cross-origin" - Permissions-Policy = "camera=(), microphone=(), geolocation=()" - -[[headers]] - for = "/*" - [headers.values] - Strict-Transport-Security = "max-age=31536000; includeSubDomains" - -# WebContainer requires SharedArrayBuffer which needs COOP/COEP headers -# Only apply to /builder to avoid breaking external resources on other pages -[[headers]] - for = "/builder" - [headers.values] - Cross-Origin-Opener-Policy = "same-origin" - Cross-Origin-Embedder-Policy = "require-corp" - -[[headers]] - for = "/builder/*" - [headers.values] - Cross-Origin-Opener-Policy = "same-origin" - Cross-Origin-Embedder-Policy = "require-corp" +command = "vite build" +publish = "dist/client" diff --git a/netlify/functions/refresh-github-stats-background.ts b/netlify/functions/refresh-github-stats-background.ts deleted file mode 100644 index 42b065d4e..000000000 --- a/netlify/functions/refresh-github-stats-background.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type { Config } from '@netlify/functions' -import { refreshGitHubOrgStats } from '~/utils/stats.functions' - -/** - * Netlify Scheduled Function - Refresh GitHub stats cache - * - * This function refreshes pre-aggregated GitHub stats for the TanStack organization: - * - Organization-level: stars, contributors, dependents, repositories - * - Per-library: stars, contributors, dependents for each library repo - * - * Scheduled: Runs automatically every 6 hours - * - * Performance Impact: - * - Refresh time: ~1-2 minutes for org + all library repos - * - After refresh: ~100-200ms per request (served from cache) - */ -const handler = async (req: Request) => { - const { next_run } = await req.json() - - console.log('[refresh-github-stats] Starting GitHub stats refresh...') - - const startTime = Date.now() - - try { - const org = 'tanstack' - - const { orgStats, libraryResults, libraryErrors } = - await refreshGitHubOrgStats(org) - - const duration = Date.now() - startTime - console.log( - `[refresh-github-stats] ✓ Completed in ${duration}ms - GitHub Org: ${orgStats.starCount.toLocaleString()} stars, Libraries: ${ - libraryResults.length - } refreshed, ${libraryErrors.length} failed`, - ) - console.log('[refresh-github-stats] Next invocation at:', next_run) - } catch (error) { - const duration = Date.now() - startTime - const errorMessage = error instanceof Error ? error.message : String(error) - const errorStack = error instanceof Error ? error.stack : undefined - - console.error( - `[refresh-github-stats] ✗ Failed after ${duration}ms:`, - errorMessage, - ) - if (errorStack) { - console.error('[refresh-github-stats] Stack:', errorStack) - } - } -} - -export default handler - -export const config: Config = { - schedule: '0 */6 * * *', // Every 6 hours -} diff --git a/netlify/functions/refresh-npm-stats-background.ts b/netlify/functions/refresh-npm-stats-background.ts deleted file mode 100644 index 144d04e2d..000000000 --- a/netlify/functions/refresh-npm-stats-background.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { Config } from '@netlify/functions' -import { refreshNpmOrgStats } from '~/utils/stats.functions' - -/** - * Netlify Scheduled Function - Refresh NPM stats cache - * - * This function refreshes pre-aggregated NPM stats for the TanStack organization: - * - Total downloads across all packages (including legacy packages) - * - Per-package download counts and rates - * - * Scheduled: Runs automatically every 6 hours - * Concurrency: 8 packages at a time, 500ms delay between packages - * - * Performance Impact: - * - Refresh time: ~10-20 minutes for 203 packages (199 scoped + 4 legacy) - * - After refresh: ~100-200ms per request (served from cache) - */ -const handler = async (req: Request) => { - const { next_run } = await req.json() - - console.log('[refresh-npm-stats] Starting NPM stats refresh...') - - const startTime = Date.now() - - try { - const org = 'tanstack' - - // Refresh NPM org stats (fetches all packages, aggregates, and caches) - console.log('[refresh-npm-stats] Refreshing NPM org stats...') - const npmStats = await refreshNpmOrgStats(org) - - const duration = Date.now() - startTime - console.log( - `[refresh-npm-stats] ✓ Completed in ${duration}ms - NPM: ${npmStats.totalDownloads.toLocaleString()} downloads (${ - Object.keys(npmStats.packageStats || {}).length - } packages)`, - ) - console.log('[refresh-npm-stats] Next invocation at:', next_run) - } catch (error) { - const duration = Date.now() - startTime - const errorMessage = error instanceof Error ? error.message : String(error) - const errorStack = error instanceof Error ? error.stack : undefined - - console.error( - `[refresh-npm-stats] ✗ Failed after ${duration}ms:`, - errorMessage, - ) - if (errorStack) { - console.error('[refresh-npm-stats] Stack:', errorStack) - } - } -} - -export default handler - -export const config: Config = { - schedule: '0 */6 * * *', // Every 6 hours -} diff --git a/netlify/functions/sync-intent-discover-background.ts b/netlify/functions/sync-intent-discover-background.ts deleted file mode 100644 index 0e9ecf2c7..000000000 --- a/netlify/functions/sync-intent-discover-background.ts +++ /dev/null @@ -1,217 +0,0 @@ -import type { Config } from '@netlify/functions' -import { - searchIntentPackages, - fetchPackument, - isIntentCompatible, - selectVersionsToSync, - extractSkillsFromTarball, -} from '~/utils/intent.server' -import { - upsertIntentPackage, - getKnownVersions, - enqueuePackageVersion, - markPackageVerified, -} from '~/utils/intent-db.server' - -/** - * Netlify Scheduled Function - Discover Intent-compatible npm packages - * - * Phase 1 of 2. Fast: no tarball downloads (except brief header peeks for GitHub path). - * - * Two discovery paths: - * 1. NPM keyword search — instant, finds packages that published with tanstack-intent keyword - * 2. GitHub code search — finds repos that depend on @tanstack/intent but may not have the keyword yet - * - * Both paths enqueue new versions for tarball processing (syncStatus = 'pending'). - * Actual skill extraction happens in sync-intent-process-background. - * - * Scheduled: Every 6 hours - */ -const handler = async (req: Request) => { - const { next_run } = await req.json() - const startTime = Date.now() - - console.log('[intent-discover] Starting discovery (NPM + GitHub)...') - - let versionsEnqueued = 0 - const errors: Array = [] - - // --------------------------------------------------------------------------- - // Path 1: NPM keyword search - // --------------------------------------------------------------------------- - try { - console.log( - '[intent-discover] Searching NPM for keywords:tanstack-intent...', - ) - const searchResults = await searchIntentPackages() - console.log( - `[intent-discover] NPM found ${searchResults.objects.length} candidates`, - ) - - for (const { package: pkg } of searchResults.objects) { - try { - await upsertIntentPackage({ name: pkg.name, verified: false }) - - const packument = await fetchPackument(pkg.name) - const latestVersion = packument['dist-tags'].latest - if (!latestVersion) continue - - const latestMeta = packument.versions[latestVersion] - if (!latestMeta || !isIntentCompatible(latestMeta)) continue - - await markPackageVerified(pkg.name) - - const knownVersions = await getKnownVersions(pkg.name) - const toEnqueue = selectVersionsToSync(packument, knownVersions) - for (const { version, tarball, publishedAt } of toEnqueue) { - await enqueuePackageVersion({ - packageName: pkg.name, - version, - tarballUrl: tarball, - publishedAt, - }) - versionsEnqueued++ - } - console.log( - `[intent-discover] NPM: ${pkg.name} - enqueued ${toEnqueue.length}`, - ) - } catch (e) { - const msg = `npm/${pkg.name}: ${e instanceof Error ? e.message : String(e)}` - console.error(`[intent-discover] ${msg}`) - errors.push(msg) - } - } - } catch (e) { - console.error( - '[intent-discover] NPM path failed:', - e instanceof Error ? e.message : String(e), - ) - } - - // --------------------------------------------------------------------------- - // Path 2: GitHub code search for @tanstack/intent dependents - // --------------------------------------------------------------------------- - const githubToken = process.env.GITHUB_AUTH_TOKEN - if (githubToken) { - try { - console.log( - '[intent-discover] Searching GitHub for @tanstack/intent dependents...', - ) - const ghHeaders = { - Authorization: `Bearer ${githubToken}`, - Accept: 'application/vnd.github.v3+json', - } - - const searchRes = await fetch( - 'https://api.github.com/search/code?q=%22%40tanstack%2Fintent%22+filename%3Apackage.json&per_page=100', - { headers: ghHeaders }, - ) - if (!searchRes.ok) throw new Error(`GitHub search ${searchRes.status}`) - - const searchData = (await searchRes.json()) as { - items: Array<{ path: string; repository: { full_name: string } }> - } - - // Deduplicate repo+path pairs - const seen = new Set() - const candidates = searchData.items.filter((item) => { - const key = `${item.repository.full_name}|${item.path}` - if (seen.has(key)) return false - seen.add(key) - return true - }) - - console.log( - `[intent-discover] GitHub found ${candidates.length} package.json files`, - ) - - for (const { repo, path } of candidates.map((i) => ({ - repo: i.repository.full_name, - path: i.path, - }))) { - try { - const contentRes = await fetch( - `https://api.github.com/repos/${repo}/contents/${path}`, - { headers: ghHeaders }, - ) - if (!contentRes.ok) continue - - const contentData = (await contentRes.json()) as { content?: string } - if (!contentData.content) continue - - const pkgJson = JSON.parse( - Buffer.from(contentData.content, 'base64').toString('utf-8'), - ) as { name?: string; private?: boolean } - - const pkgName = pkgJson.name - if (!pkgName || pkgJson.private) continue - - // Check NPM - const npmRes = await fetch( - `https://registry.npmjs.org/${encodeURIComponent(pkgName)}/latest`, - ) - if (!npmRes.ok) continue - - const npmMeta = (await npmRes.json()) as { - version?: string - dist?: { tarball?: string } - } - if (!npmMeta.version || !npmMeta.dist?.tarball) continue - - // Peek at tarball for skills - const skills = await extractSkillsFromTarball(npmMeta.dist.tarball) - if (skills.length === 0) continue - - await upsertIntentPackage({ name: pkgName, verified: true }) - await markPackageVerified(pkgName) - - const packument = await fetchPackument(pkgName) - const knownVersions = await getKnownVersions(pkgName) - const toEnqueue = selectVersionsToSync(packument, knownVersions) - - for (const { version, tarball, publishedAt } of toEnqueue) { - await enqueuePackageVersion({ - packageName: pkgName, - version, - tarballUrl: tarball, - publishedAt, - }) - versionsEnqueued++ - } - if (toEnqueue.length > 0) { - console.log( - `[intent-discover] GitHub: ${pkgName} - enqueued ${toEnqueue.length}`, - ) - } - } catch (e) { - const msg = `github/${repo}: ${e instanceof Error ? e.message : String(e)}` - console.error(`[intent-discover] ${msg}`) - errors.push(msg) - } - } - } catch (e) { - console.error( - '[intent-discover] GitHub path failed:', - e instanceof Error ? e.message : String(e), - ) - } - } else { - console.warn( - '[intent-discover] GITHUB_AUTH_TOKEN not set, skipping GitHub path', - ) - } - - const duration = Date.now() - startTime - console.log( - `[intent-discover] Done in ${duration}ms - enqueued: ${versionsEnqueued}, errors: ${errors.length}`, - ) - if (errors.length > 0) - console.warn(`[intent-discover] Errors:\n ${errors.join('\n ')}`) - console.log('[intent-discover] Next invocation at:', next_run) -} - -export default handler - -export const config: Config = { - schedule: '0 */6 * * *', // Every 6 hours -} diff --git a/netlify/functions/sync-intent-process-background.ts b/netlify/functions/sync-intent-process-background.ts deleted file mode 100644 index 4d7fe72cf..000000000 --- a/netlify/functions/sync-intent-process-background.ts +++ /dev/null @@ -1,117 +0,0 @@ -import type { Config } from '@netlify/functions' -import { extractSkillsFromTarball } from '~/utils/intent.server' -import { - getPendingVersions, - replaceSkillsForVersion, - markVersionSynced, - markVersionFailed, -} from '~/utils/intent-db.server' - -// Hard budget: stop processing with this much time remaining before the -// 15-minute Netlify background function limit. Each tarball can take 1-5s, -// so 3 minutes of headroom is sufficient. -const BUDGET_MS = 12 * 60 * 1000 // 12 minutes - -/** - * Netlify Scheduled Function - Process pending Intent skill extractions - * - * Phase 2 of 2. Drains the pending version queue populated by - * sync-intent-discover-background. Runs more frequently so new packages - * appear in the registry quickly. - * - * Durability: each version is atomically marked 'synced' or 'failed' in the - * DB immediately after processing. A timeout or crash loses at most the - * single in-flight version (which stays 'pending' and is retried next run). - * Failed versions are retried every cycle until they succeed. - * - * Scheduled: Every 15 minutes - */ -const handler = async (req: Request) => { - const { next_run } = await req.json() - const startTime = Date.now() - const deadline = startTime + BUDGET_MS - - console.log('[intent-process] Starting queue drain...') - - let processed = 0 - let failed = 0 - let skipped = 0 - - try { - // Fetch enough pending items to keep us busy, but not so many we hold - // a huge result set in memory. We'll loop until time runs out. - const BATCH_SIZE = 50 - - while (Date.now() < deadline) { - const remaining = deadline - Date.now() - const pending = await getPendingVersions(BATCH_SIZE) - - if (pending.length === 0) { - console.log('[intent-process] Queue empty, nothing to do') - break - } - - console.log( - `[intent-process] ${pending.length} pending version(s), ${Math.round(remaining / 1000)}s remaining`, - ) - - for (const item of pending) { - // Check budget before each item, not just at batch boundaries - if (Date.now() >= deadline) { - skipped += pending.length - pending.indexOf(item) - console.log( - `[intent-process] Budget exhausted, stopping. ${skipped} item(s) deferred to next run.`, - ) - break - } - - if (!item.tarballUrl) { - await markVersionFailed(item.id, 'No tarball URL recorded') - failed++ - continue - } - - try { - const skills = await extractSkillsFromTarball(item.tarballUrl) - await replaceSkillsForVersion(item.id, skills) - await markVersionSynced(item.id, skills.length) - processed++ - console.log( - `[intent-process] ✓ ${item.packageName}@${item.version} - ${skills.length} skill(s)`, - ) - } catch (err) { - const reason = err instanceof Error ? err.message : String(err) - await markVersionFailed(item.id, reason) - failed++ - console.error( - `[intent-process] ✗ ${item.packageName}@${item.version}: ${reason}`, - ) - } - } - - // If we got fewer items than the batch size, the queue is drained - if (pending.length < BATCH_SIZE) break - } - - const duration = Date.now() - startTime - console.log( - `[intent-process] Done in ${duration}ms - processed: ${processed}, failed: ${failed}, deferred: ${skipped}`, - ) - console.log('[intent-process] Next invocation at:', next_run) - } catch (error) { - const duration = Date.now() - startTime - console.error( - `[intent-process] Fatal error after ${duration}ms:`, - error instanceof Error ? error.message : String(error), - ) - if (error instanceof Error && error.stack) { - console.error('[intent-process] Stack:', error.stack) - } - } -} - -export default handler - -export const config: Config = { - schedule: '*/15 * * * *', // Every 15 minutes -} diff --git a/opencode.json b/opencode.json deleted file mode 100644 index 8f9b80710..000000000 --- a/opencode.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "https://opencode.ai/config.json", - "mcp": {} -} diff --git a/package.json b/package.json index 6fa69a407..3fdaff0c0 100644 --- a/package.json +++ b/package.json @@ -3,164 +3,120 @@ "private": true, "sideEffects": false, "repository": "https://github.com/TanStack/tanstack.com.git", - "packageManager": "pnpm@10.26.0", + "packageManager": "pnpm@9.4.0", "type": "module", "scripts": { - "dev": "pnpm run with-env vite dev", + "dev": "npm-run-all --parallel dev:frontend dev:backend", "with-env": "dotenv -e ../../.env", "dev:frontend": "pnpm run with-env vite dev", - "build": "vite build && cp src/instrument.server.mjs dist/server", + "dev:backend": "convex dev --tail-logs", + "build": "vite build", "start": "vite start", - "lint": "eslint --cache --ext .ts,.tsx ./src", - "format": "prettier --experimental-cli --ignore-unknown '**/*' --write", - "db:generate": "drizzle-kit generate", - "db:migrate": "drizzle-kit migrate", - "db:push": "drizzle-kit push", - "db:studio": "drizzle-kit studio", - "husky": "pnpm run format && pnpm run test", - "test": "run-p test:tsc test:lint test:smoke", - "test:tsc": "tsc", - "test:lint": "pnpm run lint", - "test:smoke": "tsx tests/smoke.ts", - "test:e2e": "playwright test", - "prepare": "husky" + "lint": "prettier --check '**/*' --ignore-unknown && eslint --ext .ts,.tsx ./src", + "format": "prettier --write '**/*' --ignore-unknown", + "linkAll": "node scripts/link.js" }, "dependencies": { "@auth/core": "0.37.0", + "@clerk/tanstack-react-start": "^0.21.5", + "@convex-dev/auth": "^0.0.88", + "@convex-dev/better-auth": "^0.7.15", + "@convex-dev/react-query": "0.0.0-alpha.11", + "@erquhart/convex-oss-stats": "^0.8.1", "@floating-ui/react": "^0.27.8", - "@hono/mcp": "^0.2.3", - "@modelcontextprotocol/sdk": "^1.25.2", - "@netlify/functions": "^5.1.0", - "@netlify/neon": "^0.1.0", + "@headlessui/react": "1.7.18", "@netlify/vite-plugin-tanstack-start": "^1.0.2", "@number-flow/react": "^0.4.1", "@observablehq/plot": "^0.6.17", "@octokit/graphql": "^7.0.2", - "@radix-ui/react-dialog": "^1.1.15", + "@octokit/rest": "^20.0.2", + "@orama/react-components": "^0.1.23", "@radix-ui/react-dropdown-menu": "^2.1.12", + "@radix-ui/react-select": "^2.2.2", "@radix-ui/react-toast": "^1.2.2", - "@radix-ui/react-tooltip": "^1.2.8", - "@react-three/drei": "^10.7.7", - "@react-three/fiber": "^9.5.0", - "@sentry/node": "^10.42.0", - "@sentry/tanstackstart-react": "^10.43.0", - "@stackblitz/sdk": "^1.11.0", + "@remix-run/node": "^2.8.1", + "@sentry/react": "^8.35.0", + "@sentry/vite-plugin": "^2.22.6", "@tailwindcss/typography": "^0.5.13", "@tailwindcss/vite": "^4.1.11", - "@tanstack/create": "^0.49.1", - "@tanstack/pacer": "^0.16.4", - "@tanstack/react-hotkeys": "^0.0.2", - "@tanstack/react-pacer": "^0.17.4", - "@tanstack/react-query": "^5.90.12", - "@tanstack/react-router": "1.157.16", - "@tanstack/react-router-devtools": "1.157.16", - "@tanstack/react-router-ssr-query": "1.157.16", - "@tanstack/react-start": "1.157.16", + "@tanstack/react-pacer": "^0.16.3", + "@tanstack/react-query": "^5.90.2", + "@tanstack/react-router": "1.132.47", + "@tanstack/react-router-devtools": "1.132.51", + "@tanstack/react-router-with-query": "1.130.17", + "@tanstack/react-start": "1.132.51", "@tanstack/react-table": "^8.21.3", "@types/d3": "^7.4.3", - "@uploadthing/react": "^7.3.3", + "@typescript-eslint/parser": "^7.2.0", "@visx/hierarchy": "^2.10.0", "@visx/responsive": "^2.10.0", "@vitejs/plugin-react": "^4.3.3", - "@webcontainer/api": "^1.6.1", - "@xstate/react": "^6.0.0", "algoliasearch": "^5.23.4", - "cheerio": "^1.1.2", + "axios": "^1.6.7", + "better-auth": "^1.3.7", "cmdk": "^1.1.1", + "convex": "^1.25.4", + "convex-oss-stats": "link:../../../erquhart/convex-oss-stats", "d3": "^7.9.0", "date-fns": "^2.30.0", - "discord-interactions": "^4.4.0", - "drizzle-orm": "^0.44.7", - "eslint-plugin-jsx-a11y": "^6.10.2", + "downshift": "^9.0.9", + "eslint-config-react-app": "^7.0.1", "gray-matter": "^4.0.3", - "hast-util-is-element": "^3.0.0", - "hast-util-to-string": "^3.0.1", - "hono": "^4.11.3", "html-react-parser": "^5.1.10", - "jszip": "^3.10.1", + "import-meta-resolve": "^4.0.0", "lru-cache": "^7.13.1", - "lucide-react": "^0.561.0", - "match-sorter": "^8.2.0", + "marked": "^13.0.2", + "marked-alert": "^2.0.1", + "marked-gfm-heading-id": "^4.0.0", "mermaid": "^11.11.0", - "postgres": "^3.4.7", - "posthog-node": "^5.20.0", - "react": "19.2.3", + "qss": "^3.0.0", + "react": "^19.0.0", "react-colorful": "^5.6.1", - "react-dom": "19.2.3", - "react-easy-crop": "^5.5.6", + "react-dom": "^19.0.0", + "react-icons": "^5.3.0", "react-instantsearch": "7", - "rehype-autolink-headings": "^7.1.0", - "rehype-callouts": "^2.1.2", - "rehype-parse": "^9.0.1", - "rehype-raw": "^7.0.0", - "rehype-slug": "^6.0.0", - "rehype-stringify": "^10.0.1", - "remark-gfm": "^4.0.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", + "react-markdown": "^6.0.3", + "remix-utils": "^8.5.0", "remove-markdown": "^0.5.0", - "resend": "^6.6.0", "shiki": "^1.4.0", "tailwind-merge": "^1.14.0", - "tar-stream": "^3.1.8", - "three": "^0.182.0", - "troika-three-text": "^0.52.4", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "uploadthing": "^7.7.4", - "valibot": "^1.2.0", + "tiny-invariant": "^1.3.3", "vite-bundle-analyzer": "^1.2.1", "vite-tsconfig-paths": "^5.0.1", - "xstate": "^5.25.0", - "zod": "^4.3.5", + "zod": "^4.0.17", "zustand": "^4.5.2" }, "devDependencies": { "@content-collections/core": "^0.8.2", "@content-collections/vite": "^0.2.4", - "@eslint/js": "^9.39.1", - "@playwright/test": "^1.57.0", "@shikijs/transformers": "^1.10.3", - "@types/express": "^5.0.3", - "@types/hast": "^3.0.4", "@types/node": "^24.3.0", - "@types/pg": "^8.15.6", - "@types/react": "^19.2.10", - "@types/react-dom": "19.2.3", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", "@types/remove-markdown": "^0.3.4", - "@types/tar-stream": "^3.1.4", - "@types/three": "^0.182.0", "autoprefixer": "^10.4.18", "dotenv-cli": "^8.0.0", - "drizzle-kit": "^0.31.7", - "eslint": "^9.39.1", - "eslint-plugin-jsx-a11y": "^6.10.0", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^7.0.1", - "husky": "^9.1.7", + "eslint": "^8.57.0", + "eslint-plugin-unicorn": "^49.0.0", "npm-run-all": "^4.1.5", "postcss": "^8.4.35", - "prettier": "^3.7.4", - "source-map-explorer": "^2.5.3", + "prettier": "^2.8.8", "tailwindcss": "^4.1.11", - "tailwindcss-animate": "^1.0.7", - "tsx": "^4.21.0", "typescript": "^5.6.3", - "typescript-eslint": "^8.48.1", "vite": "^7.0.0" }, "engines": { "node": ">=18.0.0" }, - "pnpm": { + "_pnpm": { "overrides": { - "cross-spawn": ">=6.0.6", - "glob": ">=10.5.0", - "node-forge": ">=1.3.2", - "jws": ">=3.2.3", - "qs": ">=6.14.1", - "js-yaml": "^3.14.2", - "brace-expansion": ">=1.1.12" + "@tanstack/react-router": "file:../router/packages/react-router", + "@tanstack/react-router-devtools": "file:../router/packages/router-devtools", + "@tanstack/react-start": "file:../router/packages/react-start", + "@tanstack/history": "file:../router/packages/history", + "@tanstack/react-store": "file:../router/packages/react-router/node_modules/@tanstack/react-store", + "@tanstack/router-vite-plugin": "file:../router/packages/router-vite-plugin", + "@tanstack/router-generator": "file:../router/packages/router-generator" } } } diff --git a/playwright.config.ts b/playwright.config.ts deleted file mode 100644 index b99535f74..000000000 --- a/playwright.config.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { defineConfig } from '@playwright/test' - -const port = process.env.PORT || '3000' -const baseURL = `http://localhost:${port}` - -export default defineConfig({ - testDir: './tests', - testMatch: '**/*.spec.ts', - fullyParallel: true, - forbidOnly: !!process.env.CI, - retries: 0, - workers: 1, - reporter: 'list', - timeout: 30000, - use: { - baseURL, - trace: 'off', - video: 'off', - screenshot: 'off', - }, - webServer: { - command: `PORT=${port} pnpm dev`, - url: baseURL, - reuseExistingServer: !process.env.CI, - timeout: 120000, - }, - projects: [ - { - name: 'chromium', - use: { browserName: 'chromium', headless: true }, - }, - ], -}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3958f8dcb..db66b0dec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,15 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - cross-spawn: '>=6.0.6' - glob: '>=10.5.0' - node-forge: '>=1.3.2' - jws: '>=3.2.3' - qs: '>=6.14.1' - js-yaml: ^3.14.2 - brace-expansion: '>=1.1.12' - importers: .: @@ -20,331 +11,241 @@ importers: '@auth/core': specifier: 0.37.0 version: 0.37.0 + '@clerk/tanstack-react-start': + specifier: ^0.21.5 + version: 0.21.5(@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/react-start@1.132.51(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@convex-dev/auth': + specifier: ^0.0.88 + version: 0.0.88(@auth/core@0.37.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0) + '@convex-dev/better-auth': + specifier: ^0.7.15 + version: 0.7.18(@standard-schema/spec@1.0.0)(better-auth@1.3.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.2) + '@convex-dev/react-query': + specifier: 0.0.0-alpha.11 + version: 0.0.0-alpha.11(@standard-schema/spec@1.0.0)(@tanstack/react-query@5.90.2(react@19.0.0))(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@4.0.17) + '@erquhart/convex-oss-stats': + specifier: ^0.8.1 + version: 0.8.1(@standard-schema/spec@1.0.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@4.0.17) '@floating-ui/react': specifier: ^0.27.8 - version: 0.27.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@hono/mcp': - specifier: ^0.2.3 - version: 0.2.3(@modelcontextprotocol/sdk@1.25.2(hono@4.11.3)(zod@4.3.5))(hono-rate-limiter@0.4.2(hono@4.11.3))(hono@4.11.3)(zod@4.3.5) - '@modelcontextprotocol/sdk': - specifier: ^1.25.2 - version: 1.25.2(hono@4.11.3)(zod@4.3.5) - '@netlify/functions': - specifier: ^5.1.0 - version: 5.1.0 - '@netlify/neon': - specifier: ^0.1.0 - version: 0.1.0 + version: 0.27.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@headlessui/react': + specifier: 1.7.18 + version: 1.7.18(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@netlify/vite-plugin-tanstack-start': specifier: ^1.0.2 - version: 1.0.2(@tanstack/react-start@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(babel-plugin-macros@3.1.0)(rollup@4.53.3)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 1.0.2(@tanstack/react-start@1.132.51(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)))(babel-plugin-macros@3.1.0)(rollup@4.52.2)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) '@number-flow/react': specifier: ^0.4.1 - version: 0.4.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 0.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@observablehq/plot': specifier: ^0.6.17 version: 0.6.17 '@octokit/graphql': specifier: ^7.0.2 version: 7.0.2 - '@radix-ui/react-dialog': - specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@octokit/rest': + specifier: ^20.0.2 + version: 20.0.2 + '@orama/react-components': + specifier: ^0.1.23 + version: 0.1.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-dropdown-menu': specifier: ^2.1.12 - version: 2.1.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 2.1.12(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-select': + specifier: ^2.2.2 + version: 2.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-toast': specifier: ^1.2.2 - version: 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-tooltip': - specifier: ^1.2.8 - version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@react-three/drei': - specifier: ^10.7.7 - version: 10.7.7(@react-three/fiber@9.5.0(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(three@0.182.0))(@types/react@19.2.10)(@types/three@0.182.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(three@0.182.0) - '@react-three/fiber': - specifier: ^9.5.0 - version: 9.5.0(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(three@0.182.0) - '@sentry/node': - specifier: ^10.42.0 - version: 10.42.0 - '@sentry/tanstackstart-react': - specifier: ^10.43.0 - version: 10.43.0(react@19.2.3)(rollup@4.53.3) - '@stackblitz/sdk': - specifier: ^1.11.0 - version: 1.11.0 + version: 1.2.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@remix-run/node': + specifier: ^2.8.1 + version: 2.8.1(typescript@5.9.2) + '@sentry/react': + specifier: ^8.35.0 + version: 8.35.0(react@19.0.0) + '@sentry/vite-plugin': + specifier: ^2.22.6 + version: 2.22.6 '@tailwindcss/typography': specifier: ^0.5.13 version: 0.5.13(tailwindcss@4.1.11) '@tailwindcss/vite': specifier: ^4.1.11 - version: 4.1.11(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - '@tanstack/create': - specifier: ^0.49.1 - version: 0.49.1(tslib@2.8.1) - '@tanstack/pacer': - specifier: ^0.16.4 - version: 0.16.4 - '@tanstack/react-hotkeys': - specifier: ^0.0.2 - version: 0.0.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 4.1.11(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) '@tanstack/react-pacer': - specifier: ^0.17.4 - version: 0.17.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^0.16.3 + version: 0.16.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tanstack/react-query': - specifier: ^5.90.12 - version: 5.90.12(react@19.2.3) + specifier: ^5.90.2 + version: 5.90.2(react@19.0.0) '@tanstack/react-router': - specifier: 1.157.16 - version: 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: 1.132.47 + version: 1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tanstack/react-router-devtools': - specifier: 1.157.16 - version: 1.157.16(@tanstack/react-router@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.157.16)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-router-ssr-query': - specifier: 1.157.16 - version: 1.157.16(@tanstack/query-core@5.90.12)(@tanstack/react-query@5.90.12(react@19.2.3))(@tanstack/react-router@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.157.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: 1.132.51 + version: 1.132.51(@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.132.47)(@types/node@24.3.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1) + '@tanstack/react-router-with-query': + specifier: 1.130.17 + version: 1.130.17(@tanstack/react-query@5.90.2(react@19.0.0))(@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.132.47)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tanstack/react-start': - specifier: 1.157.16 - version: 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + specifier: 1.132.51 + version: 1.132.51(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) '@tanstack/react-table': specifier: ^8.21.3 - version: 8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 8.21.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@types/d3': specifier: ^7.4.3 version: 7.4.3 - '@uploadthing/react': - specifier: ^7.3.3 - version: 7.3.3(react@19.2.3)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11)) + '@typescript-eslint/parser': + specifier: ^7.2.0 + version: 7.2.0(eslint@8.57.0)(typescript@5.9.2) '@visx/hierarchy': specifier: ^2.10.0 - version: 2.17.0(react@19.2.3) + version: 2.17.0(react@19.0.0) '@visx/responsive': specifier: ^2.10.0 - version: 2.17.0(react@19.2.3) + version: 2.17.0(react@19.0.0) '@vitejs/plugin-react': specifier: ^4.3.3 - version: 4.3.4(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - '@webcontainer/api': - specifier: ^1.6.1 - version: 1.6.1 - '@xstate/react': - specifier: ^6.0.0 - version: 6.0.0(@types/react@19.2.10)(react@19.2.3)(xstate@5.25.0) + version: 4.3.4(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) algoliasearch: specifier: ^5.23.4 version: 5.23.4 - cheerio: - specifier: ^1.1.2 - version: 1.1.2 + axios: + specifier: ^1.6.7 + version: 1.7.8 + better-auth: + specifier: ^1.3.7 + version: 1.3.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + convex: + specifier: ^1.25.4 + version: 1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + convex-oss-stats: + specifier: link:../../../erquhart/convex-oss-stats + version: link:../../../erquhart/convex-oss-stats d3: specifier: ^7.9.0 version: 7.9.0 date-fns: specifier: ^2.30.0 version: 2.30.0 - discord-interactions: - specifier: ^4.4.0 - version: 4.4.0 - drizzle-orm: - specifier: ^0.44.7 - version: 0.44.7(@neondatabase/serverless@0.10.4)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.5)(postgres@3.4.7) - eslint-plugin-jsx-a11y: - specifier: ^6.10.2 - version: 6.10.2(eslint@9.39.1(jiti@2.6.0)) + downshift: + specifier: ^9.0.9 + version: 9.0.9(react@19.0.0) + eslint-config-react-app: + specifier: ^7.0.1 + version: 7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.3))(eslint@8.57.0)(typescript@5.9.2) gray-matter: specifier: ^4.0.3 version: 4.0.3 - hast-util-is-element: - specifier: ^3.0.0 - version: 3.0.0 - hast-util-to-string: - specifier: ^3.0.1 - version: 3.0.1 - hono: - specifier: ^4.11.3 - version: 4.11.3 html-react-parser: specifier: ^5.1.10 - version: 5.1.10(@types/react@19.2.10)(react@19.2.3) - jszip: - specifier: ^3.10.1 - version: 3.10.1 + version: 5.1.10(@types/react@18.3.12)(react@19.0.0) + import-meta-resolve: + specifier: ^4.0.0 + version: 4.1.0 lru-cache: specifier: ^7.13.1 version: 7.18.3 - lucide-react: - specifier: ^0.561.0 - version: 0.561.0(react@19.2.3) - match-sorter: - specifier: ^8.2.0 - version: 8.2.0 + marked: + specifier: ^13.0.2 + version: 13.0.2 + marked-alert: + specifier: ^2.0.1 + version: 2.0.1(marked@13.0.2) + marked-gfm-heading-id: + specifier: ^4.0.0 + version: 4.0.0(marked@13.0.2) mermaid: specifier: ^11.11.0 version: 11.11.0 - postgres: - specifier: ^3.4.7 - version: 3.4.7 - posthog-node: - specifier: ^5.20.0 - version: 5.20.0 + qss: + specifier: ^3.0.0 + version: 3.0.0 react: - specifier: 19.2.3 - version: 19.2.3 + specifier: ^19.0.0 + version: 19.0.0 react-colorful: specifier: ^5.6.1 - version: 5.6.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 5.6.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react-dom: - specifier: 19.2.3 - version: 19.2.3(react@19.2.3) - react-easy-crop: - specifier: ^5.5.6 - version: 5.5.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + react-icons: + specifier: ^5.3.0 + version: 5.3.0(react@19.0.0) react-instantsearch: specifier: '7' - version: 7.15.5(algoliasearch@5.23.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - rehype-autolink-headings: - specifier: ^7.1.0 - version: 7.1.0 - rehype-callouts: - specifier: ^2.1.2 - version: 2.1.2 - rehype-parse: - specifier: ^9.0.1 - version: 9.0.1 - rehype-raw: - specifier: ^7.0.0 - version: 7.0.0 - rehype-slug: - specifier: ^6.0.0 - version: 6.0.0 - rehype-stringify: - specifier: ^10.0.1 - version: 10.0.1 - remark-gfm: - specifier: ^4.0.1 - version: 4.0.1 - remark-parse: - specifier: ^11.0.0 - version: 11.0.0 - remark-rehype: - specifier: ^11.1.2 - version: 11.1.2 + version: 7.15.5(algoliasearch@5.23.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-markdown: + specifier: ^6.0.3 + version: 6.0.3(@types/react@18.3.12)(react@19.0.0) + remix-utils: + specifier: ^8.5.0 + version: 8.5.0(@oslojs/crypto@1.0.1)(@oslojs/encoding@1.1.0)(react@19.0.0)(zod@4.0.17) remove-markdown: specifier: ^0.5.0 version: 0.5.0 - resend: - specifier: ^6.6.0 - version: 6.6.0 shiki: specifier: ^1.4.0 version: 1.10.3 tailwind-merge: specifier: ^1.14.0 version: 1.14.0 - tar-stream: - specifier: ^3.1.8 - version: 3.1.8 - three: - specifier: ^0.182.0 - version: 0.182.0 - troika-three-text: - specifier: ^0.52.4 - version: 0.52.4(three@0.182.0) - unified: - specifier: ^11.0.5 - version: 11.0.5 - unist-util-visit: - specifier: ^5.0.0 - version: 5.0.0 - uploadthing: - specifier: ^7.7.4 - version: 7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11) - valibot: - specifier: ^1.2.0 - version: 1.2.0(typescript@5.9.2) + tiny-invariant: + specifier: ^1.3.3 + version: 1.3.3 vite-bundle-analyzer: specifier: ^1.2.1 version: 1.2.1 vite-tsconfig-paths: specifier: ^5.0.1 - version: 5.0.1(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - xstate: - specifier: ^5.25.0 - version: 5.25.0 + version: 5.0.1(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) zod: - specifier: ^4.3.5 - version: 4.3.5 + specifier: ^4.0.17 + version: 4.0.17 zustand: specifier: ^4.5.2 - version: 4.5.2(@types/react@19.2.10)(react@19.2.3) + version: 4.5.2(@types/react@18.3.12)(react@19.0.0) devDependencies: '@content-collections/core': specifier: ^0.8.2 version: 0.8.2(typescript@5.9.2) '@content-collections/vite': specifier: ^0.2.4 - version: 0.2.4(@content-collections/core@0.8.2(typescript@5.9.2))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - '@eslint/js': - specifier: ^9.39.1 - version: 9.39.1 - '@playwright/test': - specifier: ^1.57.0 - version: 1.57.0 + version: 0.2.4(@content-collections/core@0.8.2(typescript@5.9.2))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) '@shikijs/transformers': specifier: ^1.10.3 version: 1.10.3 - '@types/express': - specifier: ^5.0.3 - version: 5.0.6 - '@types/hast': - specifier: ^3.0.4 - version: 3.0.4 '@types/node': specifier: ^24.3.0 version: 24.3.0 - '@types/pg': - specifier: ^8.15.6 - version: 8.15.6 '@types/react': - specifier: ^19.2.10 - version: 19.2.10 + specifier: ^18.3.12 + version: 18.3.12 '@types/react-dom': - specifier: 19.2.3 - version: 19.2.3(@types/react@19.2.10) + specifier: ^18.3.1 + version: 18.3.1 '@types/remove-markdown': specifier: ^0.3.4 version: 0.3.4 - '@types/tar-stream': - specifier: ^3.1.4 - version: 3.1.4 - '@types/three': - specifier: ^0.182.0 - version: 0.182.0 autoprefixer: specifier: ^10.4.18 version: 10.4.18(postcss@8.5.6) dotenv-cli: specifier: ^8.0.0 version: 8.0.0 - drizzle-kit: - specifier: ^0.31.7 - version: 0.31.7 eslint: - specifier: ^9.39.1 - version: 9.39.1(jiti@2.6.0) - eslint-plugin-react: - specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.1(jiti@2.6.0)) - eslint-plugin-react-hooks: - specifier: ^7.0.1 - version: 7.0.1(eslint@9.39.1(jiti@2.6.0)) - husky: - specifier: ^9.1.7 - version: 9.1.7 + specifier: ^8.57.0 + version: 8.57.0 + eslint-plugin-unicorn: + specifier: ^49.0.0 + version: 49.0.0(eslint@8.57.0) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -352,29 +253,17 @@ importers: specifier: ^8.4.35 version: 8.5.6 prettier: - specifier: ^3.7.4 - version: 3.7.4 - source-map-explorer: - specifier: ^2.5.3 - version: 2.5.3 + specifier: ^2.8.8 + version: 2.8.8 tailwindcss: specifier: ^4.1.11 version: 4.1.11 - tailwindcss-animate: - specifier: ^1.0.7 - version: 1.0.7(tailwindcss@4.1.11) - tsx: - specifier: ^4.21.0 - version: 4.21.0 typescript: specifier: ^5.6.3 version: 5.9.2 - typescript-eslint: - specifier: ^8.48.1 - version: 8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2) vite: specifier: ^7.0.0 - version: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) packages: @@ -461,56 +350,93 @@ packages: nodemailer: optional: true - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} '@babel/compat-data@7.27.5': resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} engines: {node: '>=6.9.0'} '@babel/core@7.28.4': resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} - engines: {node: '>=6.9.0'} + '@babel/eslint-parser@7.23.10': + resolution: {integrity: sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 '@babel/generator@7.28.3': resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.0': - resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.22.15': + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.5.0': + resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-define-polyfill-provider@0.6.1': + resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + 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.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} '@babel/helper-module-transforms@7.28.3': @@ -519,16 +445,34 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.22.20': + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.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-split-export-declaration@7.24.5': + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -537,20 +481,20 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + '@babel/helper-wrap-function@7.22.20': + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.3': + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} '@babel/parser@7.28.3': @@ -563,814 +507,1257 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3': + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3': + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.13.0 - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7': + resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + '@babel/plugin-proposal-class-properties@7.18.6': + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + '@babel/plugin-proposal-decorators@7.24.0': + resolution: {integrity: sha512-LiT1RqZWeij7X+wGxCoYh3/3b8nVOX6/7BZ9wiQgAIyjoeQWdROaodJCgT+dwtbjHaz0r7bEbHJzjSbVfcOyjQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.24.5': - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + '@babel/plugin-proposal-numeric-separator@7.18.6': + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + '@babel/plugin-proposal-optional-chaining@7.21.0': + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + '@babel/plugin-proposal-private-methods@7.18.6': + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/traverse@7.28.3': - resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + '@babel/plugin-proposal-private-property-in-object@7.21.11': + resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/traverse@7.28.4': - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/types@7.28.2': - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + '@babel/plugin-syntax-decorators@7.24.0': + resolution: {integrity: sha512-MXW3pQCu9gUiVGzqkGqsgiINDVYXoAnrY8FYF/rmb+OfufNF0zHMpHPN4ulRrinxYT8Vk/aZJxYqOKsDECjKAw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.27.1': + resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/plugin-syntax-import-assertions@7.23.3': + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/plugin-syntax-import-attributes@7.23.3': + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@braintree/sanitize-url@7.1.1': - resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@chevrotain/cst-dts-gen@11.0.3': - resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@chevrotain/gast@11.0.3': - resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + '@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 - '@chevrotain/regexp-to-ast@11.0.3': - resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@chevrotain/types@11.0.3': - resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@chevrotain/utils@11.0.3': - resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@content-collections/core@0.8.2': - resolution: {integrity: sha512-62yVC3ne47YJ1KeCw5nk0H/G/xGBagcoWyMpVyTaCnDJhoIoTvmqBrsc+78Zk8s2Ssnb0Eo1Q4w3ZHwgL88pjg==} + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: - typescript: ^5.0.2 + '@babel/core': ^7.0.0-0 - '@content-collections/integrations@0.2.1': - resolution: {integrity: sha512-AyEcS2MmcOXSYt6vNmJsAiu6EBYjtNiwYGUVUmpG3llm8Gt8uiNrhIhlHyv3cuk+N8KJ2PWemLcMqtQJ+sW3bA==} + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: - '@content-collections/core': 0.x + '@babel/core': ^7.0.0-0 - '@content-collections/vite@0.2.4': - resolution: {integrity: sha512-3+n7pUnUMyjVasZLyxoUEU9VtJigWN/REliCyvAjsm0obv+6UpHAiRrkuLhn9luKAiHw4PRcFIJefBGz4i8Uzw==} + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@content-collections/core': ^0.x - vite: ^5 + '@babel/core': ^7.0.0-0 - '@dabh/diagnostics@2.0.8': - resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@dependents/detective-less@5.0.1': - resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} - engines: {node: '>=18'} + '@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 - '@dimforge/rapier3d-compat@0.12.0': - resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==} + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@drizzle-team/brocli@0.10.2': - resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + '@babel/plugin-transform-arrow-functions@7.23.3': + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@effect/platform@0.90.3': - resolution: {integrity: sha512-XvQ37yzWQKih4Du2CYladd1i/MzqtgkTPNCaN6Ku6No4CK83hDtXIV/rP03nEoBg2R3Pqgz6gGWmE2id2G81HA==} + '@babel/plugin-transform-async-generator-functions@7.23.9': + resolution: {integrity: sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==} + engines: {node: '>=6.9.0'} peerDependencies: - effect: ^3.17.7 + '@babel/core': ^7.0.0-0 - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@babel/plugin-transform-async-to-generator@7.23.3': + resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@envelop/instrumentation@1.0.0': - resolution: {integrity: sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==} - engines: {node: '>=18.0.0'} + '@babel/plugin-transform-block-scoped-functions@7.23.3': + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild-kit/core-utils@3.3.2': - resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - deprecated: 'Merged into tsx: https://tsx.is' + '@babel/plugin-transform-block-scoping@7.23.4': + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild-kit/esm-loader@2.6.5': - resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} - deprecated: 'Merged into tsx: https://tsx.is' + '@babel/plugin-transform-class-properties@7.23.3': + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/aix-ppc64@0.25.10': - resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + '@babel/plugin-transform-class-static-block@7.23.4': + resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + '@babel/plugin-transform-classes@7.23.8': + resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/aix-ppc64@0.27.0': - resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + '@babel/plugin-transform-computed-properties@7.23.3': + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm64@0.18.20': - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] + '@babel/plugin-transform-destructuring@7.23.3': + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm64@0.25.10': - resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] + '@babel/plugin-transform-dotall-regex@7.23.3': + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] + '@babel/plugin-transform-duplicate-keys@7.23.3': + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm64@0.27.0': - resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] + '@babel/plugin-transform-dynamic-import@7.23.4': + resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm@0.18.20': - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] + '@babel/plugin-transform-exponentiation-operator@7.23.3': + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm@0.25.10': - resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] + '@babel/plugin-transform-export-namespace-from@7.23.4': + resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] + '@babel/plugin-transform-flow-strip-types@7.23.3': + resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-arm@0.27.0': - resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] + '@babel/plugin-transform-for-of@7.23.6': + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-x64@0.18.20': - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] + '@babel/plugin-transform-function-name@7.23.3': + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-x64@0.25.10': - resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] + '@babel/plugin-transform-json-strings@7.23.4': + resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] + '@babel/plugin-transform-literals@7.23.3': + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/android-x64@0.27.0': - resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] + '@babel/plugin-transform-logical-assignment-operators@7.23.4': + resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/darwin-arm64@0.18.20': - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] + '@babel/plugin-transform-member-expression-literals@7.23.3': + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/darwin-arm64@0.25.10': - resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + '@babel/plugin-transform-modules-amd@7.23.3': + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + '@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 - '@esbuild/darwin-arm64@0.27.0': - resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + '@babel/plugin-transform-modules-systemjs@7.23.9': + resolution: {integrity: sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/darwin-x64@0.18.20': - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] + '@babel/plugin-transform-modules-umd@7.23.3': + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/darwin-x64@0.25.10': - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] + '@babel/plugin-transform-new-target@7.23.3': + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/darwin-x64@0.27.0': - resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4': + resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/freebsd-arm64@0.18.20': - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] + '@babel/plugin-transform-numeric-separator@7.23.4': + resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/freebsd-arm64@0.25.10': - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + '@babel/plugin-transform-object-rest-spread@7.24.0': + resolution: {integrity: sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + '@babel/plugin-transform-object-super@7.23.3': + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/freebsd-arm64@0.27.0': - resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] + '@babel/plugin-transform-optional-catch-binding@7.23.4': + resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/freebsd-x64@0.18.20': - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] + '@babel/plugin-transform-optional-chaining@7.23.4': + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/freebsd-x64@0.25.10': - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] + '@babel/plugin-transform-parameters@7.23.3': + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] + '@babel/plugin-transform-private-methods@7.23.3': + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/freebsd-x64@0.27.0': - resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] + '@babel/plugin-transform-private-property-in-object@7.23.4': + resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-arm64@0.18.20': - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] + '@babel/plugin-transform-property-literals@7.23.3': + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-arm64@0.25.10': - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + '@babel/plugin-transform-react-display-name@7.23.3': + resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + '@babel/plugin-transform-react-jsx-development@7.22.5': + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-arm64@0.27.0': - resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-arm@0.18.20': - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-arm@0.25.10': - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] + '@babel/plugin-transform-react-pure-annotations@7.23.3': + resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-arm@0.27.0': - resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] + '@babel/plugin-transform-regenerator@7.23.3': + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-ia32@0.18.20': - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] + '@babel/plugin-transform-reserved-words@7.23.3': + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-ia32@0.25.10': - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] + '@babel/plugin-transform-runtime@7.24.0': + resolution: {integrity: sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] + '@babel/plugin-transform-shorthand-properties@7.23.3': + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-ia32@0.27.0': - resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] + '@babel/plugin-transform-spread@7.23.3': + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-loong64@0.18.20': - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] + '@babel/plugin-transform-sticky-regex@7.23.3': + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-loong64@0.25.10': - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] + '@babel/plugin-transform-template-literals@7.23.3': + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] + '@babel/plugin-transform-typeof-symbol@7.23.3': + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-loong64@0.27.0': - resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] + '@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 - '@esbuild/linux-mips64el@0.18.20': - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] + '@babel/plugin-transform-unicode-escapes@7.23.3': + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-mips64el@0.25.10': - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] + '@babel/plugin-transform-unicode-property-regex@7.23.3': + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] + '@babel/plugin-transform-unicode-regex@7.23.3': + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-mips64el@0.27.0': - resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] + '@babel/plugin-transform-unicode-sets-regex@7.23.3': + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@esbuild/linux-ppc64@0.18.20': - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] + '@babel/preset-env@7.24.0': + resolution: {integrity: sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-ppc64@0.25.10': - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] + '@babel/preset-react@7.23.3': + resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-ppc64@0.27.0': - resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@esbuild/linux-riscv64@0.18.20': - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - '@esbuild/linux-riscv64@0.25.10': - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] + '@babel/runtime@7.24.5': + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + engines: {node: '>=6.9.0'} - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} - '@esbuild/linux-riscv64@0.27.0': - resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} - '@esbuild/linux-s390x@0.18.20': - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} - '@esbuild/linux-s390x@0.25.10': - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} - '@esbuild/linux-s390x@0.27.0': - resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] + '@better-auth/utils@0.2.6': + resolution: {integrity: sha512-3y/vaL5Ox33dBwgJ6ub3OPkVqr6B5xL2kgxNHG8eHZuryLyG/4JSPGqjbdRSgjuy9kALUZYDFl+ORIAxlWMSuA==} - '@esbuild/linux-x64@0.18.20': - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] + '@better-fetch/fetch@1.1.18': + resolution: {integrity: sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA==} - '@esbuild/linux-x64@0.25.10': - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} - '@esbuild/linux-x64@0.27.0': - resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} - '@esbuild/netbsd-arm64@0.25.10': - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} - '@esbuild/netbsd-arm64@0.27.0': - resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} - '@esbuild/netbsd-x64@0.18.20': - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] + '@clerk/backend@2.9.4': + resolution: {integrity: sha512-2FpeEeDopQ0fLCuvq5m7p31juR8qIqrRAnf9NzCnAtHt0uwYqpxNhIxQrRGQ8dElsMQshItkf1pYngVRNsODLQ==} + engines: {node: '>=18.17.0'} - '@esbuild/netbsd-x64@0.25.10': - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] + '@clerk/clerk-react@5.43.1': + resolution: {integrity: sha512-JXZo212wXQN+KcAYMEWMoFEZ5br6LABE1eY+xg3PlUX8TK88UY6B6WKqPJE5uKpIqom7dUbwhER03oc1Hh8+1w==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] + '@clerk/clerk-react@5.48.1': + resolution: {integrity: sha512-RXaP5+LzgHURWXmunCj129s79qFLuvsKFu7JHBhvClP6FhY/UbgHi5jaIwvDh5JpmTtuvcTZsBViqQgxPoxOvQ==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - '@esbuild/netbsd-x64@0.27.0': - resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] + '@clerk/shared@3.22.0': + resolution: {integrity: sha512-qBtWjnqST0a+sYRArkFwyCwlAM5NxyZvbicz6uvQnq0ZuFQwoGzYiZ0V47kJ+rc6c2jz3qAd8GR1h0hUtfI5cg==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true - '@esbuild/openbsd-arm64@0.25.10': - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] + '@clerk/shared@3.26.1': + resolution: {integrity: sha512-84dAJutr7JAwKwRI0fRj6mFy3D521okNIiCkJ+ffMp0lniQr5IXQSFqkCEd+cQ3bImr1YHKCGVMLkahZI6s9Ng==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] + '@clerk/tanstack-react-start@0.21.5': + resolution: {integrity: sha512-/xsWsz70P9B/+lw1rZH/B9fB69Uf/NMwowQBokwFw6ncXutXFxeD5CH1JE8j41ooqoNDHTq9rT0Wv6+CduM2bQ==} + engines: {node: '>=18.17.0'} + peerDependencies: + '@tanstack/react-router': ^1.127.0 + '@tanstack/react-start': ^1.127.0 + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - '@esbuild/openbsd-arm64@0.27.0': - resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] + '@clerk/types@4.81.0': + resolution: {integrity: sha512-uSVAKUmYiFy2POXP3jNh7iCqdbEpzQe+IjY6MWiI5eYjMXR1l+TwYbU0r3IqnTzAzwm8TlklkpTaeR5ZXKW1Gw==} + engines: {node: '>=18.17.0'} - '@esbuild/openbsd-x64@0.18.20': - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] + '@clerk/types@4.88.0': + resolution: {integrity: sha512-OAepuiszOrheIThdCtBRiRSq0A3grlD2yhUUO8kvMFv4Uys95gSzkzuvQjUWXZZ23yOdTl6eRUXjtjCGto116w==} + engines: {node: '>=18.17.0'} - '@esbuild/openbsd-x64@0.25.10': - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] + '@content-collections/core@0.8.2': + resolution: {integrity: sha512-62yVC3ne47YJ1KeCw5nk0H/G/xGBagcoWyMpVyTaCnDJhoIoTvmqBrsc+78Zk8s2Ssnb0Eo1Q4w3ZHwgL88pjg==} + peerDependencies: + typescript: ^5.0.2 - '@esbuild/openbsd-x64@0.27.0': - resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] + '@content-collections/integrations@0.2.1': + resolution: {integrity: sha512-AyEcS2MmcOXSYt6vNmJsAiu6EBYjtNiwYGUVUmpG3llm8Gt8uiNrhIhlHyv3cuk+N8KJ2PWemLcMqtQJ+sW3bA==} + peerDependencies: + '@content-collections/core': 0.x - '@esbuild/openharmony-arm64@0.25.10': - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] + '@content-collections/vite@0.2.4': + resolution: {integrity: sha512-3+n7pUnUMyjVasZLyxoUEU9VtJigWN/REliCyvAjsm0obv+6UpHAiRrkuLhn9luKAiHw4PRcFIJefBGz4i8Uzw==} + peerDependencies: + '@content-collections/core': ^0.x + vite: ^5 - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + '@convex-dev/auth@0.0.83': + resolution: {integrity: sha512-KJPI9x3U1KcHNE/7pA7B92sVsHWpAfg6vWuO005OWNF359eRJ3ZP3W+iNfuMajZLqywudR2+oVoGDnBIFrM63A==} + hasBin: true + peerDependencies: + '@auth/core': ^0.37.0 + convex: ^1.17.0 + react: ^18.2.0 || ^19.0.0-0 + peerDependenciesMeta: + react: + optional: true + + '@convex-dev/auth@0.0.88': + resolution: {integrity: sha512-D1uMuBEQH+1h6T42yxtppivUYXEAqID5/j4aqzgXrVDnqpQJMoeSU9qM3qJaSV3psA1VClwTRj6JMrDPHLFXqQ==} + hasBin: true + peerDependencies: + '@auth/core': ^0.37.0 + convex: ^1.17.0 + react: ^18.2.0 || ^19.0.0-0 + peerDependenciesMeta: + react: + optional: true + + '@convex-dev/better-auth@0.7.18': + resolution: {integrity: sha512-lZwJcRJncmeKZfDQk7PJrJ+8z/S8rmO5rUfPWZd2gOjC+1sbd/JUZiTVPGLxeP5VEGG74TkRTUavK7s+wmKhwg==} + peerDependencies: + better-auth: 1.3.8 + convex: ^1.26.2 + react: ^18.3.1 || ^19.0.0 + react-dom: ^18.3.1 || ^19.0.0 + + '@convex-dev/crons@0.1.9': + resolution: {integrity: sha512-TV7hFli9iDekLQt95HgL1YfwdjG7TnVR2E+6meWo0VztdXqYN14aqwvEOcaadtDhFfedGx32xHZBFzvfgQZkYQ==} + peerDependencies: + convex: ~1.16.5 || >=1.17.0 <1.35.0 + + '@convex-dev/react-query@0.0.0-alpha.11': + resolution: {integrity: sha512-Fy/p3JOvUUNrbBBQD0AEXcSU40PBu567gm3XRgExHkiKlv07kBOjnuXA0TvodKkryyuHLbuIxYP8XIv03i6DEw==} + peerDependencies: + '@tanstack/react-query': ^5.0.0 + convex: ^1.24.8 + + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + + '@dependents/detective-less@5.0.1': + resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} + engines: {node: '>=18'} + + '@emnapi/core@0.45.0': + resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} + + '@emnapi/runtime@0.45.0': + resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} + + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@envelop/instrumentation@1.0.0': + resolution: {integrity: sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==} + engines: {node: '>=18.0.0'} + + '@erquhart/convex-oss-stats@0.8.1': + resolution: {integrity: sha512-3U7G2tGv1dO+hg6Lpyoc2iJvhJ31xOOLAI0RBqkPhPZJ15KBi5KiKwF1CaUpX3SS1wmu0YmUzzdkzd5CKH+1fw==} + peerDependencies: + convex: ~1.16.5 || >=1.17.0 <=1.30.0 + react: ^17.0.2 || ^18.0.0 || ^19.0.0-0 + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] - os: [openharmony] + os: [android] - '@esbuild/openharmony-arm64@0.27.0': - resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} cpu: [arm64] - os: [openharmony] + os: [android] - '@esbuild/sunos-x64@0.18.20': - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@esbuild/sunos-x64@0.25.10': - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] - os: [sunos] + os: [android] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} cpu: [x64] - os: [sunos] + os: [android] - '@esbuild/sunos-x64@0.27.0': - resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] - os: [sunos] + os: [android] - '@esbuild/win32-arm64@0.18.20': - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} cpu: [arm64] - os: [win32] + os: [darwin] - '@esbuild/win32-arm64@0.25.10': - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} cpu: [arm64] - os: [win32] + os: [darwin] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] - os: [win32] + os: [darwin] - '@esbuild/win32-arm64@0.27.0': - resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [darwin] - '@esbuild/win32-ia32@0.18.20': - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - '@esbuild/win32-ia32@0.25.10': - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} - cpu: [ia32] - os: [win32] + cpu: [x64] + os: [darwin] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} - cpu: [ia32] - os: [win32] + cpu: [arm64] + os: [freebsd] - '@esbuild/win32-ia32@0.27.0': - resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} - cpu: [ia32] - os: [win32] + cpu: [arm64] + os: [freebsd] - '@esbuild/win32-x64@0.18.20': - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - '@esbuild/win32-x64@0.25.10': - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] - os: [win32] + os: [freebsd] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} cpu: [x64] - os: [win32] + os: [freebsd] - '@esbuild/win32-x64@0.27.0': - resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] - os: [win32] + os: [freebsd] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - '@fastify/accept-negotiator@2.0.1': - resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - '@fastify/busboy@3.2.0': - resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - '@fastify/otel@0.16.0': - resolution: {integrity: sha512-2304BdM5Q/kUvQC9qJO1KZq3Zn1WWsw+WWkVmFEaj1UE2hEIiuFqrPeglQOwEtw/ftngisqfQ3v70TWMmwhhHA==} - peerDependencies: - '@opentelemetry/api': ^1.9.0 + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + 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.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fastify/accept-negotiator@2.0.1': + resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} + + '@fastify/busboy@3.2.0': + resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' '@floating-ui/react@0.27.8': resolution: {integrity: sha512-EQJ4Th328y2wyHR3KzOUOoTW2UKjFk53fmyahfwExnFQ8vnsMYqKc+fFPOkeYtj5tcp1DUMiNJ7BFhed7e9ONw==} @@ -1381,27 +1768,20 @@ packages: '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - '@hono/mcp@0.2.3': - resolution: {integrity: sha512-wrYKVQSjnBg4/ZinnnP/1t3jlvP3Z9fqZv8OzuhLXV4gVTLOHOHDhnXsIwD0nFVKk2pMOvA+sDfrKyRzw4yUPg==} - peerDependencies: - '@modelcontextprotocol/sdk': ^1.25.1 - hono: '*' - hono-rate-limiter: ^0.4.2 - zod: ^3.25.0 || ^4.0.0 - - '@hono/node-server@1.19.8': - resolution: {integrity: sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==} - engines: {node: '>=18.14.1'} + '@headlessui/react@1.7.18': + resolution: {integrity: sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==} + engines: {node: '>=10'} peerDependencies: - hono: ^4 + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} + '@hexagon/base64@1.1.28': + resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} - engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -1411,9 +1791,9 @@ packages: resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} engines: {node: '>=10.10.0'} - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + deprecated: Use @eslint/object-schema instead '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} @@ -1553,14 +1933,6 @@ packages: '@import-maps/resolve@2.0.0': resolution: {integrity: sha512-RwzRTpmrrS6Q1ZhQExwuxJGK1Wqhv4stt+OF2JzS+uawewpwNyU7EJL1WpBex7aDiiGLs4FsXGkfUBdYuX7xiQ==} - '@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'} @@ -1591,188 +1963,26 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - '@jsonjoy.com/base64@17.65.0': - resolution: {integrity: sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' + '@levischuck/tiny-cbor@0.2.11': + resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} - '@jsonjoy.com/buffers@1.2.1': - resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' + '@lit-labs/ssr-dom-shim@1.2.1': + resolution: {integrity: sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==} - '@jsonjoy.com/buffers@17.65.0': - resolution: {integrity: sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' + '@lit/reactive-element@2.0.4': + resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} - '@jsonjoy.com/codegen@1.0.0': - resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/codegen@17.65.0': - resolution: {integrity: sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-core@4.56.10': - resolution: {integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-fsa@4.56.10': - resolution: {integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-builtins@4.56.10': - resolution: {integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-to-fsa@4.56.10': - resolution: {integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-utils@4.56.10': - resolution: {integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node@4.56.10': - resolution: {integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-print@4.56.10': - resolution: {integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-snapshot@4.56.10': - resolution: {integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@1.21.0': - resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@17.65.0': - resolution: {integrity: sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pointer@1.0.2': - resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pointer@17.65.0': - resolution: {integrity: sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@1.9.0': - resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@17.65.0': - resolution: {integrity: sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@juggle/resize-observer@3.4.0': - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - - '@mapbox/node-pre-gyp@2.0.0': - resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} - engines: {node: '>=18'} - hasBin: true - - '@mediapipe/tasks-vision@0.10.17': - resolution: {integrity: sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==} + '@mapbox/node-pre-gyp@2.0.0': + resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} + engines: {node: '>=18'} + hasBin: true '@mermaid-js/parser@0.6.2': resolution: {integrity: sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==} - '@modelcontextprotocol/sdk@1.25.2': - resolution: {integrity: sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true - - '@monogrid/gainmap-js@3.4.0': - resolution: {integrity: sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==} - peerDependencies: - three: '>= 0.159.0' - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} - cpu: [arm64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} - cpu: [x64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} - cpu: [arm64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} - cpu: [arm] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} - cpu: [x64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} - cpu: [x64] - os: [win32] - - '@neondatabase/serverless@0.10.4': - resolution: {integrity: sha512-2nZuh3VUO9voBauuh+IGYRhGU/MskWHt1IuZvHcJw6GLjDgtqj/KViKo7SIrLdGLdot7vFbiRRw+BgEy3wT9HA==} - '@netlify/api@14.0.6': resolution: {integrity: sha512-tlG/gqA80WeAbJFYzcLdSP7v8jg1WgtJX+kQD20rMbU+Efga5XxwaiCHgjvpLvFi5hQMe1t2bG60CudxMN1T5g==} engines: {node: '>=18.14.0'} @@ -1816,10 +2026,6 @@ packages: resolution: {integrity: sha512-TN2sijuyrEejhLfataxAKSFjFi8ZC0IMqrubg3Rz3ROBBwk54vdLwxibHxnKexou75MXsrpCotsEzm/V0xZwBA==} engines: {node: '>=18.0.0'} - '@netlify/functions@5.1.0': - resolution: {integrity: sha512-LZtiQtf/QzPHIeNDZuIBxx04kmU7lCipWqZ26ejX7mYSB3yj2wvpZfF49kD8B8FoKTydSvgFmBpIcCO5FvpEXA==} - engines: {node: '>=18.0.0'} - '@netlify/headers-parser@9.0.2': resolution: {integrity: sha512-86YEGPxVemhksY1LeSr8NSOyH11RHvYHq+FuBJnTlPZoRDX+TD+0TAxF6lwzAgVTd1VPkyFEHlNgUGqw7aNzRQ==} engines: {node: '>=18.14.0'} @@ -1832,9 +2038,6 @@ packages: resolution: {integrity: sha512-VfjimnTRvFZ+8Ul/r4AlPMjBPK7+qZZuKli/el4MVwqt7+pXKrx3YkFPwT1XtoahqNJ8Mm2bZQzM8JB34PUxrA==} engines: {node: '>=20.6.1'} - '@netlify/neon@0.1.0': - resolution: {integrity: sha512-7FlZRfpR61iePnwjamH8t8WnF7ZG87a3wnMojvBjfUYlSMGeHxawoFfI7eyqGEeUV7djuiTB8QkxB+XiPw83WA==} - '@netlify/open-api@2.39.0': resolution: {integrity: sha512-PMBktDmSRBS5act/GxHL3kvbRww5HPFZ9HIHXOrBu6vQesWYapoJaDiU/KDbqmkW1TyelGmURVcwsYr00qSAFg==} engines: {node: '>=14.8.0'} @@ -1867,10 +2070,6 @@ packages: resolution: {integrity: sha512-OcV8ivKTdsyANqVSQzbusOA7FVtE9s6zwxNCGR/aNnQaVxMUgm93UzKgfR7cZ1nnQNZHAbjd0dKJKaAUqrzbMw==} engines: {node: ^18.14.0 || >=20} - '@netlify/types@2.2.0': - resolution: {integrity: sha512-XOWlZ2wPpdRKkAOcQbjIf/Qz7L4RjcSVINVNQ9p3F6U8V6KSEOsB3fPrc6Ly8EOeJioHUepRPuzHzJE/7V5EsA==} - engines: {node: ^18.14.0 || >=20} - '@netlify/vite-plugin-tanstack-start@1.0.2': resolution: {integrity: sha512-2v21F6K28Wc7HGrGfASzs04o8xrDprHWt323+J7b1ToH7r0eC5IGkM1l3rPQlcom+TVkNvOejVlyEuqfJsr05g==} engines: {node: ^22.12.0} @@ -1895,6 +2094,190 @@ packages: engines: {node: '>=18.14.0'} hasBin: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + + '@noble/ciphers@0.6.0': + resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@node-rs/argon2-android-arm-eabi@1.7.0': + resolution: {integrity: sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@node-rs/argon2-android-arm64@1.7.0': + resolution: {integrity: sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@node-rs/argon2-darwin-arm64@1.7.0': + resolution: {integrity: sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@node-rs/argon2-darwin-x64@1.7.0': + resolution: {integrity: sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@node-rs/argon2-freebsd-x64@1.7.0': + resolution: {integrity: sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': + resolution: {integrity: sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@node-rs/argon2-linux-arm64-gnu@1.7.0': + resolution: {integrity: sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@node-rs/argon2-linux-arm64-musl@1.7.0': + resolution: {integrity: sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@node-rs/argon2-linux-x64-gnu@1.7.0': + resolution: {integrity: sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/argon2-linux-x64-musl@1.7.0': + resolution: {integrity: sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/argon2-wasm32-wasi@1.7.0': + resolution: {integrity: sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@node-rs/argon2-win32-arm64-msvc@1.7.0': + resolution: {integrity: sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@node-rs/argon2-win32-ia32-msvc@1.7.0': + resolution: {integrity: sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@node-rs/argon2-win32-x64-msvc@1.7.0': + resolution: {integrity: sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@node-rs/argon2@1.7.0': + resolution: {integrity: sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==} + engines: {node: '>= 10'} + + '@node-rs/bcrypt-android-arm-eabi@1.9.0': + resolution: {integrity: sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@node-rs/bcrypt-android-arm64@1.9.0': + resolution: {integrity: sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@node-rs/bcrypt-darwin-arm64@1.9.0': + resolution: {integrity: sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@node-rs/bcrypt-darwin-x64@1.9.0': + resolution: {integrity: sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@node-rs/bcrypt-freebsd-x64@1.9.0': + resolution: {integrity: sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': + resolution: {integrity: sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': + resolution: {integrity: sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@node-rs/bcrypt-linux-arm64-musl@1.9.0': + resolution: {integrity: sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@node-rs/bcrypt-linux-x64-gnu@1.9.0': + resolution: {integrity: sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/bcrypt-linux-x64-musl@1.9.0': + resolution: {integrity: sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/bcrypt-wasm32-wasi@1.9.0': + resolution: {integrity: sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': + resolution: {integrity: sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': + resolution: {integrity: sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@node-rs/bcrypt-win32-x64-msvc@1.9.0': + resolution: {integrity: sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@node-rs/bcrypt@1.9.0': + resolution: {integrity: sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig==} + engines: {node: '>= 10'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1917,257 +2300,223 @@ packages: resolution: {integrity: sha512-/qaXP/7mc4MUS0s4cPPFASDRjtsWp85/TbfsciqDgU1HwYixbSbbytNuInD8AcTYC3xaxACgVX06agdfQy9W+g==} engines: {node: '>=12'} - '@octokit/endpoint@9.0.2': - resolution: {integrity: sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==} + '@octokit/app@15.1.6': + resolution: {integrity: sha512-WELCamoCJo9SN0lf3SWZccf68CF0sBNPQuLYmZ/n87p5qvBJDe9aBtr5dHkh7T9nxWZ608pizwsUbypSzZAiUw==} engines: {node: '>= 18'} - '@octokit/graphql@7.0.2': - resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} + '@octokit/auth-app@7.2.2': + resolution: {integrity: sha512-p6hJtEyQDCJEPN9ijjhEC/kpFHMHN4Gca9r+8S0S8EJi7NaWftaEmexjxxpT1DFBeJpN4u/5RE22ArnyypupJw==} engines: {node: '>= 18'} - '@octokit/openapi-types@19.0.2': - resolution: {integrity: sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==} + '@octokit/auth-oauth-app@8.1.4': + resolution: {integrity: sha512-71iBa5SflSXcclk/OL3lJzdt4iFs56OJdpBGEBl1wULp7C58uiswZLV6TdRaiAzHP1LT8ezpbHlKuxADb+4NkQ==} + engines: {node: '>= 18'} - '@octokit/request-error@5.0.1': - resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} + '@octokit/auth-oauth-device@7.1.5': + resolution: {integrity: sha512-lR00+k7+N6xeECj0JuXeULQ2TSBB/zjTAmNF2+vyGPDEFx1dgk1hTDmL13MjbSmzusuAmuJD8Pu39rjp9jH6yw==} engines: {node: '>= 18'} - '@octokit/request@8.1.4': - resolution: {integrity: sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==} + '@octokit/auth-oauth-user@5.1.6': + resolution: {integrity: sha512-/R8vgeoulp7rJs+wfJ2LtXEVC7pjQTIqDab7wPKwVG6+2v/lUnCOub6vaHmysQBbb45FknM3tbHW8TOVqYHxCw==} engines: {node: '>= 18'} - '@octokit/types@12.1.1': - resolution: {integrity: sha512-qnJTldJ1NyGT5MTsCg/Zi+y2IFHZ1Jo5+njNCjJ9FcainV7LjuHgmB697kA0g4MjZeDAJsM3B45iqCVsCLVFZg==} + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} - '@oozcitak/dom@2.0.2': - resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==} - engines: {node: '>=20.0'} + '@octokit/auth-token@5.1.2': + resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} + engines: {node: '>= 18'} - '@oozcitak/infra@2.0.2': - resolution: {integrity: sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==} - engines: {node: '>=20.0'} + '@octokit/auth-unauthenticated@6.1.3': + resolution: {integrity: sha512-d5gWJla3WdSl1yjbfMpET+hUSFCE15qM0KVSB0H1shyuJihf/RL1KqWoZMIaonHvlNojkL9XtLFp8QeLe+1iwA==} + engines: {node: '>= 18'} - '@oozcitak/url@3.0.0': - resolution: {integrity: sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==} - engines: {node: '>=20.0'} + '@octokit/core@5.0.1': + resolution: {integrity: sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==} + engines: {node: '>= 18'} - '@oozcitak/util@10.0.0': - resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} - engines: {node: '>=20.0'} + '@octokit/core@6.1.6': + resolution: {integrity: sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==} + engines: {node: '>= 18'} - '@opentelemetry/api-logs@0.207.0': - resolution: {integrity: sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==} - engines: {node: '>=8.0.0'} + '@octokit/endpoint@10.1.4': + resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==} + engines: {node: '>= 18'} - '@opentelemetry/api-logs@0.208.0': - resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==} - engines: {node: '>=8.0.0'} + '@octokit/endpoint@9.0.2': + resolution: {integrity: sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==} + engines: {node: '>= 18'} - '@opentelemetry/api-logs@0.211.0': - resolution: {integrity: sha512-swFdZq8MCdmdR22jTVGQDhwqDzcI4M10nhjXkLr1EsIzXgZBqm4ZlmmcWsg3TSNf+3mzgOiqveXmBLZuDi2Lgg==} - engines: {node: '>=8.0.0'} + '@octokit/graphql-schema@15.26.0': + resolution: {integrity: sha512-SoVbh+sXe9nsoweFbLT3tAk3XWYbYLs5ku05wij1zhyQ2U3lewdrhjo5Tb7lfaOGWNHSkPZT4uuPZp8neF7P7A==} - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} + '@octokit/graphql@7.0.2': + resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} + engines: {node: '>= 18'} - '@opentelemetry/context-async-hooks@2.6.0': - resolution: {integrity: sha512-L8UyDwqpTcbkIK5cgwDRDYDoEhQoj8wp8BwsO19w3LB1Z41yEQm2VJyNfAi9DrLP/YTqXqWpKHyZfR9/tFYo1Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@octokit/graphql@8.2.2': + resolution: {integrity: sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==} + engines: {node: '>= 18'} - '@opentelemetry/core@2.5.0': - resolution: {integrity: sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@octokit/oauth-app@7.1.6': + resolution: {integrity: sha512-OMcMzY2WFARg80oJNFwWbY51TBUfLH4JGTy119cqiDawSFXSIBujxmpXiKbGWQlvfn0CxE6f7/+c6+Kr5hI2YA==} + engines: {node: '>= 18'} - '@opentelemetry/core@2.6.0': - resolution: {integrity: sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@octokit/oauth-authorization-url@7.1.1': + resolution: {integrity: sha512-ooXV8GBSabSWyhLUowlMIVd9l1s2nsOGQdlP2SQ4LnkEsGXzeCvbSbCPdZThXhEFzleGPwbapT0Sb+YhXRyjCA==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-amqplib@0.58.0': - resolution: {integrity: sha512-fjpQtH18J6GxzUZ+cwNhWUpb71u+DzT7rFkg5pLssDGaEber91Y2WNGdpVpwGivfEluMlNMZumzjEqfg8DeKXQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/oauth-methods@5.1.5': + resolution: {integrity: sha512-Ev7K8bkYrYLhoOSZGVAGsLEscZQyq7XQONCBBAl2JdMg7IT3PQn/y8P0KjloPoYpI5UylqYrLeUcScaYWXwDvw==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-connect@0.54.0': - resolution: {integrity: sha512-43RmbhUhqt3uuPnc16cX6NsxEASEtn8z/cYV8Zpt6EP4p2h9s4FNuJ4Q9BbEQ2C0YlCCB/2crO1ruVz/hWt8fA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/openapi-types@19.0.2': + resolution: {integrity: sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==} - '@opentelemetry/instrumentation-dataloader@0.28.0': - resolution: {integrity: sha512-ExXGBp0sUj8yhm6Znhf9jmuOaGDsYfDES3gswZnKr4MCqoBWQdEFn6EoDdt5u+RdbxQER+t43FoUihEfTSqsjA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/openapi-types@25.1.0': + resolution: {integrity: sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==} - '@opentelemetry/instrumentation-express@0.59.0': - resolution: {integrity: sha512-pMKV/qnHiW/Q6pmbKkxt0eIhuNEtvJ7sUAyee192HErlr+a1Jx+FZ3WjfmzhQL1geewyGEiPGkmjjAgNY8TgDA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/openapi-webhooks-types@11.0.0': + resolution: {integrity: sha512-ZBzCFj98v3SuRM7oBas6BHZMJRadlnDoeFfvm1olVxZnYeU6Vh97FhPxyS5aLh5pN51GYv2I51l/hVUAVkGBlA==} - '@opentelemetry/instrumentation-fs@0.30.0': - resolution: {integrity: sha512-n3Cf8YhG7reaj5dncGlRIU7iT40bxPOjsBEA5Bc1a1g6e9Qvb+JFJ7SEiMlPbUw4PBmxE3h40ltE8LZ3zVt6OA==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-paginate-graphql@5.2.4': + resolution: {integrity: sha512-pLZES1jWaOynXKHOqdnwZ5ULeVR6tVVCMm+AUbp0htdcyXDU95WbkYdU4R2ej1wKj5Tu94Mee2Ne0PjPO9cCyA==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': '>=6' - '@opentelemetry/instrumentation-generic-pool@0.54.0': - resolution: {integrity: sha512-8dXMBzzmEdXfH/wjuRvcJnUFeWzZHUnExkmFJ2uPfa31wmpyBCMxO59yr8f/OXXgSogNgi/uPo9KW9H7LMIZ+g==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-paginate-rest@12.0.0': + resolution: {integrity: sha512-MPd6WK1VtZ52lFrgZ0R2FlaoiWllzgqFHaSZxvp72NmoDeZ0m8GeJdg4oB6ctqMTYyrnDYp592Xma21mrgiyDA==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': '>=6' - '@opentelemetry/instrumentation-graphql@0.58.0': - resolution: {integrity: sha512-+yWVVY7fxOs3j2RixCbvue8vUuJ1inHxN2q1sduqDB0Wnkr4vOzVKRYl/Zy7B31/dcPS72D9lo/kltdOTBM3bQ==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-paginate-rest@9.1.2': + resolution: {integrity: sha512-euDbNV6fxX6btsCDnZoZM4vw3zO1nj1Z7TskHAulO6mZ9lHoFTpwll6farf+wh31mlBabgU81bBYdflp0GLVAQ==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': '>=5' - '@opentelemetry/instrumentation-hapi@0.57.0': - resolution: {integrity: sha512-Os4THbvls8cTQTVA8ApLfZZztuuqGEeqog0XUnyRW7QVF0d/vOVBEcBCk1pazPFmllXGEdNbbat8e2fYIWdFbw==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-request-log@4.0.0': + resolution: {integrity: sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': '>=5' - '@opentelemetry/instrumentation-http@0.211.0': - resolution: {integrity: sha512-n0IaQ6oVll9PP84SjbOCwDjaJasWRHi6BLsbMLiT6tNj7QbVOkuA5sk/EfZczwI0j5uTKl1awQPivO/ldVtsqA==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-rest-endpoint-methods@10.1.2': + resolution: {integrity: sha512-JztgZ82CY4JNlPTuF0jh4iWuuGpEi5czFCoXyAbMg4F2XyFBbG5DWAKfa3odRvdZww6Df1tQgBKnqpd9X0WF9g==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': '>=5' - '@opentelemetry/instrumentation-ioredis@0.59.0': - resolution: {integrity: sha512-875UxzBHWkW+P4Y45SoFM2AR8f8TzBMD8eO7QXGCyFSCUMP5s9vtt/BS8b/r2kqLyaRPK6mLbdnZznK3XzQWvw==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-rest-endpoint-methods@14.0.0': + resolution: {integrity: sha512-iQt6ovem4b7zZYZQtdv+PwgbL5VPq37th1m2x2TdkgimIDJpsi2A6Q/OI/23i/hR6z5mL0EgisNR4dcbmckSZQ==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': '>=6' - '@opentelemetry/instrumentation-kafkajs@0.20.0': - resolution: {integrity: sha512-yJXOuWZROzj7WmYCUiyT27tIfqBrVtl1/TwVbQyWPz7rL0r1Lu7kWjD0PiVeTCIL6CrIZ7M2s8eBxsTAOxbNvw==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-retry@7.2.1': + resolution: {integrity: sha512-wUc3gv0D6vNHpGxSaR3FlqJpTXGWgqmk607N9L3LvPL4QjaxDgX/1nY2mGpT37Khn+nlIXdljczkRnNdTTV3/A==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': '>=6' - '@opentelemetry/instrumentation-knex@0.55.0': - resolution: {integrity: sha512-FtTL5DUx5Ka/8VK6P1VwnlUXPa3nrb7REvm5ddLUIeXXq4tb9pKd+/ThB1xM/IjefkRSN3z8a5t7epYw1JLBJQ==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-throttling@10.0.0': + resolution: {integrity: sha512-Kuq5/qs0DVYTHZuBAzCZStCzo2nKvVRo/TDNhCcpC2TKiOGz/DisXMCvjt3/b5kr6SCI1Y8eeeJTHBxxpFvZEg==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': ^6.1.3 - '@opentelemetry/instrumentation-koa@0.59.0': - resolution: {integrity: sha512-K9o2skADV20Skdu5tG2bogPKiSpXh4KxfLjz6FuqIVvDJNibwSdu5UvyyBzRVp1rQMV6UmoIk6d3PyPtJbaGSg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.9.0 + '@octokit/request-error@5.0.1': + resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-lru-memoizer@0.55.0': - resolution: {integrity: sha512-FDBfT7yDGcspN0Cxbu/k8A0Pp1Jhv/m7BMTzXGpcb8ENl3tDj/51U65R5lWzUH15GaZA15HQ5A5wtafklxYj7g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/request-error@6.1.8': + resolution: {integrity: sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-mongodb@0.64.0': - resolution: {integrity: sha512-pFlCJjweTqVp7B220mCvCld1c1eYKZfQt1p3bxSbcReypKLJTwat+wbL2YZoX9jPi5X2O8tTKFEOahO5ehQGsA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/request@8.1.4': + resolution: {integrity: sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-mongoose@0.57.0': - resolution: {integrity: sha512-MthiekrU/BAJc5JZoZeJmo0OTX6ycJMiP6sMOSRTkvz5BrPMYDqaJos0OgsLPL/HpcgHP7eo5pduETuLguOqcg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/request@9.2.4': + resolution: {integrity: sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-mysql2@0.57.0': - resolution: {integrity: sha512-nHSrYAwF7+aV1E1V9yOOP9TchOodb6fjn4gFvdrdQXiRE7cMuffyLLbCZlZd4wsspBzVwOXX8mpURdRserAhNA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/rest@20.0.2': + resolution: {integrity: sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-mysql@0.57.0': - resolution: {integrity: sha512-HFS/+FcZ6Q7piM7Il7CzQ4VHhJvGMJWjx7EgCkP5AnTntSN5rb5Xi3TkYJHBKeR27A0QqPlGaCITi93fUDs++Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/types@12.1.1': + resolution: {integrity: sha512-qnJTldJ1NyGT5MTsCg/Zi+y2IFHZ1Jo5+njNCjJ9FcainV7LjuHgmB697kA0g4MjZeDAJsM3B45iqCVsCLVFZg==} - '@opentelemetry/instrumentation-pg@0.63.0': - resolution: {integrity: sha512-dKm/ODNN3GgIQVlbD6ZPxwRc3kleLf95hrRWXM+l8wYo+vSeXtEpQPT53afEf6VFWDVzJK55VGn8KMLtSve/cg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/types@14.1.0': + resolution: {integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==} - '@opentelemetry/instrumentation-redis@0.59.0': - resolution: {integrity: sha512-JKv1KDDYA2chJ1PC3pLP+Q9ISMQk6h5ey+99mB57/ARk0vQPGZTTEb4h4/JlcEpy7AYT8HIGv7X6l+br03Neeg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/webhooks-methods@5.1.1': + resolution: {integrity: sha512-NGlEHZDseJTCj8TMMFehzwa9g7On4KJMPVHDSrHxCQumL6uSQR8wIkP/qesv52fXqV1BPf4pTxwtS31ldAt9Xg==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-tedious@0.30.0': - resolution: {integrity: sha512-bZy9Q8jFdycKQ2pAsyuHYUHNmCxCOGdG6eg1Mn75RvQDccq832sU5OWOBnc12EFUELI6icJkhR7+EQKMBam2GA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/webhooks@13.9.1': + resolution: {integrity: sha512-Nss2b4Jyn4wB3EAqAPJypGuCJFalz/ZujKBQQ5934To7Xw9xjf4hkr/EAByxQY7hp7MKd790bWGz7XYSTsHmaw==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-undici@0.21.0': - resolution: {integrity: sha512-gok0LPUOTz2FQ1YJMZzaHcOzDFyT64XJ8M9rNkugk923/p6lDGms/cRW1cqgqp6N6qcd6K6YdVHwPEhnx9BWbw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.7.0 + '@oozcitak/dom@1.15.10': + resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} + engines: {node: '>=8.0'} - '@opentelemetry/instrumentation@0.207.0': - resolution: {integrity: sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@oozcitak/infra@1.0.8': + resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} + engines: {node: '>=6.0'} - '@opentelemetry/instrumentation@0.208.0': - resolution: {integrity: sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@oozcitak/url@1.0.4': + resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} + engines: {node: '>=8.0'} - '@opentelemetry/instrumentation@0.211.0': - resolution: {integrity: sha512-h0nrZEC/zvI994nhg7EgQ8URIHt0uDTwN90r3qQUdZORS455bbx+YebnGeEuFghUT0HlJSrLF4iHw67f+odY+Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@oozcitak/util@8.3.8': + resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} + engines: {node: '>=8.0'} - '@opentelemetry/redis-common@0.38.2': - resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} - engines: {node: ^18.19.0 || >=20.6.0} + '@orama/cuid2@2.2.3': + resolution: {integrity: sha512-Lcak3chblMejdlSHgYU2lS2cdOhDpU6vkfIJH4m+YKvqQyLqs1bB8+w6NT1MG5bO12NUK2GFc34Mn2xshMIQ1g==} - '@opentelemetry/resources@2.6.0': - resolution: {integrity: sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==} - engines: {node: ^18.19.0 || >=20.6.0} + '@orama/highlight@0.1.8': + resolution: {integrity: sha512-w3TvtWUKYlf/NoujoyEs38nJRi1lkwxdOXntXDYB9cfHzx+s+iPrps70YwFRRJu9TcHW8ffz503b0E6aAfsuvg==} + + '@orama/orama@3.0.3': + resolution: {integrity: sha512-M1LPYzAh7cZgujrrU2MCqVaVsYMfTVvskBcgc2Oc78ppTtlr9rXfZxKC8VPguIf78jxOeJUOspG/Lueo4vAZBQ==} + engines: {node: '>= 16.0.0'} + + '@orama/react-components@0.1.23': + resolution: {integrity: sha512-LmSO64xN1bhOBnqVbx+FzpFmWvcy+n/s0Y/keQdU1iejSEFgp+JZCmcgI7B2DS+Xa4VCQOVzYxf6TD11eKc4Tg==} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' + react: ^17.0.0 || ^18.3.1 + react-dom: ^17.0.0 || ^18.3.1 - '@opentelemetry/sdk-trace-base@2.6.0': - resolution: {integrity: sha512-g/OZVkqlxllgFM7qMKqbPV9c1DUPhQ7d4n3pgZFcrnrNft9eJXZM2TNHTPYREJBrtNdRytYyvwjgL5geDKl3EQ==} - engines: {node: ^18.19.0 || >=20.6.0} + '@orama/switch@3.0.3': + resolution: {integrity: sha512-ANERC2N5J6X2+iacQqlo8sLF0wzIwW578xkYmnMVRUOSMuHiLpp9wbYF06tyEBIcpTmfQDKvXI20DeELfSn8ww==} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@orama/orama': 3.0.3 + '@oramacloud/client': ^2.1.1 - '@opentelemetry/semantic-conventions@1.38.0': - resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} - engines: {node: '>=14'} + '@orama/wc-components@0.1.23': + resolution: {integrity: sha512-O4jWSC6XeGS+07l2bkBGPGGXq1A6wG/2nPbBi5WyVhLGY4oceq3/c5l4ogHOF9G4OB+217mKN4VU3nmRosFJtQ==} - '@opentelemetry/semantic-conventions@1.40.0': - resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} - engines: {node: '>=14'} + '@oramacloud/client@2.1.4': + resolution: {integrity: sha512-uNPFs4wq/iOPbggCwTkVNbIr64Vfd7ZS/h+cricXVnzXWocjDTfJ3wLL4lr0qiSu41g8z+eCAGBqJ30RO2O4AA==} - '@opentelemetry/sql-common@0.41.2': - resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.1.0 + '@oslojs/asn1@1.0.0': + resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==} + + '@oslojs/binary@1.0.0': + resolution: {integrity: sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==} + + '@oslojs/crypto@1.0.1': + resolution: {integrity: sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} @@ -2260,22 +2609,30 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} + '@peculiar/asn1-android@2.4.0': + resolution: {integrity: sha512-YFueREq97CLslZZBI8dKzis7jMfEHSLxM+nr0Zdx1POiXFLjqqwoY5s0F1UimdBiEw/iKlHey2m56MRDv7Jtyg==} + + '@peculiar/asn1-ecc@2.4.0': + resolution: {integrity: sha512-fJiYUBCJBDkjh347zZe5H81BdJ0+OGIg0X9z06v8xXUoql3MFeENUX0JsjCaVaU9A0L85PefLPGYkIoGpTnXLQ==} + + '@peculiar/asn1-rsa@2.4.0': + resolution: {integrity: sha512-6PP75voaEnOSlWR9sD25iCQyLgFZHXbmxvUfnnDcfL6Zh5h2iHW38+bve4LfH7a60x7fkhZZNmiYqAlAff9Img==} + + '@peculiar/asn1-schema@2.4.0': + resolution: {integrity: sha512-umbembjIWOrPSOzEGG5vxFLkeM8kzIhLkgigtsOrfLKnuzxWxejAcUX+q/SoZCdemlODOcr5WiYa7+dIEzBXZQ==} + + '@peculiar/asn1-x509@2.4.0': + resolution: {integrity: sha512-F7mIZY2Eao2TaoVqigGMLv+NDdpwuBKU1fucHPONfzaBS4JXXCNCmfO0Z3dsy7JzKGqtDcYC1mr9JjaZQZNiuw==} + + '@phosphor-icons/webcomponents@2.1.5': + resolution: {integrity: sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.57.0': - resolution: {integrity: sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==} - engines: {node: '>=18'} - hasBin: true - - '@posthog/core@1.9.1': - resolution: {integrity: sha512-kRb1ch2dhQjsAapZmu6V66551IF2LnCbc1rnrQqnR7ArooVyJN9KOPXre16AJ3ObJz2eTfuP7x25BMyS2Y5Exw==} - - '@prisma/instrumentation@7.2.0': - resolution: {integrity: sha512-Rh9Z4x5kEj1OdARd7U18AtVrnL6rmLSI0qYShaB4W7Wx5BKbgzndWF+QnuzMb7GLfVdlT5aYCXoPQVYuYtVu0g==} - peerDependencies: - '@opentelemetry/api': ^1.8 + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} '@radix-ui/primitive@1.1.2': resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} @@ -2296,19 +2653,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-arrow@1.1.7': - resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-collection@1.1.4': resolution: {integrity: sha512-cv4vSf7HttqXilDnAnvINd53OTl1/bjUYVZrkFnA7nwmY9Ob2POUy0WY0sfqBAe1s5FyKsyceQlqiEGPYNTadg==} peerDependencies: @@ -2353,8 +2697,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.15': - resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + '@radix-ui/react-dialog@1.1.11': + resolution: {integrity: sha512-yI7S1ipkP5/+99qhSI6nthfo/tR6bL6Zgxi/+1UO6qPa6UeM6nlafWcQ65vB4rU2XjgjMfMhI3k9Y5MztA62VQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2423,15 +2767,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-guards@1.1.3': - resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-focus-scope@1.1.4': resolution: {integrity: sha512-r2annK27lIW5w9Ho5NyQgqs0MmgZSTIKXWpVCJaLC1q2kZrZkcqnmHkCHMEmv8XLvsLlurKMPT+kbKkRkm/xVA==} peerDependencies: @@ -2445,19 +2780,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-id@1.1.1': resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: @@ -2493,19 +2815,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popper@1.2.8': - resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-portal@1.1.6': resolution: {integrity: sha512-XmsIl2z1n/TsYFLIdYam2rmFwf9OC/Sh2avkbmVMDuBZIe7hSpM0cYnWPAo7nHOVx8zTuwDZGByfcqLdnzp3Vw==} peerDependencies: @@ -2597,17 +2906,21 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.2.0': - resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} + '@radix-ui/react-select@2.2.2': + resolution: {integrity: sha512-HjkVHtBkuq+r3zUAZ/CvNWUGKPfuicGDbgtZgiQuFmNcV5F+Tgy24ep2nsAW2nFgvhGPJVqeBZa6KyVN0EyrBA==} peerDependencies: '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true + '@types/react-dom': + optional: true - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + '@radix-ui/react-slot@1.2.0': + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2615,21 +2928,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-toast@1.2.15': - resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: '@types/react': '*' - '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-tooltip@1.2.8': - resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + '@radix-ui/react-toast@1.2.15': + resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2686,6 +2995,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-rect@1.1.1': resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} peerDependencies: @@ -2704,6 +3022,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-visually-hidden@1.2.0': + resolution: {integrity: sha512-rQj0aAWOpCdCMRbI6pLQm8r7S2BM3YhTa0SzOYD55k+hJA8oo9J+H+9wLM9oMlZWOX/wJWPTzfDfmZkf7LvCfg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-visually-hidden@1.2.3': resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} peerDependencies: @@ -2720,42 +3051,44 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@react-three/drei@10.7.7': - resolution: {integrity: sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ==} + '@remix-run/node@2.8.1': + resolution: {integrity: sha512-ddCwBVlfLvRxTQJHPcaM1lhfMjsFYG3EGmYpWJIWnnzDX5EbX9pUNHBWisMuH1eA0c7pbw0PbW0UtCttKYx2qg==} + engines: {node: '>=18.0.0'} peerDependencies: - '@react-three/fiber': ^9.0.0 - react: ^19 - react-dom: ^19 - three: '>=0.159' + typescript: ^5.1.0 peerDependenciesMeta: - react-dom: + typescript: optional: true - '@react-three/fiber@9.5.0': - resolution: {integrity: sha512-FiUzfYW4wB1+PpmsE47UM+mCads7j2+giRBltfwH7SNhah95rqJs3ltEs9V3pP8rYdS0QlNne+9Aj8dS/SiaIA==} - peerDependencies: - expo: '>=43.0' - expo-asset: '>=8.4' - expo-file-system: '>=11.0' - expo-gl: '>=11.0' - react: '>=19 <19.3' - react-dom: '>=19 <19.3' - react-native: '>=0.78' - three: '>=0.156' + '@remix-run/router@1.15.3': + resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} + engines: {node: '>=14.0.0'} + + '@remix-run/server-runtime@2.8.1': + resolution: {integrity: sha512-fh4SOEoONrN73Kvzc0gMDCmYpVRVbvoj9j3BUXHAcn0An8iX+HD/22gU7nTkIBzExM/F9xgEcwTewOnWqLw0Bg==} + engines: {node: '>=18.0.0'} + peerDependencies: + typescript: ^5.1.0 peerDependenciesMeta: - expo: - optional: true - expo-asset: - optional: true - expo-file-system: - optional: true - expo-gl: - optional: true - react-dom: - optional: true - react-native: + typescript: optional: true + '@remix-run/web-blob@3.1.0': + resolution: {integrity: sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==} + + '@remix-run/web-fetch@4.4.2': + resolution: {integrity: sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==} + engines: {node: ^10.17 || >=12.3} + + '@remix-run/web-file@3.1.0': + resolution: {integrity: sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==} + + '@remix-run/web-form-data@3.1.0': + resolution: {integrity: sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==} + + '@remix-run/web-stream@1.1.0': + resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} + '@rolldown/pluginutils@1.0.0-beta.40': resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} @@ -2768,308 +3101,214 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.3': - resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + '@rollup/rollup-android-arm-eabi@4.52.2': + resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + '@rollup/rollup-android-arm64@4.52.2': + resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + '@rollup/rollup-darwin-arm64@4.52.2': + resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + '@rollup/rollup-darwin-x64@4.52.2': + resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + '@rollup/rollup-freebsd-arm64@4.52.2': + resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + '@rollup/rollup-freebsd-x64@4.52.2': + resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + '@rollup/rollup-linux-arm-musleabihf@4.52.2': + resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.3': - resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + '@rollup/rollup-linux-arm64-gnu@4.52.2': + resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.3': - resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + '@rollup/rollup-linux-arm64-musl@4.52.2': + resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + '@rollup/rollup-linux-loong64-gnu@4.52.2': + resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + '@rollup/rollup-linux-ppc64-gnu@4.52.2': + resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + '@rollup/rollup-linux-riscv64-gnu@4.52.2': + resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + '@rollup/rollup-linux-riscv64-musl@4.52.2': + resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.3': - resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + '@rollup/rollup-linux-s390x-gnu@4.52.2': + resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.3': - resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + '@rollup/rollup-linux-x64-gnu@4.52.2': + resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.3': - resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + '@rollup/rollup-linux-x64-musl@4.52.2': + resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + '@rollup/rollup-openharmony-arm64@4.52.2': + resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.3': - resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + '@rollup/rollup-win32-arm64-msvc@4.52.2': + resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.3': - resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + '@rollup/rollup-win32-ia32-msvc@4.52.2': + resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + '@rollup/rollup-win32-x64-gnu@4.52.2': + resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + '@rollup/rollup-win32-x64-msvc@4.52.2': + resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} cpu: [x64] os: [win32] - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@rushstack/eslint-patch@1.7.2': + resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} - '@sentry-internal/browser-utils@10.43.0': - resolution: {integrity: sha512-8zYTnzhAPvNkVH1Irs62wl0J/c+0QcJ62TonKnzpSFUUD3V5qz8YDZbjIDGfxy+1EB9fO0sxtddKCzwTHF/MbQ==} - engines: {node: '>=18'} + '@sentry-internal/browser-utils@8.35.0': + resolution: {integrity: sha512-uj9nwERm7HIS13f/Q52hF/NUS5Al8Ma6jkgpfYGeppYvU0uSjPkwMogtqoJQNbOoZg973tV8qUScbcWY616wNA==} + engines: {node: '>=14.18'} - '@sentry-internal/feedback@10.43.0': - resolution: {integrity: sha512-YoXuwluP6eOcQxTeTtaWb090++MrLyWOVsUTejzUQQ6LFL13Jwt+bDPF1kvBugMq4a7OHw/UNKQfd6//rZMn2g==} - engines: {node: '>=18'} + '@sentry-internal/feedback@8.35.0': + resolution: {integrity: sha512-7bjSaUhL0bDArozre6EiIhhdWdT/1AWNWBC1Wc5w1IxEi5xF7nvF/FfvjQYrONQzZAI3HRxc45J2qhLUzHBmoQ==} + engines: {node: '>=14.18'} - '@sentry-internal/replay-canvas@10.43.0': - resolution: {integrity: sha512-ZIw1UNKOFXo1LbPCJPMAx9xv7D8TMZQusLDUgb6BsPQJj0igAuwd7KRGTkjjgnrwBp2O/sxcQFRhQhknWk7QPg==} - engines: {node: '>=18'} + '@sentry-internal/replay-canvas@8.35.0': + resolution: {integrity: sha512-TUrH6Piv19kvHIiRyIuapLdnuwxk/Un/l1WDCQfq7mK9p1Pac0FkQ7Uufjp6zY3lyhDDZQ8qvCS4ioCMibCwQg==} + engines: {node: '>=14.18'} - '@sentry-internal/replay@10.43.0': - resolution: {integrity: sha512-khCXlGrlH1IU7P5zCEAJFestMeH97zDVCekj8OsNNDtN/1BmCJ46k6Xi0EqAUzdJgrOLJeLdoYdgtiIjovZ8Sg==} - engines: {node: '>=18'} + '@sentry-internal/replay@8.35.0': + resolution: {integrity: sha512-3wkW03vXYMyWtTLxl9yrtkV+qxbnKFgfASdoGWhXzfLjycgT6o4/04eb3Gn71q9aXqRwH17ISVQbVswnRqMcmA==} + engines: {node: '>=14.18'} - '@sentry/babel-plugin-component-annotate@5.1.1': - resolution: {integrity: sha512-x2wEpBHwsTyTF2rWsLKJlzrRF1TTIGOfX+ngdE+Yd5DBkoS58HwQv824QOviPGQRla4/ypISqAXzjdDPL/zalg==} - engines: {node: '>= 18'} + '@sentry/babel-plugin-component-annotate@2.22.6': + resolution: {integrity: sha512-V2g1Y1I5eSe7dtUVMBvAJr8BaLRr4CLrgNgtPaZyMT4Rnps82SrZ5zqmEkLXPumlXhLUWR6qzoMNN2u+RXVXfQ==} + engines: {node: '>= 14'} - '@sentry/browser@10.43.0': - resolution: {integrity: sha512-2V3I3sXi3SMeiZpKixd9ztokSgK27cmvsD9J5oyOyjhGLTW/6QKCwHbKnluMgQMXq20nixQk5zN4wRjRUma3sg==} - engines: {node: '>=18'} + '@sentry/browser@8.35.0': + resolution: {integrity: sha512-WHfI+NoZzpCsmIvtr6ChOe7yWPLQyMchPnVhY3Z4UeC70bkYNdKcoj/4XZbX3m0D8+71JAsm0mJ9s9OC3Ue6MQ==} + engines: {node: '>=14.18'} - '@sentry/bundler-plugin-core@5.1.1': - resolution: {integrity: sha512-F+itpwR9DyQR7gEkrXd2tigREPTvtF5lC8qu6e4anxXYRTui1+dVR0fXNwjpyAZMhIesLfXRN7WY7ggdj7hi0Q==} - engines: {node: '>= 18'} + '@sentry/bundler-plugin-core@2.22.6': + resolution: {integrity: sha512-1esQdgSUCww9XAntO4pr7uAM5cfGhLsgTK9MEwAKNfvpMYJi9NUTYa3A7AZmdA8V6107Lo4OD7peIPrDRbaDCg==} + engines: {node: '>= 14'} - '@sentry/cli-darwin@2.58.5': - resolution: {integrity: sha512-lYrNzenZFJftfwSya7gwrHGxtE+Kob/e1sr9lmHMFOd4utDlmq0XFDllmdZAMf21fxcPRI1GL28ejZ3bId01fQ==} + '@sentry/cli-darwin@2.38.1': + resolution: {integrity: sha512-IHuxm072aSTAvwuHtLg065cF00Pxm2wprnrRr2lkyWp8nLOoO7DmumWZ4pjHvhB8yZXsAbM/PSxLRBoDIRDPzQ==} engines: {node: '>=10'} os: [darwin] - '@sentry/cli-linux-arm64@2.58.5': - resolution: {integrity: sha512-/4gywFeBqRB6tR/iGMRAJ3HRqY6Z7Yp4l8ZCbl0TDLAfHNxu7schEw4tSnm2/Hh9eNMiOVy4z58uzAWlZXAYBQ==} + '@sentry/cli-linux-arm64@2.38.1': + resolution: {integrity: sha512-3bj5DS4wDusL0YHwG5qeI+O19kz4N4KDDmnWqIew56MmSSAEM5B0qKk5Hivu1vRU5vPKFwVn8BVjLnKXu9idjg==} engines: {node: '>=10'} cpu: [arm64] - os: [linux, freebsd, android] + os: [linux, freebsd] - '@sentry/cli-linux-arm@2.58.5': - resolution: {integrity: sha512-KtHweSIomYL4WVDrBrYSYJricKAAzxUgX86kc6OnlikbyOhoK6Fy8Vs6vwd52P6dvWPjgrMpUYjW2M5pYXQDUw==} + '@sentry/cli-linux-arm@2.38.1': + resolution: {integrity: sha512-xyf4f56O4/eeirol8t1tTQw0cwF34b3v69zn6wHtKfx2lW5IEBGO+agVNdOdosnCx6j3UadgdRXUJlSyM9kx/w==} engines: {node: '>=10'} cpu: [arm] - os: [linux, freebsd, android] + os: [linux, freebsd] - '@sentry/cli-linux-i686@2.58.5': - resolution: {integrity: sha512-G7261dkmyxqlMdyvyP06b+RTIVzp1gZNgglj5UksxSouSUqRd/46W/2pQeOMPhloDYo9yLtCN2YFb3Mw4aUsWw==} + '@sentry/cli-linux-i686@2.38.1': + resolution: {integrity: sha512-VygJO2oTc6GfiqqmPYNpO2bW1hzszuNyn37SSmeRuuhq1/kRwD+ZQj4OmXYEASjSLg+8mDPoWOurPjHEPKNtNw==} engines: {node: '>=10'} cpu: [x86, ia32] - os: [linux, freebsd, android] + os: [linux, freebsd] - '@sentry/cli-linux-x64@2.58.5': - resolution: {integrity: sha512-rP04494RSmt86xChkQ+ecBNRYSPbyXc4u0IA7R7N1pSLCyO74e5w5Al+LnAq35cMfVbZgz5Sm0iGLjyiUu4I1g==} + '@sentry/cli-linux-x64@2.38.1': + resolution: {integrity: sha512-9SaPJK5yAGR7qGsDubTT9O7VpNQG9KIolCOov4xJU7scbmjGaFyYBm9c7ZIqbq6B+56YchPbtD0RewZC6CiF2w==} engines: {node: '>=10'} cpu: [x64] - os: [linux, freebsd, android] - - '@sentry/cli-win32-arm64@2.58.5': - resolution: {integrity: sha512-AOJ2nCXlQL1KBaCzv38m3i2VmSHNurUpm7xVKd6yAHX+ZoVBI8VT0EgvwmtJR2TY2N2hNCC7UrgRmdUsQ152bA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] + os: [linux, freebsd] - '@sentry/cli-win32-i686@2.58.5': - resolution: {integrity: sha512-EsuboLSOnlrN7MMPJ1eFvfMDm+BnzOaSWl8eYhNo8W/BIrmNgpRUdBwnWn9Q2UOjJj5ZopukmsiMYtU/D7ml9g==} + '@sentry/cli-win32-i686@2.38.1': + resolution: {integrity: sha512-BVUM5y+ZDBK/LqyVvt0C7oolmg8aq7PI/u04/Pp6FLRExySqwyQim0vNyL2FRjIeX1yhbk7x4Z79UjEKqJBltA==} engines: {node: '>=10'} cpu: [x86, ia32] os: [win32] - '@sentry/cli-win32-x64@2.58.5': - resolution: {integrity: sha512-IZf+XIMiQwj+5NzqbOQfywlOitmCV424Vtf9c+ep61AaVScUFD1TSrQbOcJJv5xGxhlxNOMNgMeZhdexdzrKZg==} + '@sentry/cli-win32-x64@2.38.1': + resolution: {integrity: sha512-+HgsdM3LFSzUNlDpicPRdTKfr5u+nJ2C5p4aDYPb2G+qoYW+66FI4NxgWSyzJsj3nVQ8lW5/6AoMP6U5z/e/0A==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@sentry/cli@2.58.5': - resolution: {integrity: sha512-tavJ7yGUZV+z3Ct2/ZB6mg339i08sAk6HDkgqmSRuQEu2iLS5sl9HIvuXfM6xjv8fwlgFOSy++WNABNAcGHUbg==} + '@sentry/cli@2.38.1': + resolution: {integrity: sha512-XFO04nP7cn0tboMQ4ALR81QRF/6xoWAFzNld7Io6jHbaFzihqewjxAqy7pSvVPaieepUjqe7m/Ippt00kKOACg==} engines: {node: '>= 10'} hasBin: true - '@sentry/core@10.42.0': - resolution: {integrity: sha512-L4rMrXMqUKBanpjpMT+TuAVk6xAijz6AWM6RiEYpohAr7SGcCEc1/T0+Ep1eLV8+pwWacfU27OvELIyNeOnGzA==} - engines: {node: '>=18'} - - '@sentry/core@10.43.0': - resolution: {integrity: sha512-l0SszQAPiQGWl/ferw8GP3ALyHXiGiRKJaOvNmhGO+PrTQyZTZ6OYyPnGijAFRg58dE1V3RCH/zw5d2xSUIiNg==} - engines: {node: '>=18'} - - '@sentry/node-core@10.42.0': - resolution: {integrity: sha512-9tf3fPV6M071aps72D+PEtdQPTuj+SuqO2+PpTfdPP5ZL4TTKYo3VK0li76SL+5wGdTFGV5qmsokHq9IRBA0iA==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 - '@opentelemetry/instrumentation': '>=0.57.1 <1' - '@opentelemetry/resources': ^1.30.1 || ^2.1.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@opentelemetry/semantic-conventions': ^1.39.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@opentelemetry/context-async-hooks': - optional: true - '@opentelemetry/core': - optional: true - '@opentelemetry/instrumentation': - optional: true - '@opentelemetry/resources': - optional: true - '@opentelemetry/sdk-trace-base': - optional: true - '@opentelemetry/semantic-conventions': - optional: true - - '@sentry/node-core@10.43.0': - resolution: {integrity: sha512-w2H3NSkNMoYOS7o7mR55BM7+xL++dPxMSv1/XDfsra9FYHGppO+Mxk667Ee5k+uDi+wNIioICIh+5XOvZh4+HQ==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 - '@opentelemetry/instrumentation': '>=0.57.1 <1' - '@opentelemetry/resources': ^1.30.1 || ^2.1.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@opentelemetry/semantic-conventions': ^1.39.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@opentelemetry/context-async-hooks': - optional: true - '@opentelemetry/core': - optional: true - '@opentelemetry/instrumentation': - optional: true - '@opentelemetry/resources': - optional: true - '@opentelemetry/sdk-trace-base': - optional: true - '@opentelemetry/semantic-conventions': - optional: true - - '@sentry/node@10.42.0': - resolution: {integrity: sha512-ZZfU3Fnni7Aj0lTX4e3QpY3UxK4FGuzfM20316UAJycBGnripm+sDHwcekPMGfLnk/FrN9wa1atspVlHvOI0WQ==} - engines: {node: '>=18'} - - '@sentry/node@10.43.0': - resolution: {integrity: sha512-oNwXcuZUc4uTTr0WbHZBBIKsKwAKvNMTgbXwxfB37CfzV18wbTirbQABZ/Ir3WNxSgi6ZcnC6UE013jF5XWPqw==} - engines: {node: '>=18'} - - '@sentry/opentelemetry@10.42.0': - resolution: {integrity: sha512-5vsYz683iihzlIj3sT1+tEixf0awwXK86a+aYsnMHrTXJDrkBDq4U0ZT+yxdPfJlkaxRtYycFR08SXr2pSm7Eg==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@opentelemetry/semantic-conventions': ^1.39.0 - - '@sentry/opentelemetry@10.43.0': - resolution: {integrity: sha512-+fIcnnLdvBHdq4nKq23t9v/B9D4L97fPWEDksXbpGs11o6BsqY4Tlzmce6cP95iiQhPckCEag3FthSND+BYtYQ==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@opentelemetry/semantic-conventions': ^1.39.0 + '@sentry/core@8.35.0': + resolution: {integrity: sha512-Ci0Nmtw5ETWLqQJGY4dyF+iWh7PWKy6k303fCEoEmqj2czDrKJCp7yHBNV0XYbo00prj2ZTbCr6I7albYiyONA==} + engines: {node: '>=14.18'} - '@sentry/react@10.43.0': - resolution: {integrity: sha512-shvErEpJ41i0Q3lIZl0CDWYQ7m8yHLi7ECG0gFvN8zf8pEdl5grQIOoe3t/GIUzcpCcor16F148ATmKJJypc/Q==} - engines: {node: '>=18'} + '@sentry/react@8.35.0': + resolution: {integrity: sha512-8Y+s4pE9hvT2TwSo5JS/Enw2cNFlwiLcJDNGCj/Hho+FePFYA59hbN06ouTHWARnO+swANHKZQj24Wp57p1/tg==} + engines: {node: '>=14.18'} peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/rollup-plugin@5.1.1': - resolution: {integrity: sha512-1d5NkdRR6aKWBP7czkY8sFFWiKnfmfRpQOj+m9bJTsyTjbMiEQJst6315w5pCVlRItPhBqpAraqAhutZFgvyVg==} - engines: {node: '>= 18'} - peerDependencies: - rollup: '>=3.2.0' + '@sentry/types@8.35.0': + resolution: {integrity: sha512-AVEZjb16MlYPifiDDvJ19dPQyDn0jlrtC1PHs6ZKO+Rzyz+2EX2BRdszvanqArldexPoU1p5Bn2w81XZNXThBA==} + engines: {node: '>=14.18'} - '@sentry/tanstackstart-react@10.43.0': - resolution: {integrity: sha512-FQqfAEgDxlPt6ewPhE7JSbZ1qewAk63qh5JiuvPoDB6nKd5ThamEV7KQi1I8Vk+HIfCByr9+a5umYUMIH6kH+w==} - engines: {node: '>=18'} + '@sentry/utils@8.35.0': + resolution: {integrity: sha512-MdMb6+uXjqND7qIPWhulubpSeHzia6HtxeJa8jYI09OCvIcmNGPydv/Gx/LZBwosfMHrLdTWcFH7Y7aCxrq7cg==} + engines: {node: '>=14.18'} - '@sentry/vite-plugin@5.1.1': - resolution: {integrity: sha512-i6NWUDi2SDikfSUeMJvJTRdwEKYSfTd+mvBO2Ja51S1YK+hnickBuDfD+RvPerIXLuyRu3GamgNPbNqgCGUg/Q==} - engines: {node: '>= 18'} + '@sentry/vite-plugin@2.22.6': + resolution: {integrity: sha512-zIieP1VLWQb3wUjFJlwOAoaaJygJhXeUoGd0e/Ha2RLb2eW2S+4gjf6y6NqyY71tZ74LYVZKg/4prB6FAZSMXQ==} + engines: {node: '>= 14'} '@shikijs/core@1.10.3': resolution: {integrity: sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==} @@ -3077,9 +3316,12 @@ packages: '@shikijs/transformers@1.10.3': resolution: {integrity: sha512-MNjsyye2WHVdxfZUSr5frS97sLGe6G1T+1P41QjyBFJehZphMcr4aBlRLmq6OSPBslYe9byQPVvt/LJCOfxw8Q==} - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} + '@simplewebauthn/browser@13.1.2': + resolution: {integrity: sha512-aZnW0KawAM83fSBUgglP5WofbrLbLyr7CoPqYr66Eppm7zO86YX6rrCjRB3hQKPrL7ATvY4FVXlykZ6w6FwYYw==} + + '@simplewebauthn/server@13.1.2': + resolution: {integrity: sha512-VwoDfvLXSCaRiD+xCIuyslU0HLxVggeE5BL06+GbsP2l1fGf5op8e0c3ZtKoi+vSg1q4ikjtAghC23ze2Q3H9g==} + engines: {node: '>=20.0.0'} '@so-ric/colorspace@1.1.6': resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} @@ -3087,14 +3329,19 @@ packages: '@stablelib/base64@1.0.1': resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} - '@stackblitz/sdk@1.11.0': - resolution: {integrity: sha512-DFQGANNkEZRzFk1/rDP6TcFdM82ycHE+zfl9C/M/jXlH68jiqHWHFMQURLELoD8koxvu/eW5uhg94NSAZlYrUQ==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - '@standard-schema/spec@1.0.0-beta.4': - resolution: {integrity: sha512-d3IxtzLo7P1oZ8s8YNvxzBUXRXojSut8pbPrTYtzsc5sn4+53jVqbk66pQerSZbZSJZQux6LkclB/+8IDordHg==} + '@stencil/core@4.20.0': + resolution: {integrity: sha512-WPrTHFngvN081RY+dJPneKQLwnOFD60OMCOQGmmSHfCW0f4ujPMzzhwWU1gcSwXPWXz5O+8cBiiCaxAbJU7kAg==} + engines: {node: '>=16.0.0', npm: '>=7.10.0'} + hasBin: true - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@stencil/store@2.0.16': + resolution: {integrity: sha512-ET3EByKlmNyTA8O+tcp5YWePOiVnPIiuoiIaxTrf3zFFVo7JWVsVoak9IE0UTn3MkIM0ubR9lgxvi70uN588/A==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + peerDependencies: + '@stencil/core': '>=2.0.0 || >=3.0.0 || >= 4.0.0-beta.0 || >= 4.0.0' '@tailwindcss/node@4.1.11': resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} @@ -3191,100 +3438,88 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 - '@tanstack/create@0.49.1': - resolution: {integrity: sha512-Y6MlKg7TLXvKLPkr6roLDKSSqzZKrcPRCg5TlucKX7bsIsG3KIGLTZAhF7jLx4a1zJt/25g92U/JhSm7TFnbrg==} - - '@tanstack/devtools-event-client@0.3.5': - resolution: {integrity: sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw==} + '@tanstack/devtools-event-client@0.2.5': + resolution: {integrity: sha512-iVdqw879KETXyyPHc3gQR5Ld0GjlPLk7bKenBUhzr3+z1FiQZvsbfgYfRRokTSPcgwANAV7aA2Uv05nx5xWT8A==} engines: {node: '>=18'} - '@tanstack/history@1.154.14': - resolution: {integrity: sha512-xyIfof8eHBuub1CkBnbKNKQXeRZC4dClhmzePHVOEel4G7lk/dW+TQ16da7CFdeNLv6u6Owf5VoBQxoo6DFTSA==} + '@tanstack/directive-functions-plugin@1.132.51': + resolution: {integrity: sha512-0MFIPKxv9zfsLFPNybeaMXgTfBrTRAM52QAttWY02h2NHQ0P7Fl7tyZq8T/YVdE3zwixfQRnyK569Pf5ttdZog==} engines: {node: '>=12'} + peerDependencies: + vite: '>=6.0.0 || >=7.0.0' - '@tanstack/hotkeys@0.0.2': - resolution: {integrity: sha512-HUki67sfc6z62iIY+ito7HV4+cFmsHlwLOWdFN8Aomgw7HJH8zHtBSksVw9Gh7qSapKi29fWa3DViPMzUawN2Q==} - engines: {node: '>=18'} + '@tanstack/history@1.132.31': + resolution: {integrity: sha512-UCHM2uS0t/uSszqPEo+SBSSoQVeQ+LlOWAVBl5SA7+AedeAbKafIPjFn8huZCXNLAYb0WKV2+wETr7lDK9uz7g==} + engines: {node: '>=12'} - '@tanstack/pacer@0.16.4': - resolution: {integrity: sha512-dqd6p1JK6iucOhJSOA1/VCvT46kZDoem/l/xcYtQpG4Ygxl8xzSW69oMk0bTSh+cAvFXDCrXn3wlS7Otir/fsA==} + '@tanstack/pacer@0.15.3': + resolution: {integrity: sha512-yF7TDPeCwss+4zlHAinBDUrG+RF4+f3oUedYsTEcyXSdgTLLwozFxA1nH72KugTE67A1BkpfSrgeMjDYHgaaPw==} engines: {node: '>=18'} - '@tanstack/query-core@5.90.12': - resolution: {integrity: sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==} - - '@tanstack/react-hotkeys@0.0.2': - resolution: {integrity: sha512-LaW28h7omiIWgyw61gEU2k2X4YlesB8Gptvw71si77cXbg7RphD+Qu+q/mA84ai4x2miLA6vvYuZTvIVcbz9tw==} - engines: {node: '>=18'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + '@tanstack/query-core@5.90.2': + resolution: {integrity: sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==} - '@tanstack/react-pacer@0.17.4': - resolution: {integrity: sha512-VdHuN+FkdKwPMD2uuO0qb04CBMOci68CeciQCTASA5Tmts9uxiSHIJEM+ABh/s4pSEdMKM/GI6sFWDNwwCf6yA==} + '@tanstack/react-pacer@0.16.3': + resolution: {integrity: sha512-XQyCh395yS/hPiPx8WzWyQeH+7Zu+XeKY50lqE36z/TgjqO7yhiI2GcHa5+a98+wdQzdI3eQ80YZmUnHpnRAHA==} engines: {node: '>=18'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-query@5.90.12': - resolution: {integrity: sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg==} + '@tanstack/react-query@5.90.2': + resolution: {integrity: sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.157.16': - resolution: {integrity: sha512-g6ekyzumfLBX6T5e+Vu2r37Z2CFJKrWRFqIy3vZ6A3x7OcuPV8uXNjyrLSiT/IsGTiF8YzwI4nWJa4fyd7NlCw==} + '@tanstack/react-router-devtools@1.132.51': + resolution: {integrity: sha512-09gHGUE9BVE6O+7u4ICnKigdPP0vZAYI70dKNqGp8bEy9jaMmHGlUxVV6pKqBLVgcPmwT9YMRAeJ5+QrcznXGA==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.157.16 - '@tanstack/router-core': ^1.157.16 + '@tanstack/react-router': ^1.132.47 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - peerDependenciesMeta: - '@tanstack/router-core': - optional: true - '@tanstack/react-router-ssr-query@1.157.16': - resolution: {integrity: sha512-emvm1t2fTZk/gdctuTwbNW2LeUCpPJGttq4N9I5YdTk2QmLmCD5mgiJYB/GXWwmuSq05dmO/7W9b8HNAWSv0FQ==} + '@tanstack/react-router-with-query@1.130.17': + resolution: {integrity: sha512-TNaSocW20KuPwUojEm130DLWTr9M5hsSzxiu4QqS2jNCnrGLuDrwMHyP+6fq13lG3YuU4u9O1qajxfJIGomZCg==} engines: {node: '>=12'} peerDependencies: - '@tanstack/query-core': '>=5.90.0' - '@tanstack/react-query': '>=5.90.0' - '@tanstack/react-router': '>=1.127.0' + '@tanstack/react-query': '>=5.49.2' + '@tanstack/react-router': '>=1.43.2' + '@tanstack/router-core': '>=1.114.7' react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.157.16': - resolution: {integrity: sha512-xwFQa7S7dhBhm3aJYwU79cITEYgAKSrcL6wokaROIvl2JyIeazn8jueWqUPJzFjv+QF6Q8euKRlKUEyb5q2ymg==} + '@tanstack/react-router@1.132.47': + resolution: {integrity: sha512-mjCN1ueVLHBOK1gqLeacCrUPBZietMKTkr7xZlC32dCGn4e+83zMSlRTS2TrEl7+wEH+bqjnoyx8ALYTSiQ1Cg==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.157.16': - resolution: {integrity: sha512-r3XTxYPJXZ/szhbloxqT6CQtsoEjw8DjbnZh/3ZsQv2PLKTOl925cy7YVdQc2cWZyXtn5e19Ig78R+8tsoTpig==} + '@tanstack/react-start-client@1.132.48': + resolution: {integrity: sha512-XjeFcTa38vZ+Fx3H3awctFH2Fvaeme8FR/TV1hioiTqrvTI3bgi50G5q9QRIjsgA7rdcja9XyRGm3MNfpNLo7Q==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-server@1.157.16': - resolution: {integrity: sha512-1YkBss4SUQ+HqVC1yGN/j7VNwjvdHHd3K58fASe0bz+uf7GrkGJlRXPkMJdxJkkmefYHQfyBL+q7o723N4CMYA==} + '@tanstack/react-start-server@1.132.48': + resolution: {integrity: sha512-PTKb7awJzb7XR9KJ/hfTQ7MnRAURnx0qBqfximPGqpzDYAjtTfj+95VR2fTuQ/J6N6B7uW1qik2tmUj/l6LTBQ==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.157.16': - resolution: {integrity: sha512-FO6UYjsZyNaC0ickSSvClqfVZemp9/HWnbRJQU2dOKYQsI+wnznhLp9IkgG90iFBLcuMAWhcNHMiIuz603GJBg==} + '@tanstack/react-start@1.132.51': + resolution: {integrity: sha512-eKEm6DF1taqlxPhDpF0V3O4ck13152pLnlHyStms0vdaH+egoCprsy5ZjUS4Z4CO8QUxsGG9dEvsXFKOCL14DQ==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' vite: '>=7.0.0' - '@tanstack/react-store@0.8.0': - resolution: {integrity: sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==} + '@tanstack/react-store@0.7.7': + resolution: {integrity: sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3296,32 +3531,40 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/router-core@1.157.16': - resolution: {integrity: sha512-eJuVgM7KZYTTr4uPorbUzUflmljMVcaX2g6VvhITLnHmg9SBx9RAgtQ1HmT+72mzyIbRSlQ1q0fY/m+of/fosA==} + '@tanstack/react-virtual@3.1.3': + resolution: {integrity: sha512-YCzcbF/Ws/uZ0q3Z6fagH+JVhx4JLvbSflgldMgLsuvB8aXjZLLb3HvrEVxY480F9wFlBiXlvQxOyXb5ENPrNA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/router-core@1.132.47': + resolution: {integrity: sha512-8YKFHmG6VUqXaWAJzEqjyW6w31dARS2USd2mtI5ZeZcihqMbskK28N4iotBXNn+sSKJnPRjc7A4jTnnEf8Mn8Q==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.157.16': - resolution: {integrity: sha512-XBJTs/kMZYK6J2zhbGucHNuypwDB1t2vi8K5To+V6dUnLGBEyfQTf01fegiF4rpL1yXgomdGnP6aTiOFgldbVg==} + '@tanstack/router-devtools-core@1.132.51': + resolution: {integrity: sha512-uhbk4rSeUpYaqOJLZwOwfyysSoeedIEiRWz37sTVM4tUBFsWqA/p9gO2kVSx/Xmcu8grLy512KNDDeji3QhdwQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.157.16 + '@tanstack/router-core': ^1.132.47 csstype: ^3.0.10 + solid-js: '>=1.9.5' + tiny-invariant: ^1.3.3 peerDependenciesMeta: csstype: optional: true - '@tanstack/router-generator@1.157.16': - resolution: {integrity: sha512-Ae2M00VTFjjED7glSCi/mMLENRzhEym6NgjoOx7UVNbCC/rLU/5ASDe5VIlDa8QLEqP5Pj088Gi51gjmRuICvQ==} + '@tanstack/router-generator@1.132.51': + resolution: {integrity: sha512-iAGz2IZ2rr38o+7cgE33qPyNFJFx7PcPOvUXk5kcX1TtXeyTgVLoe7vqQzKYbungZmht2V8xSFmy6kakUJhxOA==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.157.16': - resolution: {integrity: sha512-YQg7L06xyCJAYyrEJNZGAnDL8oChILU+G/eSDIwEfcWn5iLk+47x1Gcdxr82++47PWmOPhzuTo8edDQXWs7kAA==} + '@tanstack/router-plugin@1.132.51': + resolution: {integrity: sha512-eAC22XJmfJJU1f/wdW9j3e/U/74KFxUZfb38fVTugNAo+TUw58krS/XRrpOjZFnsg4lO4HseGntC4SxKD3agHw==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.157.16 + '@tanstack/react-router': ^1.132.47 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' - vite-plugin-solid: ^2.11.10 + vite-plugin-solid: ^2.11.8 webpack: '>=5.92.0' peerDependenciesMeta: '@rsbuild/core': @@ -3335,52 +3578,51 @@ packages: webpack: optional: true - '@tanstack/router-ssr-query-core@1.157.16': - resolution: {integrity: sha512-YuwNG4jdtn+r90yyti8yP27IKaVoflWmRezqnj0gyJxpRauBkK7MVLvWSNbJadnk88b9H+rdtNOF2k3owGaong==} + '@tanstack/router-utils@1.132.51': + resolution: {integrity: sha512-8wmYmc8LY0MhgNw1jfwjTdpYgl5CmvvkamoHOUcz4odFiAWOXLhwo3UBOwKihw+6SxJ/M7l9tEcq5PdLUOUi0Q==} engines: {node: '>=12'} - peerDependencies: - '@tanstack/query-core': '>=5.90.0' - '@tanstack/router-core': '>=1.127.0' - '@tanstack/router-utils@1.154.7': - resolution: {integrity: sha512-61bGx32tMKuEpVRseu2sh1KQe8CfB7793Mch/kyQt0EP3tD7X0sXmimCl3truRiDGUtI0CaSoQV1NPjAII1RBA==} + '@tanstack/server-functions-plugin@1.132.51': + resolution: {integrity: sha512-T0SbynWKY0HszwLLQWVq/MEjMD+zAN5aWCCIMJ+UZnF6V65Ug7/5bTR02IRwAgpxF1tCAqHNNhEtHJkKo3Nhjw==} engines: {node: '>=12'} - '@tanstack/start-client-core@1.157.16': - resolution: {integrity: sha512-O+7H133MWQTkOxmXJNhrLXiOhDcBlxvpEcCd/N25Ga6eyZ7/P5vvFzNkSSxeQNkZV+RiPWnA5B75gT+U+buz3w==} - engines: {node: '>=22.12.0'} - - '@tanstack/start-fn-stubs@1.154.7': - resolution: {integrity: sha512-D69B78L6pcFN5X5PHaydv7CScQcKLzJeEYqs7jpuyyqGQHSUIZUjS955j+Sir8cHhuDIovCe2LmsYHeZfWf3dQ==} + '@tanstack/start-client-core@1.132.48': + resolution: {integrity: sha512-8aXQaqq3EDU5HxE6jyEq1q/I32Wwp6y1oZ7ey/QDsEUTS7jeSxn+z+JcY4z8hpUmFvDOJy3w39EWneR2qiKMXg==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.157.16': - resolution: {integrity: sha512-VmRXuvP5flryUAHeBM4Xb06n544qLtyA2cwmlQLRTUYtQiQEAdd9CvCGy8CPAly3f7eeXKqC7aX0v3MwWkLR8w==} + '@tanstack/start-plugin-core@1.132.51': + resolution: {integrity: sha512-N3ISxJnuYPblBuWwI7j+1KZxmWlT00OyQsxYcgf6eHAYPHlO/blqWeABXXe7Nkxr1u5IDhHmlLGG+gTs8Rc3Jg==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' - '@tanstack/start-server-core@1.157.16': - resolution: {integrity: sha512-PEltFleYfiqz6+KcmzNXxc1lXgT7VDNKP6G6i1TirdHBDbRJ9CIY+ASLPlhrRwqwA2PL9PpFjXZl8u5bH/+Q9A==} + '@tanstack/start-server-core@1.132.48': + resolution: {integrity: sha512-jEN2FqRXdoK0bahnLazdne+d3B5q+kXQlypMf+ZmSrqmLWXLTtRPdjL/E0m0741ZSdIYwCBQIdL4QkErhjnsVQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.157.16': - resolution: {integrity: sha512-56izE0oihAw2YRwYUEds2H+uO5dyT2CahXCgWX62+l+FHou09M9mSep68n1lBKPdphC2ZU3cPV7wnvgeraJWHg==} + '@tanstack/start-storage-context@1.132.48': + resolution: {integrity: sha512-+QC2fXEHrcNhMoPojE18qf58kdd9kuja24xCpzuwSVq/3a8JAHvjj5H6bucZxydGbkD0MEnT3B+7wWx+8zM7Hw==} engines: {node: '>=22.12.0'} - '@tanstack/store@0.8.0': - resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} + '@tanstack/store@0.7.7': + resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} '@tanstack/table-core@8.21.3': resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} engines: {node: '>=12'} - '@tanstack/virtual-file-routes@1.154.7': - resolution: {integrity: sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg==} + '@tanstack/virtual-core@3.1.3': + resolution: {integrity: sha512-Y5B4EYyv1j9V8LzeAoOVeTg0LI7Fo5InYKgAjkY1Pu9GjtUwX/EKxNcU7ng3sKr99WEf+bPTcktAeybyMOYo+g==} + + '@tanstack/virtual-file-routes@1.132.31': + resolution: {integrity: sha512-rxS8Cm2nIXroLqkm9pE/8X2lFNuvcTIIiFi5VH4PwzvKscAuaW3YRMN1WmaGDI2mVEn+GLaoY6Kc3jOczL5i4w==} engines: {node: '>=12'} - '@tweenjs/tween.js@23.1.3': - resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} + '@tybys/wasm-util@0.8.3': + resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} + + '@types/aws-lambda@8.10.152': + resolution: {integrity: sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3394,12 +3636,6 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -3496,56 +3732,38 @@ packages: '@types/d3@7.4.3': resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/dom-speech-recognition@0.0.1': resolution: {integrity: sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw==} - '@types/draco3d@1.4.10': - resolution: {integrity: sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@5.1.1': - resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} - - '@types/express@5.0.6': - resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} - '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} '@types/google.maps@3.58.1': resolution: {integrity: sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==} + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} '@types/hogan.js@3.0.5': resolution: {integrity: sha512-/uRaY3HGPWyLqOyhgvW9Aa43BNnLZrNeQxl2p8wqId4UHMfPKolSB+U7BlZyO1ng7MkLnyEAItsBzCG0SDhqrA==} - '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/lodash@4.14.200': resolution: {integrity: sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==} - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/mysql@2.15.27': - resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} - - '@types/node@22.19.3': - resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} '@types/node@24.3.0': resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} @@ -3553,39 +3771,20 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/offscreencanvas@2019.7.3': - resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} - '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/pg-pool@2.0.7': - resolution: {integrity: sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==} - - '@types/pg@8.11.6': - resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} - - '@types/pg@8.15.6': - resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==} + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} '@types/qs@6.9.18': resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} - peerDependencies: - '@types/react': ^19.2.0 - - '@types/react-reconciler@0.28.9': - resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} - peerDependencies: - '@types/react': '*' + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} - '@types/react@19.2.10': - resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==} + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} '@types/remove-markdown@0.3.4': resolution: {integrity: sha512-i753EH/p02bw7bLlpfS/4CV1rdikbGiLabWyVsAvsFid3cA5RNU1frG7JycgY+NSnFwtoGlElvZVceCytecTDA==} @@ -3593,23 +3792,8 @@ packages: '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - '@types/send@1.2.1': - resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - - '@types/serve-static@2.2.0': - resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} - - '@types/stats.js@0.17.4': - resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==} - - '@types/tar-stream@3.1.4': - resolution: {integrity: sha512-921gW0+g29mCJX0fRvqeHzBlE/XclDaAG0Ousy1LCghsOhvaKacDeRGEVzQP9IPfKn8Vysy7FEXAIxycpc/CMg==} - - '@types/tedious@4.0.14': - resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} - - '@types/three@0.182.0': - resolution: {integrity: sha512-WByN9V3Sbwbe2OkWuSGyoqQO8Du6yhYaXtXLoA5FkKTUJorZ+yOHBZ35zUUPQXlAKABZmbYp5oAqpA4RBjtJ/Q==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} @@ -3617,100 +3801,135 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/webxr@0.5.24': - resolution: {integrity: sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==} + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.48.1': - resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@typescript-eslint/parser': ^8.48.1 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@typescript-eslint/parser@8.48.1': - resolution: {integrity: sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/experimental-utils@5.62.0': + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/project-service@8.48.1': - resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/scope-manager@8.48.1': - resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@typescript-eslint/tsconfig-utils@8.48.1': - resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/parser@7.2.0': + resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@typescript-eslint/type-utils@8.48.1': - resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} + '@typescript-eslint/project-service@8.46.0': + resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.48.1': - resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/typescript-estree@8.48.1': - resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} + '@typescript-eslint/scope-manager@7.2.0': + resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/tsconfig-utils@8.46.0': + resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.48.1': - resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@typescript-eslint/visitor-keys@8.48.1': - resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@typescript-eslint/types@7.2.0': + resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} + engines: {node: ^16.0.0 || >=18.0.0} - '@uploadthing/mime-types@0.3.6': - resolution: {integrity: sha512-t3tTzgwFV9+1D7lNDYc7Lr7kBwotHaX0ZsvoCGe7xGnXKo9z0jG2Sjl/msll12FeoLj77nyhsxevXyGpQDBvLg==} + '@typescript-eslint/types@8.46.0': + resolution: {integrity: sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@uploadthing/react@7.3.3': - resolution: {integrity: sha512-GhKbK42jL2Qs7OhRd2Z6j0zTLsnJTRJH31nR7RZnUYVoRh2aS/NabMAnHBNqfunIAGXVaA717Pvzq7vtxuPTmQ==} + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - next: '*' - react: ^17.0.2 || ^18.0.0 || ^19.0.0 - uploadthing: ^7.2.0 + typescript: '*' peerDependenciesMeta: - next: + typescript: optional: true - '@uploadthing/shared@7.1.10': - resolution: {integrity: sha512-R/XSA3SfCVnLIzFpXyGaKPfbwlYlWYSTuGjTFHuJhdAomuBuhopAHLh2Ois5fJibAHzi02uP1QCKbgTAdmArqg==} + '@typescript-eslint/typescript-estree@7.2.0': + resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@use-gesture/core@10.3.1': - resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} + '@typescript-eslint/typescript-estree@8.46.0': + resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' - '@use-gesture/react@10.3.1': - resolution: {integrity: sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==} + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - react: '>= 16.8.0' + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@7.2.0': + resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@8.46.0': + resolution: {integrity: sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} '@vercel/nft@0.29.4': resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} @@ -3753,11 +3972,8 @@ packages: '@vue/shared@3.5.22': resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} - '@webcontainer/api@1.6.1': - resolution: {integrity: sha512-2RS2KiIw32BY1Icf6M1DvqSmcon9XICZCDgS29QJb2NmF12ZY2V5Ia+949hMKB3Wno+P/Y8W+sPP59PZeXSELg==} - - '@webgpu/types@0.1.68': - resolution: {integrity: sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA==} + '@web3-storage/multipart-parser@1.0.0': + resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} '@whatwg-node/disposablestack@0.0.6': resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} @@ -3779,14 +3995,12 @@ packages: resolution: {integrity: sha512-Otmxo+0mp8az3B48pLI1I4msNOXPIoP7TLm6h5wOEQmynqHt8oP9nR6NJUeJk6iI5OtFpQtkbJFwfGkmplvc3Q==} engines: {node: '>=18.0.0'} - '@xstate/react@6.0.0': - resolution: {integrity: sha512-xXlLpFJxqLhhmecAXclBECgk+B4zYSrDTl8hTfPZBogkn82OHKbm9zJxox3Z/YXoOhAQhKFTRLMYGdlbhc6T9A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - xstate: ^5.20.0 - peerDependenciesMeta: - xstate: - optional: true + '@zxing/text-encoding@0.9.0': + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -3799,10 +4013,6 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -3818,11 +4028,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -3836,14 +4041,6 @@ packages: peerDependencies: ajv: ^8.0.1 - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -3898,49 +4095,61 @@ packages: argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.4: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.filter@1.0.3: + resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} engines: {node: '>= 0.4'} - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + array.prototype.findlast@1.2.4: + resolution: {integrity: sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==} engines: {node: '>= 0.4'} - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + array.prototype.findlastindex@1.2.4: + resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} + asn1js@3.0.6: + resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} + engines: {node: '>=12.0.0'} ast-module-types@6.0.1: resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} @@ -3959,6 +4168,12 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + autoprefixer@10.4.18: resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} engines: {node: ^10 || ^12 || >=14} @@ -3970,13 +4185,18 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.11.0: - resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==} + axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} engines: {node: '>=4'} - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + axios@1.7.8: + resolution: {integrity: sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} b4a@1.7.3: resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} @@ -3986,67 +4206,71 @@ packages: react-native-b4a: optional: true - babel-dead-code-elimination@1.0.12: - resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + babel-dead-code-elimination@1.0.10: + resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - balanced-match@3.0.1: - resolution: {integrity: sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==} - engines: {node: '>= 16'} + babel-plugin-polyfill-corejs2@0.4.10: + resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - bare-events@2.7.0: - resolution: {integrity: sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==} + babel-plugin-polyfill-corejs3@0.9.0: + resolution: {integrity: sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - bare-fs@4.5.5: - resolution: {integrity: sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==} - engines: {bare: '>=1.16.0'} + babel-plugin-polyfill-regenerator@0.5.5: + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - bare-os@3.7.1: - resolution: {integrity: sha512-ebvMaS5BgZKmJlvuWh14dg9rbUI84QeV3WlWn6Ph6lFI8jJoh7ADtVTyD2c93euwbe+zgi0DVrl4YmqXeM9aIA==} - engines: {bare: '>=1.14.0'} + babel-plugin-transform-react-remove-prop-types@0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + babel-preset-react-app@10.0.1: + resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} - bare-stream@2.8.1: - resolution: {integrity: sha512-bSeR8RfvbRwDpD7HWZvn8M3uYNDrk7m9DQjYOFkENZlXW8Ju/MPaqUPQq5LqJ3kyjEm07siTaAQ7wBKCU59oHg==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.7.0: + resolution: {integrity: sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + + before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + better-ajv-errors@1.2.0: resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} engines: {node: '>= 12.13.0'} peerDependencies: ajv: 4.11.8 - 8 - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + better-auth@1.3.8: + resolution: {integrity: sha512-uRFzHbWkhr8eWNy+BJwyMnrZPOvQjwrcLND3nc6jusRteYA9cjeRGElgCPTWTIyWUfzaQ708Lb5Mdq9Gv41Qpw==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + better-call@1.0.16: + resolution: {integrity: sha512-42dgJ1rOtc0anOoxjXPOWuel/Z/4aeO7EJ2SiXNwvlkySSgjXhNjAjTMWa8DL1nt6EXS3jl3VKC3mPsU/lUgVA==} binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} @@ -4058,23 +4282,18 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} - engines: {node: '>=18'} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - brace-expansion@4.0.1: - resolution: {integrity: sha512-YClrbvTCXGe70pU2JiEiPLYXO9gQkyxYeKpJIQHVS/gOs6EWMQP2RYBwjFLNT322Ji8TOC3IMPfsYCedNpzKfA==} - engines: {node: '>= 18'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -4084,11 +4303,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - btoa@1.2.1: - resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} - engines: {node: '>= 0.4.0'} - hasBin: true - buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -4105,9 +4319,9 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -4117,10 +4331,6 @@ packages: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} @@ -4136,18 +4346,9 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - camera-controls@3.1.2: - resolution: {integrity: sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA==} - engines: {node: '>=22.0.0', npm: '>=10.5.1'} - peerDependencies: - three: '>=0.126.1' - caniuse-lite@1.0.30001692: resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -4160,14 +4361,14 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -4196,26 +4397,35 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - cjs-module-lexer@2.2.0: - resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} - classnames@2.3.2: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -4255,8 +4465,12 @@ packages: resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==} engines: {node: '>=18'} - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} @@ -4284,10 +4498,17 @@ packages: common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + compress-commons@6.0.2: resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} engines: {node: '>= 14'} + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -4297,23 +4518,75 @@ packages: confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - content-disposition@1.0.1: - resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} - engines: {node: '>=18'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + convex-helpers@0.1.104: + resolution: {integrity: sha512-7CYvx7T3K6n+McDTK4ZQaQNNGBzq5aWezpjzsKbOxPXx7oNcTP9wrpef3JxeXWFzkByJv5hRCjseh9B7eNJ7Ig==} + hasBin: true + peerDependencies: + '@standard-schema/spec': ^1.0.0 + convex: ^1.24.0 + hono: ^4.0.5 + react: ^17.0.2 || ^18.0.0 || ^19.0.0 + typescript: ^5.5 + zod: ^3.22.4 || ^4.0.15 + peerDependenciesMeta: + '@standard-schema/spec': + optional: true + hono: + optional: true + react: + optional: true + typescript: + optional: true + zod: + optional: true - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convex-helpers@0.1.99: + resolution: {integrity: sha512-W4sV9676vWWIwfYvG76Dxf7biDgpYggvwTLW5fJgLhXIb/XUCacO2AOXu+HrW85GvPRb1LLjhWgWPH8byHiTsw==} + hasBin: true + peerDependencies: + '@standard-schema/spec': ^1.0.0 + convex: ^1.13.0 + hono: ^4.0.5 + react: ^17.0.2 || ^18.0.0 || ^19.0.0 + typescript: ^5.5 + zod: ^3.22.4 + peerDependenciesMeta: + '@standard-schema/spec': + optional: true + hono: + optional: true + react: + optional: true + typescript: + optional: true + zod: + optional: true - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convex@1.27.0: + resolution: {integrity: sha512-IHkqZX3GtY4nKFPTAR4mvWHHhDiQX9PM7EjpEv0pJWoMoq0On6oOL3iZ7Xz4Ls96dF7WJd4AjfitJsg2hUnLSQ==} + engines: {node: '>=18.0.0', npm: '>=7.0.0'} + hasBin: true + peerDependencies: + '@auth0/auth0-react': ^2.0.1 + '@clerk/clerk-react': ^4.12.8 || ^5.0.0 + react: ^18.0.0 || ^19.0.0-0 || ^19.0.0 + peerDependenciesMeta: + '@auth0/auth0-react': + optional: true + '@clerk/clerk-react': + optional: true + react: + optional: true cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} @@ -4321,10 +4594,14 @@ packages: cookie-es@2.0.0: resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + cookie-signature@1.2.1: + resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} engines: {node: '>=6.6.0'} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} @@ -4337,13 +4614,12 @@ packages: resolution: {integrity: sha512-X8XDzyvYaA6msMyAM575CUoygY5b44QzLcGRKsK3MFmXcOvQa518dNPLsKYwkYsn72g3EiW+LE0ytd/FlqWmyw==} engines: {node: '>=18'} + core-js-compat@3.36.0: + resolution: {integrity: sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==} + 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'} - cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -4367,13 +4643,8 @@ packages: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} - cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - - cross-spawn@6.0.6: - resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} + cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} cross-spawn@7.0.6: @@ -4410,8 +4681,8 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} cytoscape-cose-bilkent@4.1.0: resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} @@ -4575,29 +4846,32 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-uri-to-buffer@3.0.1: + resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} + engines: {node: '>= 6'} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-view-buffer@1.0.2: - 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'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + dayjs@1.11.18: resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -4619,9 +4893,6 @@ packages: decache@4.6.2: resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} - decode-named-character-reference@1.2.0: - resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} - dedent@1.7.0: resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} peerDependencies: @@ -4651,9 +4922,9 @@ packages: delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} @@ -4665,9 +4936,6 @@ packages: destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - detect-gpu@5.0.70: - resolution: {integrity: sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==} - detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -4730,21 +4998,22 @@ packages: dettle@1.0.5: resolution: {integrity: sha512-ZVyjhAJ7sCe1PNXEGveObOH9AC8QvMga3HJIghHawtG7mE4K5pW9nz/vDGAr/U7a3LWgdOzEE7ac9MURnyfaTA==} - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff@8.0.2: resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} - discord-interactions@4.4.0: - resolution: {integrity: sha512-jjJx8iwAeJcj8oEauV43fue9lNqkf38fy60aSs2+G8D1nJmDxUIrk08o3h0F3wgwuBWWJUZO+X/VgfXsxpCiJA==} - engines: {node: '>=18.4.0'} + 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'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -4777,129 +5046,25 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - draco3d@1.5.7: - resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} - - drizzle-kit@0.31.7: - resolution: {integrity: sha512-hOzRGSdyKIU4FcTSFYGKdXEjFsncVwHZ43gY3WU5Bz9j5Iadp6Rh6hxLSQ1IWXpKLBKt/d5y1cpSPcV+FcoQ1A==} - hasBin: true + download-stats@0.3.4: + resolution: {integrity: sha512-ic2BigbyUWx7/CBbsfGjf71zUNZB4edBGC3oRliSzsoNmvyVx3Ycfp1w3vp2Y78Ee0eIIkjIEO5KzW0zThDGaA==} + engines: {node: '>=0.10.0'} - drizzle-orm@0.44.7: - resolution: {integrity: sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ==} - 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.13' - '@prisma/client': '*' - '@tidbcloud/serverless': '*' - '@types/better-sqlite3': '*' - '@types/pg': '*' - '@types/sql.js': '*' - '@upstash/redis': '>=1.34.7' - '@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': - optional: true - '@cloudflare/workers-types': - optional: true - '@electric-sql/pglite': - optional: true - '@libsql/client': - optional: true - '@libsql/client-wasm': - optional: true - '@neondatabase/serverless': - optional: true - '@op-engineering/op-sqlite': - optional: true - '@opentelemetry/api': - optional: true - '@planetscale/database': - optional: true - '@prisma/client': - optional: true - '@tidbcloud/serverless': - optional: true - '@types/better-sqlite3': - optional: true - '@types/pg': - optional: true - '@types/sql.js': - optional: true - '@upstash/redis': - optional: true - '@vercel/postgres': - optional: true - '@xata.io/client': - optional: true - better-sqlite3: - optional: true - bun-types: - optional: true - expo-sqlite: - optional: true - gel: - optional: true - knex: - optional: true - kysely: - optional: true - mysql2: - optional: true - pg: - optional: true - postgres: - optional: true - prisma: - optional: true - sql.js: - optional: true - sqlite3: - optional: true + downshift@9.0.9: + resolution: {integrity: sha512-ygOT8blgiz5liDuEFAIaPeU4dDEa+w9p6PHVUisPIjrkF5wfR59a52HpGWAVVMoWnoFO8po2mZSScKZueihS7g==} + peerDependencies: + react: '>=16.12.0' dunder-proto@1.0.1: 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==} ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - effect@3.17.7: - resolution: {integrity: sha512-dpt0ONUn3zzAuul6k4nC/coTTw27AL5nhkORXgTi6NfMPzqWYa1M05oKmOMTxpVSTKepqXVcW9vIwkuaaqx9zA==} - - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - electron-to-chromium@1.5.83: resolution: {integrity: sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==} @@ -4916,10 +5081,6 @@ packages: enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - encoding-sniffer@0.2.1: resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} @@ -4945,16 +5106,12 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-abstract@1.22.5: resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} engines: {node: '>= 0.4'} - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} + es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} @@ -4964,8 +5121,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + es-iterator-helpers@1.0.17: + resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} engines: {node: '>= 0.4'} es-module-lexer@1.7.0: @@ -4979,10 +5136,6 @@ packages: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} @@ -4990,35 +5143,18 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} - peerDependencies: - esbuild: '>=0.12 <1' - - esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.25.10: resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} hasBin: true - esbuild@0.27.0: - resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -5026,9 +5162,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -5046,27 +5179,112 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + eslint-config-react-app@7.0.1: + resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-flowtype@8.0.3: + resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@babel/plugin-syntax-flow': ^7.14.5 + '@babel/plugin-transform-react-jsx': ^7.14.9 + eslint: ^8.1.0 + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jest@25.7.0: + resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-jsx-a11y@6.8.0: + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} engines: {node: '>=4.0'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - eslint-plugin-react-hooks@7.0.1: - resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} - engines: {node: '>=18'} + eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + 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: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + eslint-plugin-react@7.34.0: + resolution: {integrity: sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==} engines: {node: '>=4'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-plugin-testing-library@5.11.1: + resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 + + eslint-plugin-unicorn@49.0.0: + resolution: {integrity: sha512-0fHEa/8Pih5cmzFW5L7xMEfUTvI9WKeQtjmKpTUmY+BiFCDxkxrTdnURJOHKykhtwIeyYsxnecbGvDCml++z4Q==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.52.0' + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -5076,22 +5294,18 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true esm-env@1.1.4: resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==} - espree@10.4.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} esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -5106,6 +5320,10 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -5132,32 +5350,10 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.6: - resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - execa@9.6.1: - resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} - engines: {node: ^18.19.0 || >=20.5.0} - - express-rate-limit@7.5.1: - resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} - exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} @@ -5173,9 +5369,8 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true - fast-check@3.23.2: - resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} - engines: {node: '>=8.0.0'} + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -5224,30 +5419,20 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} - fflate@0.6.10: - resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} - - fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + fetchdts@0.1.7: + resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - file-selector@0.6.0: - resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} - engines: {node: '>= 12'} + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -5256,17 +5441,14 @@ packages: resolution: {integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==} engines: {node: '>=18'} - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} - - find-my-way-ts@0.1.6: - resolution: {integrity: sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==} - 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'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -5275,9 +5457,9 @@ packages: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -5285,39 +5467,52 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} - forwarded-parse@2.1.2: - resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} + framer-motion@11.18.2: + resolution: {integrity: sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + fs-monkey@1.1.0: + resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -5331,10 +5526,6 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -5377,18 +5568,10 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} @@ -5403,23 +5586,28 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regex.js@1.2.0: - resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@13.0.0: - resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} - engines: {node: 20 || >=22} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} @@ -5429,16 +5617,13 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} - globalthis@1.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'} globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - glsl-noise@0.0.0: - resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==} - gonzales-pe@4.3.0: resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} engines: {node: '>=0.6.0'} @@ -5459,19 +5644,25 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphql-tag@2.12.6: + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + graphql@16.11.0: + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} - h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} - h3@2.0.1-rc.11: - resolution: {integrity: sha512-2myzjCqy32c1As9TjZW9fNZXtLqNedjFSrdFy2AjFBQQ3LzrnGoDdFDYfC0tV2e4vcyfJ2Sfo/F6NQhO2Ly/Mw==} + h3@2.0.0-beta.4: + resolution: {integrity: sha512-/JdwHUGuHjbBXAVxQN7T7QeI9cVlhsqMKVNFHebZVs9RoEYH85Ogh9O1DEy/1ZiJkmMwa1gNg6bBcGhc1Itjdg==} engines: {node: '>=20.11.1'} peerDependencies: crossws: ^0.4.1 @@ -5500,10 +5691,6 @@ packages: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} - has-proto@1.2.0: - 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'} @@ -5516,60 +5703,16 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hast-util-from-html@2.0.3: - resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - - hast-util-from-parse5@8.0.3: - resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - - hast-util-heading-rank@3.0.0: - resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} - - hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - - hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-raw@9.1.0: - resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} - - hast-util-to-string@3.0.1: - resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - hastscript@9.0.1: - resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} - - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - - hls.js@1.6.15: - resolution: {integrity: sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==} + highlight.js@11.10.0: + resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} + engines: {node: '>=12.0.0'} hogan.js@3.0.2: resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==} hasBin: true - hono-rate-limiter@0.4.2: - resolution: {integrity: sha512-AAtFqgADyrmbDijcRTT/HJfwqfvhalya2Zo+MgfdrMPas3zSMD8SU03cv+ZsYwRU1swv7zgVt0shwN059yzhjw==} - peerDependencies: - hono: ^4.1.1 - - hono@4.11.3: - resolution: {integrity: sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==} - engines: {node: '>=16.9.0'} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -5593,19 +5736,12 @@ packages: '@types/react': optional: true - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} htmlparser2@9.1.0: resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - http-shutdown@1.2.2: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -5622,27 +5758,10 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - human-signals@8.0.1: - resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} - engines: {node: '>=18.18.0'} - - husky@9.1.7: - resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} - engines: {node: '>=18'} - hasBin: true - - hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5650,10 +5769,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - image-meta@0.2.2: resolution: {integrity: sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==} @@ -5662,24 +5777,21 @@ packages: engines: {node: '>=16.x'} hasBin: true - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - import-in-the-middle@2.0.6: - resolution: {integrity: sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==} + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + indent-string@5.0.0: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} @@ -5688,9 +5800,16 @@ packages: resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} engines: {node: '>=18'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + inline-style-parser@0.2.3: resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} @@ -5706,10 +5825,6 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -5720,10 +5835,6 @@ packages: interval-tree-1d@1.0.4: resolution: {integrity: sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - ipx@3.1.1: resolution: {integrity: sha512-7Xnt54Dco7uYkfdAw0r2vCly3z0rSaVhEXMzPvl3FndsTVm5p26j+PO+gyinkYmcsEUvX2Rh7OGK7KzYWRu6BA==} hasBin: true @@ -5731,12 +5842,18 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} is-arrayish@0.2.1: @@ -5749,10 +5866,6 @@ packages: is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -5761,9 +5874,16 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=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==} @@ -5773,22 +5893,12 @@ packages: 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'} - is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} - is-date-object@1.1.0: - 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-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} @@ -5803,9 +5913,8 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -5819,6 +5928,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -5840,14 +5952,14 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} - is-number-object@1.1.1: - 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'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-path-inside@4.0.0: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} @@ -5860,24 +5972,18 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} - is-regex@1.2.1: - 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'} @@ -5886,10 +5992,6 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -5906,26 +6008,14 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -5944,18 +6034,10 @@ packages: is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} - 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'} @@ -5977,26 +6059,19 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + isoformat@0.2.1: resolution: {integrity: sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ==} - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - - its-fine@2.0.0: - resolution: {integrity: sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==} - peerDependencies: - react: ^19.0.0 + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jake@10.9.4: - resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} - engines: {node: '>=10'} - hasBin: true - jiti@2.5.1: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true @@ -6008,20 +6083,29 @@ packages: jose@5.10.0: resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} - jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} - jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + js-image-generator@1.0.4: resolution: {integrity: sha512-ckb7kyVojGAnArouVR+5lBIuwU1fcrn7E/YYSd0FK7oIngAkMmRvHASLro9Zt5SQdWToaI66NybG+OGxPw/HlQ==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true jsesc@3.1.0: @@ -6044,17 +6128,22 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -6067,9 +6156,6 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - junk@4.0.1: resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} engines: {node: '>=12.20'} @@ -6077,8 +6163,8 @@ packages: jwa@1.4.2: resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} - jws@3.2.3: - resolution: {integrity: sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==} + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} jwt-decode@4.0.0: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} @@ -6094,6 +6180,10 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -6130,6 +6220,10 @@ packages: layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + lazy-cache@2.0.2: + resolution: {integrity: sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==} + engines: {node: '>=0.10.0'} + lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -6142,9 +6236,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - lightningcss-darwin-arm64@1.30.1: resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} engines: {node: '>= 12.0.0'} @@ -6212,10 +6303,22 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + listhen@1.9.0: resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true + lit-element@4.1.0: + resolution: {integrity: sha512-gSejRUQJuMQjV2Z59KAS/D4iElUhwKpIyJvZ9w+DIagIQjfJnhR20h2Q5ddpzXGS+fF0tMZ/xEYGMnKmaI/iww==} + + lit-html@3.2.0: + resolution: {integrity: sha512-pwT/HwoxqI9FggTrYVarkBKFN9MlTUpLrDHubTmW4SrkL3kkqW5gxwbxMMUnbbRHBC0WTZnYHcjDSCM559VyfA==} + + lit@3.2.0: + resolution: {integrity: sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw==} + load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} @@ -6224,6 +6327,10 @@ packages: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -6238,6 +6345,9 @@ packages: lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -6269,9 +6379,6 @@ packages: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -6279,10 +6386,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.5: - resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} - engines: {node: 20 || >=22} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -6290,81 +6393,72 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lucide-react@0.561.0: - resolution: {integrity: sha512-Y59gMY38tl4/i0qewcqohPdEbieBy7SovpBL9IFebhc2mDd8x4PZSOsiFRkpPcOq6bj1r/mjH/Rk73gSlIJP2A==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lucia@3.2.2: + resolution: {integrity: sha512-P1FlFBGCMPMXu+EGdVD9W4Mjm0DqsusmKgO7Xc33mI5X1bklmsQb0hfzPhXomQr9waWIBDsiOjvr1e6BTaUqpA==} + deprecated: This package has been deprecated. Please see https://lucia-auth.com/lucia-v3/migrate. luxon@3.5.0: resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} engines: {node: '>=12'} - maath@0.10.8: - resolution: {integrity: sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==} - peerDependencies: - '@types/three': '>=0.134.0' - three: '>=0.134.0' - magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + map-obj@5.0.2: resolution: {integrity: sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + marked-alert@2.0.1: + resolution: {integrity: sha512-dREhBjpPEN87b5AdlpETVoEpYiROQJ2M01sqjvQetKqpfi92BQRfSFKPIEkm90RnMpv5CFLNpWfGO6bx+tnayQ==} + peerDependencies: + marked: '>=7.0.0' + + marked-gfm-heading-id@4.0.0: + resolution: {integrity: sha512-p53gp+nBIGeryucXzUFP8w67wtpin68+jOFBPw5m9FUfqx2ngAunO/I6KU6J3Xm3fyuv2JsSDxz0Z+pYVrHrwg==} + peerDependencies: + marked: '>=13 <14' + + marked-highlight@2.1.4: + resolution: {integrity: sha512-D1GOkcdzP+1dzjoColL7umojefFrASDuLeyaHS0Zr/Uo9jkr1V6vpLRCzfi1djmEaWyK0SYMFtHnpkZ+cwFT1w==} + peerDependencies: + marked: '>=4 <15' + + marked@13.0.2: + resolution: {integrity: sha512-J6CPjP8pS5sgrRqxVRvkCIkZ6MFdRIjDkwUwgJ9nL2fbmM6qGQeB2C16hi8Cc9BOzj6xXzy0jyi0iPIfnMHYzA==} + engines: {node: '>= 18'} + hasBin: true marked@15.0.12: resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} engines: {node: '>= 18'} hasBin: true - match-sorter@8.2.0: - resolution: {integrity: sha512-qRVB7wYMJXizAWR4TKo5UYwgW7oAVzA8V9jve0wGzRvV91ou9dcqL+/2gJtD0PZ/Pm2Fq6cVT4VHXHmDFVMGRA==} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - - mdast-util-from-markdown@2.0.2: - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} - - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - - mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - - mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + mdast-util-definitions@4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + mdast-util-to-hast@10.2.0: + resolution: {integrity: sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==} - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} @@ -6372,23 +6466,23 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - memfs@4.56.10: - resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==} - peerDependencies: - tslib: '2' + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + memfs-browser@3.5.10302: + resolution: {integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - merge-options@3.0.4: resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} engines: {node: '>=10'} @@ -6403,121 +6497,36 @@ packages: mermaid@11.11.0: resolution: {integrity: sha512-9lb/VNkZqWTRjVgCV+l1N+t4kyi94y+l5xrmBmbbxZYkfRl5hEDaTPMOcaWKCl1McG8nBEaMlWwkcAEEgjhBgg==} - meshline@3.3.1: - resolution: {integrity: sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==} - peerDependencies: - three: '>=0.137' - - meshoptimizer@0.22.0: - resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==} - - micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - - micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - - micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - - micromark-extension-gfm-table@2.1.1: - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - - micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - - micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - - micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - - micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - - micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - - micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + mime-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-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} - mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - minimatch@10.1.1: - resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} - engines: {node: 20 || >=22} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -6526,6 +6535,14 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -6533,6 +6550,10 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -6545,10 +6566,6 @@ packages: resolution: {integrity: sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==} deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - mkdirp@3.0.1: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} @@ -6562,40 +6579,50 @@ packages: engines: {node: '>=18'} hasBin: true - module-details-from-path@1.0.4: - resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + motion-dom@11.18.1: + resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} - hasBin: true + motion-utils@11.18.1: + resolution: {integrity: sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==} + + mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} - msgpackr@1.11.8: - resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - multipasta@0.2.7: - resolution: {integrity: sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==} + nano@10.1.4: + resolution: {integrity: sha512-bJOFIPLExIbF6mljnfExXX9Cub4W0puhDjVMp+qV40xl/DBvgKao7St4+6/GB6EoHZap7eFnrnx4mnp5KYgwJA==} + engines: {node: '>=14'} nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanostores@0.11.4: + resolution: {integrity: sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ==} + engines: {node: ^18.0.0 || >=20.0.0} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - netlify-redirector@0.5.0: resolution: {integrity: sha512-4zdzIP+6muqPCuE8avnrgDJ6KW/2+UpHTRcTbMXCIRxiRmyrX+IZ4WSJGZdHPWF3WmQpXpy603XxecZ9iygN7w==} nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} @@ -6620,14 +6647,10 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-forge@1.3.3: - resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - node-gyp-build-optional-packages@5.2.2: - resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} - hasBin: true - node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -6674,8 +6697,9 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - normalize-wheel@1.0.1: - resolution: {integrity: sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==} + npm-api@1.0.1: + resolution: {integrity: sha512-4sITrrzEbPcr0aNV28QyOmgn6C9yKiF8k92jn4buYAK8wmA5xo1qL3II5/gT1r7wxbXBflSduZ2K3FbtOrtGkA==} + engines: {node: '>=10.0'} npm-run-all@4.1.5: resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} @@ -6686,10 +6710,6 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -6715,24 +6735,27 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} engines: {node: '>= 0.4'} - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.groupby@1.0.2: + resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} + + object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + octokit@4.1.4: + resolution: {integrity: sha512-cRvxRte6FU3vAHRC9+PMSY3D+mRAs2Rd9emMoqp70UGRvJRM3sbAoim2IXRZNNsf8wVfn4sGxVBHRAP+JBVX/g==} + engines: {node: '>= 18'} ofetch@1.4.1: resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} @@ -6740,10 +6763,6 @@ packages: omit.js@2.0.2: resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -6754,22 +6773,22 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - open@7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} - optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + oslo@1.2.1: + resolution: {integrity: sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA==} + deprecated: Package is no longer supported. Please see https://oslojs.dev for the successor project. p-event@6.0.1: resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} engines: {node: '>=16.17'} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -6782,6 +6801,10 @@ packages: resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -6802,6 +6825,10 @@ packages: 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'} @@ -6812,13 +6839,17 @@ packages: package-manager-detector@1.3.0: resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + paged-request@2.0.2: + resolution: {integrity: sha512-NWrGqneZImDdcMU/7vMcAOo1bIi5h/pmpJqe7/jdsy85BA/s5MSaU/KlpxwW/IVPmIwBcq2uKPrBWWhEWhtxag==} + engines: {node: '>=8'} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-gitignore@2.0.0: resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} engines: {node: '>=14'} @@ -6839,10 +6870,6 @@ packages: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - parse5-htmlparser2-tree-adapter@7.1.0: resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} @@ -6852,10 +6879,6 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} @@ -6867,6 +6890,10 @@ packages: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} @@ -6886,12 +6913,8 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} - engines: {node: 20 || >=22} - - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} @@ -6914,25 +6937,6 @@ packages: pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} - - pg-numeric@1.0.2: - resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} - engines: {node: '>=4'} - - pg-protocol@1.10.3: - resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} - - pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} - - pg-types@4.1.0: - resolution: {integrity: sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg==} - engines: {node: '>=10'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -6956,26 +6960,12 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} - pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - playwright-core@1.57.0: - resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==} - engines: {node: '>=18'} - hasBin: true - - playwright@1.57.0: - resolution: {integrity: sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==} - engines: {node: '>=18'} - hasBin: true - pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -7007,52 +6997,6 @@ packages: 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'} - - postgres-array@3.0.4: - resolution: {integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==} - engines: {node: '>=12'} - - postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} - - postgres-bytea@3.0.0: - resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} - engines: {node: '>= 6'} - - postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} - - postgres-date@2.1.0: - resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} - engines: {node: '>=12'} - - postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} - - postgres-interval@3.0.0: - resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} - engines: {node: '>=12'} - - postgres-range@1.1.4: - resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} - - postgres@3.4.7: - resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} - engines: {node: '>=12'} - - posthog-node@5.20.0: - resolution: {integrity: sha512-LkR5KfrvEQTnUtNKN97VxFB00KcYG1Iz8iKg8r0e/i7f1eQhg1WSZO+Jp1B4bvtHCmdpIE4HwYbvCCzFoCyjVg==} - engines: {node: '>=20'} - - potpack@1.0.2: - resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} - preact-render-to-string@5.2.3: resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} peerDependencies: @@ -7073,18 +7017,19 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.7.4: - resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + prettier@2.8.8: + 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'} hasBin: true pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - pretty-ms@9.3.0: - resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} - engines: {node: '>=18'} - process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -7096,21 +7041,11 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - promise-worker-transferable@1.0.4: - resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} - prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -7118,23 +7053,36 @@ packages: pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.3: + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + qs@6.9.7: + resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==} engines: {node: '>=0.6'} + qss@3.0.0: + resolution: {integrity: sha512-ZHoCB3M/3Voev64zhLLUOKDtaEdJ/lymsJJ7R3KBusVZ2ovNiIB7XOq3Xh6V1a8O+Vho+g2B5YElq9zW7D8aQw==} + engines: {node: '>=4'} + quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -7147,30 +7095,21 @@ packages: 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'} - - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} - react-colorful@5.6.1: resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - react-dom@19.2.3: - resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} peerDependencies: - react: ^19.2.3 + react: ^19.0.0 - react-easy-crop@5.5.6: - resolution: {integrity: sha512-Jw3/ozs8uXj3NpL511Suc4AHY+mLRO23rUgipXvNYKqezcFSYHxe4QXibBymkOoY6oOtLVMPO2HNPRHYvMPyTw==} + react-icons@5.3.0: + resolution: {integrity: sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==} peerDependencies: - react: '>=16.4.0' - react-dom: '>=16.4.0' + react: '*' react-instantsearch-core@7.15.5: resolution: {integrity: sha512-SFxiwwMf0f5F/8U0Y4ullvQ7bZtbYE516UOJbxaHhjV8yY0i8c22K4lrBFrYbxVRT7QAcp2wLGHiB7r/lD7eRA==} @@ -7188,6 +7127,18 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + react-markdown@6.0.3: + resolution: {integrity: sha512-kQbpWiMoBHnj9myLlmZG9T1JdoT/OEyHK7hqM6CqFT14MAkgWiWBUYijLyBmxbntaN6dCDicPcUhWhci1QYodg==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + react-property@2.0.2: resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} @@ -7225,27 +7176,26 @@ packages: '@types/react': optional: true - react-use-measure@2.1.7: - resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==} - peerDependencies: - react: '>=16.13' - react-dom: '>=16.13' - peerDependenciesMeta: - react-dom: - optional: true - - react@19.2.3: - resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} read-package-up@11.0.0: resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} engines: {node: '>=18'} + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} + 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'} @@ -7276,54 +7226,87 @@ packages: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + reflect.getprototypeof@1.0.5: + resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} engines: {node: '>= 0.4'} + regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - rehype-autolink-headings@7.1.0: - resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} - - rehype-callouts@2.1.2: - resolution: {integrity: sha512-ZZWZ6EknUHiSzr4pQ88C7db3su4DElfJRmphZJbXpDdwW3urTwlYZpHckoC9pjEvBmUEEiJAM0uuc2uxyLdTfg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - - rehype-parse@9.0.1: - resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} - - rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - - rehype-slug@6.0.0: - resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} - rehype-stringify@10.0.1: - resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true - remark-gfm@4.0.1: - resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true - remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + remark-parse@9.0.0: + resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} - remark-rehype@11.1.2: - resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + remark-rehype@8.1.0: + resolution: {integrity: sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==} - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remeda@2.26.1: + resolution: {integrity: sha512-hpiLfhUwkJhiMS3Z7dRrygcRdkMRZASw5qUdNdi33x1/Y9y/J5q5TyLyf8btDoVLIcsg/4fzPdaGXDTbnl+ixw==} - remove-accents@0.5.0: - resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + remix-utils@8.5.0: + resolution: {integrity: sha512-Wf9OGSJveBaVHKptbEgxc+DwKRUUGOH+aiaBlsrAA2b4F+gNtCkvaZzA7Tp+1esBElRcRvMZQq/0aSSWFMP18A==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@edgefirst-dev/batcher': ^1.0.0 + '@edgefirst-dev/jwt': ^1.2.0 + '@edgefirst-dev/server-timing': ^0.0.1 + '@oslojs/crypto': ^1.0.1 + '@oslojs/encoding': ^1.1.0 + intl-parse-accept-language: ^1.0.0 + is-ip: ^5.0.1 + react: ^18.0.0 || ^19.0.0 + react-router: ^7.0.0 + zod: ^3.22.4 + peerDependenciesMeta: + '@edgefirst-dev/batcher': + optional: true + '@edgefirst-dev/jwt': + optional: true + '@edgefirst-dev/server-timing': + optional: true + '@oslojs/crypto': + optional: true + '@oslojs/encoding': + optional: true + intl-parse-accept-language: + optional: true + is-ip: + optional: true + react: + optional: true + react-router: + optional: true + zod: + optional: true remove-markdown@0.5.0: resolution: {integrity: sha512-x917M80K97K5IN1L8lUvFehsfhR8cYjGQ/yAMRI9E7JIKivtl5Emo5iD13DhMr+VojzMCiYk8V2byNPwT/oapg==} @@ -7339,25 +7322,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-in-the-middle@8.0.1: - resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} - engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} - require-package-name@2.0.1: resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - resend@6.6.0: - resolution: {integrity: sha512-d1WoOqSxj5x76JtQMrieNAG1kZkh4NU4f+Je1yq4++JsDpLddhEwnJlNfvkCzvUuZy9ZquWmMMAm2mENd2JvRw==} - engines: {node: '>=20'} - peerDependencies: - '@react-email/render': '*' - peerDependenciesMeta: - '@react-email/render': - optional: true - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -7374,11 +7341,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} - engines: {node: '>= 0.4'} - hasBin: true - resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true @@ -7391,34 +7353,28 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@6.1.2: - resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} - engines: {node: 20 || >=22} - hasBin: true - robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + rollup@4.52.2: + resolution: {integrity: sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rou3@0.7.12: - resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==} + rou3@0.5.1: + resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} + + rou3@0.7.5: + resolution: {integrity: sha512-bwUHDHw1HSARty7TWNV71R0NZs5fOt74OM+hcMdJyPfchfRktEmxLoMSNa7PwEp6WqJ0a3feKztsIfTUEYhskw==} roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -7429,28 +7385,16 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} - safe-array-concat@1.1.3: - 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==} - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} - safe-regex-test@1.1.0: - 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'} @@ -7461,8 +7405,8 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} search-insights@2.17.3: resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} @@ -7484,31 +7428,24 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} - hasBin: true - - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} - serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - seroval-plugins@1.5.0: - resolution: {integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==} + seroval-plugins@1.3.3: + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 - seroval@1.5.0: - resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} + seroval@1.3.2: + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -7518,19 +7455,13 @@ packages: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} - set-function-name@2.0.2: - 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'} - - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + set-getter@0.1.1: + resolution: {integrity: sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==} + engines: {node: '>=0.10.0'} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} sharp@0.34.4: resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} @@ -7578,13 +7509,15 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + slashes@3.0.12: resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} - source-map-explorer@2.5.3: - resolution: {integrity: sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg==} - engines: {node: '>=12'} - hasBin: true + solid-js@1.9.9: + resolution: {integrity: sha512-A0ZBPJQldAeGCTW0YRYJmt7RCeh5rbFfPZ2aOttgYnctHE7HgKeHCBB/PVc2P7eOfmNXqMFFFoYYdm3S4dcbkA==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -7601,8 +7534,8 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -7619,40 +7552,32 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sqids@0.3.0: - resolution: {integrity: sha512-lOQK1ucVg+W6n3FhRwwSeUijxe93b51Bfz5PMRMihVf1iVkl82ePQG7V5vwrhzB11v0NtsR25PSZRGiSomJaJw==} - - srvx@0.10.1: - resolution: {integrity: sha512-A//xtfak4eESMWWydSRFUVvCTQbSwivnGCEf8YGPe2eHU0+Z6znfUTCPF0a7oV3sObSOcrXHlL6Bs9vVctfXdg==} + srvx@0.8.7: + resolution: {integrity: sha512-g3+15LlwVOGL2QpoTPZlvRjg+9a5Tx/69CatXjFP6txvhIaW2FmGyzJfb8yft5wyfGddvJmP/Yx+e/uNDMRSLQ==} engines: {node: '>=20.16.0'} hasBin: true + sse.js@2.5.0: + resolution: {integrity: sha512-I7zYndqOOkNpz9KIdFZ8c8A7zs1YazNewBr8Nsi/tqThfJkVPuP1q7UE2h4B0RwoWZxbBYpd06uoW3NI3SaZXg==} + stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - stats-gl@2.4.2: - resolution: {integrity: sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==} - peerDependencies: - '@types/three': '*' - three: '*' - - stats.js@0.17.0: - resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} - - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} + standardwebhooks@1.0.0: + resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} + stream-slice@0.1.2: + resolution: {integrity: sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==} streamx@2.23.0: resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + string-natural-compare@3.0.1: + resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -7661,25 +7586,13 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} + string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} string.prototype.padend@3.1.5: resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} engines: {node: '>= 0.4'} - string.prototype.repeat@1.0.0: - 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'} - string.prototype.trim@1.2.8: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} @@ -7687,26 +7600,15 @@ packages: string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} - string.prototype.trimstart@1.0.8: - 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==} - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -7727,9 +7629,9 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -7738,6 +7640,9 @@ packages: style-to-js@1.1.12: resolution: {integrity: sha512-tv+/FkgNYHI2fvCoBMsqPHh5xovwiw+C3X0Gfnss/Syau0Nr3IqGOJ9XiOYXoPnToHVbllKFf5qCNFJGwFg5mg==} + style-to-object@0.3.0: + resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + style-to-object@1.0.6: resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} @@ -7756,18 +7661,15 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - suspend-react@0.1.3: - resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} - peerDependencies: - react: '>=17.0' - svgo@4.0.0: resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} engines: {node: '>=16'} hasBin: true - svix@1.76.1: - resolution: {integrity: sha512-CRuDWBTgYfDnBLRaZdKp9VuoPcNUq9An14c/k+4YJ15Qc5Grvf66vp0jvTltd4t7OIRj+8lM1DAgvSgvf7hdLw==} + swr@2.3.4: + resolution: {integrity: sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} @@ -7779,11 +7681,6 @@ packages: tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} - tailwindcss-animate@1.0.7: - resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' - tailwindcss@4.1.11: resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} @@ -7791,20 +7688,13 @@ packages: resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} - tar-stream@3.1.8: - resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - teex@1.0.1: - resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - - temp@0.9.4: - resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} - engines: {node: '>=6.0.0'} - terser@5.44.0: resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} @@ -7816,24 +7706,11 @@ packages: text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - thingies@2.5.0: - resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} - engines: {node: '>=10.18'} - peerDependencies: - tslib: ^2 - - three-mesh-bvh@0.8.3: - resolution: {integrity: sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==} - peerDependencies: - three: '>= 0.159.0' - - three-stdlib@2.36.1: - resolution: {integrity: sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==} - peerDependencies: - three: '>=0.128.0' + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - three@0.182.0: - resolution: {integrity: sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ==} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -7859,13 +7736,17 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + to-regex-range@5.0.1: 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'} + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} toml@3.0.0: resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} @@ -7876,34 +7757,18 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tree-dump@1.1.0: - resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - triple-beam@1.4.1: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} - troika-three-text@0.52.4: - resolution: {integrity: sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==} - peerDependencies: - three: '>=0.125.0' + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - troika-three-utils@0.52.4: - resolution: {integrity: sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==} + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} peerDependencies: - three: '>=0.125.0' - - troika-worker-utils@0.52.0: - resolution: {integrity: sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==} - - trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + typescript: '>=4.2.0' ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} @@ -7925,73 +7790,70 @@ packages: typescript: optional: true + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + tsx@4.20.5: + resolution: {integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==} engines: {node: '>=18.0.0'} hasBin: true - tunnel-rat@0.1.2: - resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - typed-array-length@1.0.5: resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} engines: {node: '>= 0.4'} - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - - typescript-eslint@8.48.1: - resolution: {integrity: sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - typescript@5.9.2: resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -8002,16 +7864,9 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.10.0: resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} @@ -8019,42 +7874,65 @@ packages: resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} engines: {node: '>=20.18.1'} + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + 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'} + unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + + unist-builder@2.0.3: + resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} + + unist-util-generated@1.1.6: + resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} - unified@11.0.5: - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-position@3.1.0: + resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - unist-util-visit-parents@6.0.2: - resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universal-github-app-jwt@2.2.2: + resolution: {integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==} universal-user-agent@6.0.0: resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + universal-user-agent@7.0.3: + resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + 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@1.0.1: + resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} unplugin@2.3.10: resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} @@ -8132,714 +8010,1418 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - uploadthing@7.7.4: - resolution: {integrity: sha512-rlK/4JWHW5jP30syzWGBFDDXv3WJDdT8gn9OoxRJmXLoXi94hBmyyjxihGlNrKhBc81czyv8TkzMioe/OuKGfA==} - engines: {node: '>=18.13.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-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + 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==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + 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==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + + vite-bundle-analyzer@1.2.1: + resolution: {integrity: sha512-dpJMQBnVjieMirpHILmgGsZAWU8fGyqK3ckj6O48wdy3fARlH7Mnz7BfYFUsd3ZdbuXjsYe7t5I/q2zsMOd5ig==} + hasBin: true + + vite-tsconfig-paths@5.0.1: + resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@7.1.7: + resolution: {integrity: sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true peerDependencies: - express: '*' - fastify: '*' - h3: '*' - next: '*' - tailwindcss: ^3.0.0 || ^4.0.0-beta.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' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: - express: + '@types/node': + optional: true + jiti: + optional: true + less: optional: true - fastify: + lightningcss: optional: true - h3: + sass: optional: true - next: + sass-embedded: optional: true - tailwindcss: + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: optional: true - uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + 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 - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - urlpattern-polyfill@10.1.0: - resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + web-encoding@1.1.5: + resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + + 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==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + + 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'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.18.3: + resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==} + engines: {node: '>= 12.0.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + xmlbuilder2@3.1.1: + resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} + engines: {node: '>=12.0'} + + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + + xtend@4.0.2: + 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'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + 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'} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zod@4.0.17: + resolution: {integrity: sha512-1PHjlYRevNxxdy2JZ8JcNAw7rX8V9P1AKkP+x/xZfxB0K5FYfuV+Ug6P/6NVSR2jHQ+FzDDoDHS04nYUsOIyLQ==} + + zod@4.1.9: + resolution: {integrity: sha512-HI32jTq0AUAC125z30E8bQNz0RQ+9Uc+4J7V97gLYjZVKRjeydPgGt6dvQzFrav7MYOUGFqqOGiHpA/fdbd0cQ==} + + zustand@4.5.2: + resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@algolia/client-abtesting@5.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 + + '@algolia/client-analytics@5.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 + + '@algolia/client-common@5.23.4': {} + + '@algolia/client-insights@5.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 + + '@algolia/client-personalization@5.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 + + '@algolia/client-query-suggestions@5.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 + + '@algolia/client-search@5.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 + + '@algolia/events@4.0.1': {} + + '@algolia/ingestion@1.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 + + '@algolia/monitoring@1.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 + + '@algolia/recommend@5.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + '@algolia/requester-browser-xhr': 5.23.4 + '@algolia/requester-fetch': 5.23.4 + '@algolia/requester-node-http': 5.23.4 + + '@algolia/requester-browser-xhr@5.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + + '@algolia/requester-fetch@5.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + + '@algolia/requester-node-http@5.23.4': + dependencies: + '@algolia/client-common': 5.23.4 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 + + '@antfu/utils@9.2.0': {} + + '@auth/core@0.37.0': + dependencies: + '@panva/hkdf': 1.2.1 + '@types/cookie': 0.6.0 + cookie: 0.7.1 + jose: 5.10.0 + oauth4webapi: 3.7.0 + preact: 10.11.3 + preact-render-to-string: 5.2.3(preact@10.11.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 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.27.5': {} + + '@babel/core@7.28.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/eslint-parser@7.23.10(@babel/core@7.28.3)(eslint@8.57.0)': + dependencies: + '@babel/core': 7.28.3 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.57.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 - urlpattern-polyfill@8.0.2: - resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@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.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@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.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - use-isomorphic-layout-effect@1.2.1: - resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 5.3.2 + semver: 6.3.1 - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color - use-sync-external-store@1.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@babel/helper-environment-visitor@7.22.20': {} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 - utility-types@3.11.0: - resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} - engines: {node: '>= 4'} + '@babel/helper-globals@7.28.0': {} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.28.2 - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color - valibot@1.2.0: - resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} - peerDependencies: - typescript: '>=5' - peerDependenciesMeta: - typescript: - optional: true + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color - validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.2 - vfile-location@5.0.3: - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + '@babel/helper-plugin-utils@7.27.1': {} - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color - vite-bundle-analyzer@1.2.1: - resolution: {integrity: sha512-dpJMQBnVjieMirpHILmgGsZAWU8fGyqK3ckj6O48wdy3fARlH7Mnz7BfYFUsd3ZdbuXjsYe7t5I/q2zsMOd5ig==} - hasBin: true + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color - vite-tsconfig-paths@5.0.1: - resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color - vite@7.1.7: - resolution: {integrity: sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@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' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true + '@babel/helper-split-export-declaration@7.24.5': + dependencies: + '@babel/types': 7.28.2 - 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 + '@babel/helper-string-parser@7.27.1': {} - vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} + '@babel/helper-validator-identifier@7.27.1': {} - vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + '@babel/helper-validator-option@7.27.1': {} - vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + '@babel/helper-wrap-function@7.22.20': + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 - vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + '@babel/helpers@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 - vscode-languageserver@9.0.1: - resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} - hasBin: true + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - webgl-constants@1.1.1: - resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - webgl-sdf-generator@1.1.1: - resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.27.1 - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + '@babel/plugin-proposal-decorators@7.24.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.24.0(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.3) - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} + '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + '@babel/plugin-syntax-decorators@7.24.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - winston-transport@4.9.0: - resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} - engines: {node: '>= 12.0.0'} + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - winston@3.18.3: - resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==} - engines: {node: '>= 12.0.0'} + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - xmlbuilder2@4.0.3: - resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} - engines: {node: '>=20.0'} + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - xss@1.0.15: - resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} - engines: {node: '>= 0.10.0'} - hasBin: true + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - xstate@5.25.0: - resolution: {integrity: sha512-yyWzfhVRoTHNLjLoMmdwZGagAYfmnzpm9gPjlX2MhJZsDojXGqRxODDOi4BsgGRKD46NZRAdcLp6CKOyvQS0Bw==} + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - yaml@2.8.1: - resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} - engines: {node: '>= 14.6'} - hasBin: true + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + '@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.28.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.3) - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} - engines: {node: '>=12.20'} + '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} - engines: {node: '>=18'} + '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - zip-stream@6.0.1: - resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} - engines: {node: '>= 14'} + '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} - peerDependencies: - zod: ^3.25 || ^4 + '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.25.0 || ^4.0.0 + '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + '@babel/plugin-transform-classes@7.23.8(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/helper-split-export-declaration': 7.24.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color - zod@4.3.5: - resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} + '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 - zustand@4.5.2: - resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0.6' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true + '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - zustand@5.0.9: - resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=18.0.0' - immer: '>=9.0.6' - react: '>=18.0.0' - use-sync-external-store: '>=1.2.0' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - use-sync-external-store: - optional: true + '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 -snapshots: + '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.3) - '@aashutoshrathi/word-wrap@1.2.6': {} + '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.27.1 - '@algolia/client-abtesting@5.23.4': + '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.28.3) - '@algolia/client-analytics@5.23.4': + '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.3) - '@algolia/client-common@5.23.4': {} + '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color - '@algolia/client-insights@5.23.4': + '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.27.1 - '@algolia/client-personalization@5.23.4': + '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.3) - '@algolia/client-query-suggestions@5.23.4': + '@babel/plugin-transform-literals@7.23.3(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@algolia/client-search@5.23.4': + '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.3) - '@algolia/events@4.0.1': {} + '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@algolia/ingestion@1.23.4': + '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - '@algolia/monitoring@1.23.4': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - '@algolia/recommend@5.23.4': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - '@algolia/requester-browser-xhr@5.23.4': + '@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + transitivePeerDependencies: + - supports-color - '@algolia/requester-fetch@5.23.4': + '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color - '@algolia/requester-node-http@5.23.4': + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.28.3)': dependencies: - '@algolia/client-common': 5.23.4 + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 - '@ampproject/remapping@2.3.0': + '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.28.3)': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@antfu/install-pkg@1.1.0': + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.28.3)': dependencies: - package-manager-detector: 1.3.0 - tinyexec: 1.0.1 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) - '@antfu/utils@9.2.0': {} + '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.3) - '@auth/core@0.37.0': + '@babel/plugin-transform-object-rest-spread@7.24.0(@babel/core@7.28.3)': dependencies: - '@panva/hkdf': 1.2.1 - '@types/cookie': 0.6.0 - cookie: 0.7.1 - jose: 5.10.0 - oauth4webapi: 3.7.0 - preact: 10.11.3 - preact-render-to-string: 5.2.3(preact@10.11.3) + '@babel/compat-data': 7.27.5 + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.28.3) - '@babel/code-frame@7.27.1': + '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - '@babel/code-frame@7.29.0': + '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.28.3)': dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.3) - '@babel/compat-data@7.27.5': {} + '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - '@babel/compat-data@7.29.0': {} + '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/core@7.28.4': + '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.5 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/core@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 + '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/generator@7.28.3': + '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 - jsesc: 3.1.0 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/generator@7.29.0': + '@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-compilation-targets@7.27.2': + '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.28.3)': dependencies: - '@babel/compat-data': 7.27.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.4 - lru-cache: 5.1.1 - semver: 6.3.1 + '@babel/core': 7.28.3 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - '@babel/helper-compilation-targets@7.28.6': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.28.3)': dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.4 - lru-cache: 5.1.1 - semver: 6.3.1 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-globals@7.28.0': {} + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-module-imports@7.27.1': + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/traverse': 7.28.3 + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.28.6': + '@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-runtime@7.24.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.28.3) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.28.3) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.28.3) + semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-string-parser@7.27.1': {} + '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@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.3) + transitivePeerDependencies: + - supports-color - '@babel/helper-validator-option@7.27.1': {} + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@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.4) + transitivePeerDependencies: + - supports-color - '@babel/helpers@7.28.4': + '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helpers@7.28.6': + '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser@7.28.3': + '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/types': 7.28.2 + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser@7.28.4': + '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/types': 7.28.5 + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser@7.29.0': + '@babel/preset-env@7.24.0(@babel/core@7.28.3)': dependencies: - '@babel/types': 7.29.0 + '@babel/compat-data': 7.27.5 + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.28.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.3) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.28.3) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.28.3) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.28.3) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.28.3) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.28.3) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-object-rest-spread': 7.24.0(@babel/core@7.28.3) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.28.3) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.28.3) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.3) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.28.3) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.28.3) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.28.3) + core-js-compat: 3.36.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.2 + esutils: 2.0.3 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.29.0)': + '@babel/preset-react@7.23.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.28.3) + '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.28.4)': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@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.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.28.4)': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@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.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + + '@babel/regjsgen@0.8.0': {} '@babel/runtime@7.24.5': dependencies: regenerator-runtime: 0.14.1 - '@babel/runtime@7.28.4': {} - - '@babel/runtime@7.28.6': - optional: true - '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.3 '@babel/types': 7.28.2 - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - '@babel/traverse@7.28.3': dependencies: '@babel/code-frame': 7.27.1 @@ -8848,7 +9430,7 @@ snapshots: '@babel/parser': 7.28.3 '@babel/template': 7.27.2 '@babel/types': 7.28.2 - debug: 4.4.3 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -8859,19 +9441,7 @@ snapshots: '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.0 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/types': 7.28.4 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -8884,36 +9454,106 @@ snapshots: '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.27.1 + + '@better-auth/utils@0.2.6': + dependencies: + uncrypto: 0.1.3 + + '@better-fetch/fetch@1.1.18': {} + + '@braintree/sanitize-url@7.1.1': {} + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + + '@clerk/backend@2.9.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@clerk/shared': 3.22.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@clerk/types': 4.81.0 + cookie: 1.0.2 + standardwebhooks: 1.0.0 + tslib: 2.8.1 + transitivePeerDependencies: + - react + - react-dom + + '@clerk/clerk-react@5.43.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@clerk/shared': 3.22.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@clerk/types': 4.81.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + tslib: 2.8.1 + + '@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@clerk/shared': 3.26.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@clerk/types': 4.88.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + tslib: 2.8.1 + optional: true + + '@clerk/shared@3.22.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@clerk/types': 4.81.0 + dequal: 2.0.3 + glob-to-regexp: 0.4.1 + js-cookie: 3.0.5 + std-env: 3.9.0 + swr: 2.3.4(react@19.0.0) + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@babel/types@7.28.5': + '@clerk/shared@3.26.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@clerk/types': 4.88.0 + dequal: 2.0.3 + glob-to-regexp: 0.4.1 + js-cookie: 3.0.5 + std-env: 3.9.0 + swr: 2.3.4(react@19.0.0) + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optional: true - '@babel/types@7.29.0': + '@clerk/tanstack-react-start@0.21.5(@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/react-start@1.132.51(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - - '@braintree/sanitize-url@7.1.1': {} + '@clerk/backend': 2.9.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@clerk/clerk-react': 5.43.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@clerk/shared': 3.22.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@clerk/types': 4.81.0 + '@tanstack/react-router': 1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-start': 1.132.51(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + tslib: 2.8.1 - '@chevrotain/cst-dts-gen@11.0.3': + '@clerk/types@4.81.0': dependencies: - '@chevrotain/gast': 11.0.3 - '@chevrotain/types': 11.0.3 - lodash-es: 4.17.21 + csstype: 3.1.3 - '@chevrotain/gast@11.0.3': + '@clerk/types@4.88.0': dependencies: - '@chevrotain/types': 11.0.3 - lodash-es: 4.17.21 - - '@chevrotain/regexp-to-ast@11.0.3': {} - - '@chevrotain/types@11.0.3': {} - - '@chevrotain/utils@11.0.3': {} + csstype: 3.1.3 + optional: true '@colors/colors@1.6.0': {} @@ -8936,11 +9576,82 @@ snapshots: dependencies: '@content-collections/core': 0.8.2(typescript@5.9.2) - '@content-collections/vite@0.2.4(@content-collections/core@0.8.2(typescript@5.9.2))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@content-collections/vite@0.2.4(@content-collections/core@0.8.2(typescript@5.9.2))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@content-collections/core': 0.8.2(typescript@5.9.2) '@content-collections/integrations': 0.2.1(@content-collections/core@0.8.2(typescript@5.9.2)) - vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) + + '@convex-dev/auth@0.0.83(@auth/core@0.37.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)': + dependencies: + '@auth/core': 0.37.0 + convex: 1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + cookie: 1.0.2 + is-network-error: 1.1.0 + jose: 5.10.0 + jwt-decode: 4.0.0 + lucia: 3.2.2 + oauth4webapi: 3.7.0 + oslo: 1.2.1 + path-to-regexp: 6.3.0 + server-only: 0.0.1 + optionalDependencies: + react: 19.0.0 + + '@convex-dev/auth@0.0.88(@auth/core@0.37.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)': + dependencies: + '@auth/core': 0.37.0 + '@oslojs/crypto': 1.0.1 + '@oslojs/encoding': 1.1.0 + convex: 1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + cookie: 1.0.2 + is-network-error: 1.1.0 + jose: 5.10.0 + jwt-decode: 4.0.0 + lucia: 3.2.2 + oauth4webapi: 3.7.0 + path-to-regexp: 6.3.0 + server-only: 0.0.1 + optionalDependencies: + react: 19.0.0 + + '@convex-dev/better-auth@0.7.18(@standard-schema/spec@1.0.0)(better-auth@1.3.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.2)': + dependencies: + better-auth: 1.3.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + common-tags: 1.8.2 + convex: 1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + convex-helpers: 0.1.104(@standard-schema/spec@1.0.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@3.25.76) + is-network-error: 1.1.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + type-fest: 4.41.0 + zod: 3.25.76 + transitivePeerDependencies: + - '@standard-schema/spec' + - hono + - typescript + + '@convex-dev/crons@0.1.9(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))': + dependencies: + convex: 1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + cron-parser: 4.9.0 + + '@convex-dev/react-query@0.0.0-alpha.11(@standard-schema/spec@1.0.0)(@tanstack/react-query@5.90.2(react@19.0.0))(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@4.0.17)': + dependencies: + '@auth/core': 0.37.0 + '@convex-dev/auth': 0.0.83(@auth/core@0.37.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0) + '@tanstack/react-query': 5.90.2(react@19.0.0) + convex: 1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + convex-helpers: 0.1.104(@standard-schema/spec@1.0.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@4.0.17) + transitivePeerDependencies: + - '@simplewebauthn/browser' + - '@simplewebauthn/server' + - '@standard-schema/spec' + - hono + - nodemailer + - react + - typescript + - zod '@dabh/diagnostics@2.0.8': dependencies: @@ -8953,17 +9664,15 @@ snapshots: gonzales-pe: 4.3.0 node-source-walk: 7.0.1 - '@dimforge/rapier3d-compat@0.12.0': {} - - '@drizzle-team/brocli@0.10.2': {} + '@emnapi/core@0.45.0': + dependencies: + tslib: 2.8.1 + optional: true - '@effect/platform@0.90.3(effect@3.17.7)': + '@emnapi/runtime@0.45.0': dependencies: - '@opentelemetry/semantic-conventions': 1.38.0 - effect: 3.17.7 - find-my-way-ts: 0.1.6 - msgpackr: 1.11.8 - multipasta: 0.2.7 + tslib: 2.8.1 + optional: true '@emnapi/runtime@1.5.0': dependencies: @@ -8975,257 +9684,219 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 - '@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': + '@erquhart/convex-oss-stats@0.8.1(@standard-schema/spec@1.0.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@4.0.17)': dependencies: - '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.10.1 + '@convex-dev/crons': 0.1.9(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)) + '@octokit/graphql': 8.2.2 + '@octokit/graphql-schema': 15.26.0 + cheerio: 1.1.2 + convex: 1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + convex-helpers: 0.1.99(@standard-schema/spec@1.0.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@4.0.17) + date-fns: 4.1.0 + framer-motion: 11.18.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + nano: 10.1.4 + npm-api: 1.0.1 + octokit: 4.1.4 + p-limit: 6.2.0 + react: 19.0.0 + remeda: 2.26.1 + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - '@standard-schema/spec' + - debug + - encoding + - hono + - react-dom + - typescript + - zod '@esbuild/aix-ppc64@0.25.10': optional: true - '@esbuild/aix-ppc64@0.25.9': - optional: true - - '@esbuild/aix-ppc64@0.27.0': + '@esbuild/aix-ppc64@0.25.4': optional: true - '@esbuild/android-arm64@0.18.20': + '@esbuild/aix-ppc64@0.25.9': optional: true '@esbuild/android-arm64@0.25.10': optional: true - '@esbuild/android-arm64@0.25.9': - optional: true - - '@esbuild/android-arm64@0.27.0': + '@esbuild/android-arm64@0.25.4': optional: true - '@esbuild/android-arm@0.18.20': + '@esbuild/android-arm64@0.25.9': optional: true '@esbuild/android-arm@0.25.10': optional: true - '@esbuild/android-arm@0.25.9': - optional: true - - '@esbuild/android-arm@0.27.0': + '@esbuild/android-arm@0.25.4': optional: true - '@esbuild/android-x64@0.18.20': + '@esbuild/android-arm@0.25.9': optional: true '@esbuild/android-x64@0.25.10': optional: true - '@esbuild/android-x64@0.25.9': - optional: true - - '@esbuild/android-x64@0.27.0': + '@esbuild/android-x64@0.25.4': optional: true - '@esbuild/darwin-arm64@0.18.20': + '@esbuild/android-x64@0.25.9': optional: true '@esbuild/darwin-arm64@0.25.10': optional: true - '@esbuild/darwin-arm64@0.25.9': - optional: true - - '@esbuild/darwin-arm64@0.27.0': + '@esbuild/darwin-arm64@0.25.4': optional: true - '@esbuild/darwin-x64@0.18.20': + '@esbuild/darwin-arm64@0.25.9': optional: true '@esbuild/darwin-x64@0.25.10': optional: true - '@esbuild/darwin-x64@0.25.9': - optional: true - - '@esbuild/darwin-x64@0.27.0': + '@esbuild/darwin-x64@0.25.4': optional: true - '@esbuild/freebsd-arm64@0.18.20': + '@esbuild/darwin-x64@0.25.9': optional: true '@esbuild/freebsd-arm64@0.25.10': optional: true - '@esbuild/freebsd-arm64@0.25.9': - optional: true - - '@esbuild/freebsd-arm64@0.27.0': + '@esbuild/freebsd-arm64@0.25.4': optional: true - '@esbuild/freebsd-x64@0.18.20': + '@esbuild/freebsd-arm64@0.25.9': optional: true '@esbuild/freebsd-x64@0.25.10': optional: true - '@esbuild/freebsd-x64@0.25.9': - optional: true - - '@esbuild/freebsd-x64@0.27.0': + '@esbuild/freebsd-x64@0.25.4': optional: true - '@esbuild/linux-arm64@0.18.20': + '@esbuild/freebsd-x64@0.25.9': optional: true '@esbuild/linux-arm64@0.25.10': optional: true - '@esbuild/linux-arm64@0.25.9': - optional: true - - '@esbuild/linux-arm64@0.27.0': + '@esbuild/linux-arm64@0.25.4': optional: true - '@esbuild/linux-arm@0.18.20': + '@esbuild/linux-arm64@0.25.9': optional: true '@esbuild/linux-arm@0.25.10': optional: true - '@esbuild/linux-arm@0.25.9': - optional: true - - '@esbuild/linux-arm@0.27.0': + '@esbuild/linux-arm@0.25.4': optional: true - '@esbuild/linux-ia32@0.18.20': + '@esbuild/linux-arm@0.25.9': optional: true '@esbuild/linux-ia32@0.25.10': optional: true - '@esbuild/linux-ia32@0.25.9': - optional: true - - '@esbuild/linux-ia32@0.27.0': + '@esbuild/linux-ia32@0.25.4': optional: true - '@esbuild/linux-loong64@0.18.20': + '@esbuild/linux-ia32@0.25.9': optional: true '@esbuild/linux-loong64@0.25.10': optional: true - '@esbuild/linux-loong64@0.25.9': - optional: true - - '@esbuild/linux-loong64@0.27.0': + '@esbuild/linux-loong64@0.25.4': optional: true - '@esbuild/linux-mips64el@0.18.20': + '@esbuild/linux-loong64@0.25.9': optional: true '@esbuild/linux-mips64el@0.25.10': optional: true - '@esbuild/linux-mips64el@0.25.9': - optional: true - - '@esbuild/linux-mips64el@0.27.0': + '@esbuild/linux-mips64el@0.25.4': optional: true - '@esbuild/linux-ppc64@0.18.20': + '@esbuild/linux-mips64el@0.25.9': optional: true '@esbuild/linux-ppc64@0.25.10': optional: true - '@esbuild/linux-ppc64@0.25.9': - optional: true - - '@esbuild/linux-ppc64@0.27.0': + '@esbuild/linux-ppc64@0.25.4': optional: true - '@esbuild/linux-riscv64@0.18.20': + '@esbuild/linux-ppc64@0.25.9': optional: true '@esbuild/linux-riscv64@0.25.10': optional: true - '@esbuild/linux-riscv64@0.25.9': - optional: true - - '@esbuild/linux-riscv64@0.27.0': + '@esbuild/linux-riscv64@0.25.4': optional: true - '@esbuild/linux-s390x@0.18.20': + '@esbuild/linux-riscv64@0.25.9': optional: true '@esbuild/linux-s390x@0.25.10': optional: true - '@esbuild/linux-s390x@0.25.9': - optional: true - - '@esbuild/linux-s390x@0.27.0': + '@esbuild/linux-s390x@0.25.4': optional: true - '@esbuild/linux-x64@0.18.20': + '@esbuild/linux-s390x@0.25.9': optional: true '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/linux-x64@0.25.9': + '@esbuild/linux-x64@0.25.4': optional: true - '@esbuild/linux-x64@0.27.0': + '@esbuild/linux-x64@0.25.9': optional: true '@esbuild/netbsd-arm64@0.25.10': optional: true - '@esbuild/netbsd-arm64@0.25.9': - optional: true - - '@esbuild/netbsd-arm64@0.27.0': + '@esbuild/netbsd-arm64@0.25.4': optional: true - '@esbuild/netbsd-x64@0.18.20': + '@esbuild/netbsd-arm64@0.25.9': optional: true '@esbuild/netbsd-x64@0.25.10': optional: true - '@esbuild/netbsd-x64@0.25.9': + '@esbuild/netbsd-x64@0.25.4': optional: true - '@esbuild/netbsd-x64@0.27.0': + '@esbuild/netbsd-x64@0.25.9': optional: true '@esbuild/openbsd-arm64@0.25.10': optional: true - '@esbuild/openbsd-arm64@0.25.9': - optional: true - - '@esbuild/openbsd-arm64@0.27.0': + '@esbuild/openbsd-arm64@0.25.4': optional: true - '@esbuild/openbsd-x64@0.18.20': + '@esbuild/openbsd-arm64@0.25.9': optional: true '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/openbsd-x64@0.25.9': + '@esbuild/openbsd-x64@0.25.4': optional: true - '@esbuild/openbsd-x64@0.27.0': + '@esbuild/openbsd-x64@0.25.9': optional: true '@esbuild/openharmony-arm64@0.25.10': @@ -9234,117 +9905,69 @@ snapshots: '@esbuild/openharmony-arm64@0.25.9': optional: true - '@esbuild/openharmony-arm64@0.27.0': - optional: true - - '@esbuild/sunos-x64@0.18.20': - optional: true - '@esbuild/sunos-x64@0.25.10': optional: true - '@esbuild/sunos-x64@0.25.9': - optional: true - - '@esbuild/sunos-x64@0.27.0': + '@esbuild/sunos-x64@0.25.4': optional: true - '@esbuild/win32-arm64@0.18.20': + '@esbuild/sunos-x64@0.25.9': optional: true '@esbuild/win32-arm64@0.25.10': optional: true - '@esbuild/win32-arm64@0.25.9': - optional: true - - '@esbuild/win32-arm64@0.27.0': + '@esbuild/win32-arm64@0.25.4': optional: true - '@esbuild/win32-ia32@0.18.20': + '@esbuild/win32-arm64@0.25.9': optional: true '@esbuild/win32-ia32@0.25.10': optional: true - '@esbuild/win32-ia32@0.25.9': - optional: true - - '@esbuild/win32-ia32@0.27.0': + '@esbuild/win32-ia32@0.25.4': optional: true - '@esbuild/win32-x64@0.18.20': + '@esbuild/win32-ia32@0.25.9': optional: true '@esbuild/win32-x64@0.25.10': optional: true - '@esbuild/win32-x64@0.25.9': + '@esbuild/win32-x64@0.25.4': optional: true - '@esbuild/win32-x64@0.27.0': + '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.0))': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: - eslint: 9.39.1(jiti@2.6.0) + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.2': {} - - '@eslint/config-array@0.21.1': - dependencies: - '@eslint/object-schema': 2.1.7 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.4.2': - dependencies: - '@eslint/core': 0.17.0 - - '@eslint/core@0.17.0': - dependencies: - '@types/json-schema': 7.0.15 + '@eslint-community/regexpp@4.10.0': {} - '@eslint/eslintrc@3.3.3': + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 + debug: 4.4.1 + espree: 9.6.1 + globals: 13.24.0 ignore: 5.3.2 import-fresh: 3.3.0 - js-yaml: 3.14.2 + js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.39.1': {} - - '@eslint/object-schema@2.1.7': {} - - '@eslint/plugin-kit@0.4.1': - dependencies: - '@eslint/core': 0.17.0 - levn: 0.4.1 + '@eslint/js@8.57.0': {} '@fastify/accept-negotiator@2.0.1': {} '@fastify/busboy@3.2.0': {} - '@fastify/otel@0.16.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - minimatch: 10.1.1 - transitivePeerDependencies: - - supports-color - '@floating-ui/core@1.6.9': dependencies: '@floating-ui/utils': 0.2.9 @@ -9354,46 +9977,44 @@ snapshots: '@floating-ui/core': 1.6.9 '@floating-ui/utils': 0.2.9 - '@floating-ui/react-dom@2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/dom': 1.6.13 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.27.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@floating-ui/react@0.27.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@floating-ui/utils': 0.2.9 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) tabbable: 6.2.0 '@floating-ui/utils@0.2.9': {} - '@hono/mcp@0.2.3(@modelcontextprotocol/sdk@1.25.2(hono@4.11.3)(zod@4.3.5))(hono-rate-limiter@0.4.2(hono@4.11.3))(hono@4.11.3)(zod@4.3.5)': - dependencies: - '@modelcontextprotocol/sdk': 1.25.2(hono@4.11.3)(zod@4.3.5) - hono: 4.11.3 - hono-rate-limiter: 0.4.2(hono@4.11.3) - pkce-challenge: 5.0.1 - zod: 4.3.5 - - '@hono/node-server@1.19.8(hono@4.11.3)': + '@headlessui/react@1.7.18(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - hono: 4.11.3 + '@tanstack/react-virtual': 3.1.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + client-only: 0.0.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@humanfs/core@0.19.1': {} + '@hexagon/base64@1.1.28': {} - '@humanfs/node@0.16.7': + '@humanwhocodes/config-array@0.11.14': dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.4.3 + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/momoa@2.0.4': {} - '@humanwhocodes/retry@0.4.3': {} + '@humanwhocodes/object-schema@2.0.2': {} '@iarna/toml@2.2.5': {} @@ -9502,12 +10123,6 @@ snapshots: '@import-maps/resolve@2.0.0': {} - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -9517,168 +10132,49 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.2 - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - optional: true - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.30': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/base64@17.65.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/buffers@17.65.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/codegen@17.65.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)': + '@isaacs/fs-minipass@4.0.1': dependencies: - tslib: 2.8.1 + minipass: 7.1.2 - '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - tslib: 2.8.1 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 - '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)': + '@jridgewell/remapping@2.3.5': dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - tslib: 2.8.1 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tslib: 2.8.1 + '@jridgewell/resolve-uri@3.1.2': {} - '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)': + '@jridgewell/source-map@0.3.11': dependencies: - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + optional: true - '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/json-pack': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) - tslib: 2.8.1 + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': + '@jridgewell/trace-mapping@0.3.30': dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - '@jsonjoy.com/json-pack@17.65.0(tslib@2.8.1)': + '@jridgewell/trace-mapping@0.3.31': dependencies: - '@jsonjoy.com/base64': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - tslib: 2.8.1 + '@juggle/resize-observer@3.4.0': {} - '@jsonjoy.com/json-pointer@17.65.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) - tslib: 2.8.1 + '@levischuck/tiny-cbor@0.2.11': {} - '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - tslib: 2.8.1 + '@lit-labs/ssr-dom-shim@1.2.1': {} - '@jsonjoy.com/util@17.65.0(tslib@2.8.1)': + '@lit/reactive-element@2.0.4': dependencies: - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) - tslib: 2.8.1 - - '@juggle/resize-observer@3.4.0': {} + '@lit-labs/ssr-dom-shim': 1.2.1 '@mapbox/node-pre-gyp@2.0.0': dependencies: @@ -9687,67 +10183,16 @@ snapshots: https-proxy-agent: 7.0.6 node-fetch: 2.7.0 nopt: 8.1.0 - semver: 7.7.3 + semver: 7.7.2 tar: 7.4.3 transitivePeerDependencies: - encoding - supports-color - '@mediapipe/tasks-vision@0.10.17': {} - '@mermaid-js/parser@0.6.2': dependencies: langium: 3.3.1 - '@modelcontextprotocol/sdk@1.25.2(hono@4.11.3)(zod@4.3.5)': - dependencies: - '@hono/node-server': 1.19.8(hono@4.11.3) - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.2.1 - express-rate-limit: 7.5.1(express@5.2.1) - jose: 6.1.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.3.5 - zod-to-json-schema: 3.25.1(zod@4.3.5) - transitivePeerDependencies: - - hono - - supports-color - - '@monogrid/gainmap-js@3.4.0(three@0.182.0)': - dependencies: - promise-worker-transferable: 1.0.4 - three: 0.182.0 - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - optional: true - - '@neondatabase/serverless@0.10.4': - dependencies: - '@types/pg': 8.11.6 - '@netlify/api@14.0.6': dependencies: '@netlify/open-api': 2.39.0 @@ -9811,15 +10256,15 @@ snapshots: uuid: 11.1.0 write-file-atomic: 5.0.1 - '@netlify/dev@4.5.12(rollup@4.53.3)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11))': + '@netlify/dev@4.5.12(rollup@4.52.2)': dependencies: '@netlify/blobs': 10.0.11 '@netlify/config': 23.2.0 '@netlify/dev-utils': 4.2.0 '@netlify/edge-functions': 2.18.2 - '@netlify/functions': 4.2.7(rollup@4.53.3) + '@netlify/functions': 4.2.7(rollup@4.52.2) '@netlify/headers': 2.0.12 - '@netlify/images': 1.2.8(@netlify/blobs@10.0.11)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11)) + '@netlify/images': 1.2.8(@netlify/blobs@10.0.11) '@netlify/redirects': 3.0.13 '@netlify/runtime': 4.0.16 '@netlify/static': 3.0.11 @@ -9839,7 +10284,6 @@ snapshots: - '@vercel/functions' - '@vercel/kv' - aws4fetch - - bare-buffer - db0 - encoding - idb-keyval @@ -9866,7 +10310,7 @@ snapshots: p-wait-for: 5.0.2 parse-imports: 2.2.1 path-key: 4.0.0 - semver: 7.7.3 + semver: 7.7.2 tar: 7.4.3 tmp-promise: 3.0.3 urlpattern-polyfill: 8.0.2 @@ -9883,12 +10327,12 @@ snapshots: '@netlify/types': 2.0.3 get-port: 7.1.0 - '@netlify/functions@4.2.7(rollup@4.53.3)': + '@netlify/functions@4.2.7(rollup@4.52.2)': dependencies: '@netlify/blobs': 10.0.11 '@netlify/dev-utils': 4.2.0 '@netlify/types': 2.0.3 - '@netlify/zip-it-and-ship-it': 14.1.8(rollup@4.53.3) + '@netlify/zip-it-and-ship-it': 14.1.8(rollup@4.52.2) cron-parser: 4.9.0 decache: 4.6.2 extract-zip: 2.0.1 @@ -9898,16 +10342,11 @@ snapshots: read-package-up: 11.0.0 source-map-support: 0.5.21 transitivePeerDependencies: - - bare-buffer - encoding - react-native-b4a - rollup - supports-color - '@netlify/functions@5.1.0': - dependencies: - '@netlify/types': 2.2.0 - '@netlify/headers-parser@9.0.2': dependencies: '@iarna/toml': 2.2.5 @@ -9921,9 +10360,9 @@ snapshots: dependencies: '@netlify/headers-parser': 9.0.2 - '@netlify/images@1.2.8(@netlify/blobs@10.0.11)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11))': + '@netlify/images@1.2.8(@netlify/blobs@10.0.11)': dependencies: - ipx: 3.1.1(@netlify/blobs@10.0.11)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11)) + ipx: 3.1.1(@netlify/blobs@10.0.11) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -9945,10 +10384,6 @@ snapshots: - ioredis - uploadthing - '@netlify/neon@0.1.0': - dependencies: - '@neondatabase/serverless': 0.10.4 - '@netlify/open-api@2.39.0': {} '@netlify/redirect-parser@15.0.3': @@ -9979,18 +10414,16 @@ snapshots: '@netlify/static@3.0.11': dependencies: - mime-types: 3.0.2 + mime-types: 3.0.1 '@netlify/types@2.0.3': {} - '@netlify/types@2.2.0': {} - - '@netlify/vite-plugin-tanstack-start@1.0.2(@tanstack/react-start@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)))(babel-plugin-macros@3.1.0)(rollup@4.53.3)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@netlify/vite-plugin-tanstack-start@1.0.2(@tanstack/react-start@1.132.51(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)))(babel-plugin-macros@3.1.0)(rollup@4.52.2)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: - '@netlify/vite-plugin': 2.6.1(babel-plugin-macros@3.1.0)(rollup@4.53.3)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + '@netlify/vite-plugin': 2.6.1(babel-plugin-macros@3.1.0)(rollup@4.52.2)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) optionalDependencies: - '@tanstack/react-start': 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@tanstack/react-start': 1.132.51(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10007,7 +10440,6 @@ snapshots: - '@vercel/kv' - aws4fetch - babel-plugin-macros - - bare-buffer - db0 - encoding - idb-keyval @@ -10017,12 +10449,12 @@ snapshots: - supports-color - uploadthing - '@netlify/vite-plugin@2.6.1(babel-plugin-macros@3.1.0)(rollup@4.53.3)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@netlify/vite-plugin@2.6.1(babel-plugin-macros@3.1.0)(rollup@4.52.2)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: - '@netlify/dev': 4.5.12(rollup@4.53.3)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11)) + '@netlify/dev': 4.5.12(rollup@4.52.2) '@netlify/dev-utils': 4.2.0 dedent: 1.7.0(babel-plugin-macros@3.1.0) - vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10039,7 +10471,6 @@ snapshots: - '@vercel/kv' - aws4fetch - babel-plugin-macros - - bare-buffer - db0 - encoding - idb-keyval @@ -10049,13 +10480,13 @@ snapshots: - supports-color - uploadthing - '@netlify/zip-it-and-ship-it@14.1.8(rollup@4.53.3)': + '@netlify/zip-it-and-ship-it@14.1.8(rollup@4.52.2)': dependencies: '@babel/parser': 7.28.4 '@babel/types': 7.28.4 '@netlify/binary-info': 1.0.0 '@netlify/serverless-functions-api': 2.6.0 - '@vercel/nft': 0.29.4(rollup@4.53.3) + '@vercel/nft': 0.29.4(rollup@4.52.2) archiver: 7.0.1 common-path-prefix: 3.0.0 copy-file: 11.1.0 @@ -10069,14 +10500,14 @@ snapshots: junk: 4.0.1 locate-path: 7.2.0 merge-options: 3.0.4 - minimatch: 9.0.5 + minimatch: 9.0.3 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.3 + semver: 7.7.2 tmp-promise: 3.0.3 toml: 3.0.0 unixify: 1.0.0 @@ -10084,12 +10515,147 @@ snapshots: yargs: 17.7.2 zod: 3.25.76 transitivePeerDependencies: - - bare-buffer - encoding - react-native-b4a - rollup - supports-color + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + + '@noble/ciphers@0.6.0': {} + + '@noble/hashes@1.8.0': {} + + '@node-rs/argon2-android-arm-eabi@1.7.0': + optional: true + + '@node-rs/argon2-android-arm64@1.7.0': + optional: true + + '@node-rs/argon2-darwin-arm64@1.7.0': + optional: true + + '@node-rs/argon2-darwin-x64@1.7.0': + optional: true + + '@node-rs/argon2-freebsd-x64@1.7.0': + optional: true + + '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': + optional: true + + '@node-rs/argon2-linux-arm64-gnu@1.7.0': + optional: true + + '@node-rs/argon2-linux-arm64-musl@1.7.0': + optional: true + + '@node-rs/argon2-linux-x64-gnu@1.7.0': + optional: true + + '@node-rs/argon2-linux-x64-musl@1.7.0': + optional: true + + '@node-rs/argon2-wasm32-wasi@1.7.0': + dependencies: + '@emnapi/core': 0.45.0 + '@emnapi/runtime': 0.45.0 + '@tybys/wasm-util': 0.8.3 + memfs-browser: 3.5.10302 + optional: true + + '@node-rs/argon2-win32-arm64-msvc@1.7.0': + optional: true + + '@node-rs/argon2-win32-ia32-msvc@1.7.0': + optional: true + + '@node-rs/argon2-win32-x64-msvc@1.7.0': + optional: true + + '@node-rs/argon2@1.7.0': + optionalDependencies: + '@node-rs/argon2-android-arm-eabi': 1.7.0 + '@node-rs/argon2-android-arm64': 1.7.0 + '@node-rs/argon2-darwin-arm64': 1.7.0 + '@node-rs/argon2-darwin-x64': 1.7.0 + '@node-rs/argon2-freebsd-x64': 1.7.0 + '@node-rs/argon2-linux-arm-gnueabihf': 1.7.0 + '@node-rs/argon2-linux-arm64-gnu': 1.7.0 + '@node-rs/argon2-linux-arm64-musl': 1.7.0 + '@node-rs/argon2-linux-x64-gnu': 1.7.0 + '@node-rs/argon2-linux-x64-musl': 1.7.0 + '@node-rs/argon2-wasm32-wasi': 1.7.0 + '@node-rs/argon2-win32-arm64-msvc': 1.7.0 + '@node-rs/argon2-win32-ia32-msvc': 1.7.0 + '@node-rs/argon2-win32-x64-msvc': 1.7.0 + + '@node-rs/bcrypt-android-arm-eabi@1.9.0': + optional: true + + '@node-rs/bcrypt-android-arm64@1.9.0': + optional: true + + '@node-rs/bcrypt-darwin-arm64@1.9.0': + optional: true + + '@node-rs/bcrypt-darwin-x64@1.9.0': + optional: true + + '@node-rs/bcrypt-freebsd-x64@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-arm64-musl@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-x64-gnu@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-x64-musl@1.9.0': + optional: true + + '@node-rs/bcrypt-wasm32-wasi@1.9.0': + dependencies: + '@emnapi/core': 0.45.0 + '@emnapi/runtime': 0.45.0 + '@tybys/wasm-util': 0.8.3 + memfs-browser: 3.5.10302 + optional: true + + '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': + optional: true + + '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': + optional: true + + '@node-rs/bcrypt-win32-x64-msvc@1.9.0': + optional: true + + '@node-rs/bcrypt@1.9.0': + optionalDependencies: + '@node-rs/bcrypt-android-arm-eabi': 1.9.0 + '@node-rs/bcrypt-android-arm64': 1.9.0 + '@node-rs/bcrypt-darwin-arm64': 1.9.0 + '@node-rs/bcrypt-darwin-x64': 1.9.0 + '@node-rs/bcrypt-freebsd-x64': 1.9.0 + '@node-rs/bcrypt-linux-arm-gnueabihf': 1.9.0 + '@node-rs/bcrypt-linux-arm64-gnu': 1.9.0 + '@node-rs/bcrypt-linux-arm64-musl': 1.9.0 + '@node-rs/bcrypt-linux-x64-gnu': 1.9.0 + '@node-rs/bcrypt-linux-x64-musl': 1.9.0 + '@node-rs/bcrypt-wasm32-wasi': 1.9.0 + '@node-rs/bcrypt-win32-arm64-msvc': 1.9.0 + '@node-rs/bcrypt-win32-ia32-msvc': 1.9.0 + '@node-rs/bcrypt-win32-x64-msvc': 1.9.0 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10102,12 +10668,12 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@number-flow/react@0.4.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@number-flow/react@0.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: esm-env: 1.1.4 number-flow: 0.4.0 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) '@observablehq/plot@0.6.17': dependencies: @@ -10115,324 +10681,294 @@ snapshots: interval-tree-1d: 1.0.4 isoformat: 0.2.1 - '@octokit/endpoint@9.0.2': + '@octokit/app@15.1.6': dependencies: - '@octokit/types': 12.1.1 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 + '@octokit/auth-app': 7.2.2 + '@octokit/auth-unauthenticated': 6.1.3 + '@octokit/core': 6.1.6 + '@octokit/oauth-app': 7.1.6 + '@octokit/plugin-paginate-rest': 12.0.0(@octokit/core@6.1.6) + '@octokit/types': 14.1.0 + '@octokit/webhooks': 13.9.1 - '@octokit/graphql@7.0.2': + '@octokit/auth-app@7.2.2': dependencies: - '@octokit/request': 8.1.4 - '@octokit/types': 12.1.1 - universal-user-agent: 6.0.0 + '@octokit/auth-oauth-app': 8.1.4 + '@octokit/auth-oauth-user': 5.1.6 + '@octokit/request': 9.2.4 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.1.0 + toad-cache: 3.7.0 + universal-github-app-jwt: 2.2.2 + universal-user-agent: 7.0.3 - '@octokit/openapi-types@19.0.2': {} + '@octokit/auth-oauth-app@8.1.4': + dependencies: + '@octokit/auth-oauth-device': 7.1.5 + '@octokit/auth-oauth-user': 5.1.6 + '@octokit/request': 9.2.4 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 - '@octokit/request-error@5.0.1': + '@octokit/auth-oauth-device@7.1.5': dependencies: - '@octokit/types': 12.1.1 - deprecation: 2.3.1 - once: 1.4.0 + '@octokit/oauth-methods': 5.1.5 + '@octokit/request': 9.2.4 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 - '@octokit/request@8.1.4': + '@octokit/auth-oauth-user@5.1.6': dependencies: - '@octokit/endpoint': 9.0.2 + '@octokit/auth-oauth-device': 7.1.5 + '@octokit/oauth-methods': 5.1.5 + '@octokit/request': 9.2.4 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 + + '@octokit/auth-token@4.0.0': {} + + '@octokit/auth-token@5.1.2': {} + + '@octokit/auth-unauthenticated@6.1.3': + dependencies: + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.1.0 + + '@octokit/core@5.0.1': + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.0.2 + '@octokit/request': 8.1.4 '@octokit/request-error': 5.0.1 '@octokit/types': 12.1.1 - is-plain-object: 5.0.0 + before-after-hook: 2.2.3 universal-user-agent: 6.0.0 - '@octokit/types@12.1.1': + '@octokit/core@6.1.6': dependencies: - '@octokit/openapi-types': 19.0.2 + '@octokit/auth-token': 5.1.2 + '@octokit/graphql': 8.2.2 + '@octokit/request': 9.2.4 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.1.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.3 - '@oozcitak/dom@2.0.2': + '@octokit/endpoint@10.1.4': dependencies: - '@oozcitak/infra': 2.0.2 - '@oozcitak/url': 3.0.0 - '@oozcitak/util': 10.0.0 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 - '@oozcitak/infra@2.0.2': + '@octokit/endpoint@9.0.2': dependencies: - '@oozcitak/util': 10.0.0 + '@octokit/types': 12.1.1 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 - '@oozcitak/url@3.0.0': + '@octokit/graphql-schema@15.26.0': dependencies: - '@oozcitak/infra': 2.0.2 - '@oozcitak/util': 10.0.0 - - '@oozcitak/util@10.0.0': {} + graphql: 16.11.0 + graphql-tag: 2.12.6(graphql@16.11.0) - '@opentelemetry/api-logs@0.207.0': + '@octokit/graphql@7.0.2': dependencies: - '@opentelemetry/api': 1.9.0 + '@octokit/request': 8.1.4 + '@octokit/types': 12.1.1 + universal-user-agent: 6.0.0 - '@opentelemetry/api-logs@0.208.0': + '@octokit/graphql@8.2.2': dependencies: - '@opentelemetry/api': 1.9.0 + '@octokit/request': 9.2.4 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 - '@opentelemetry/api-logs@0.211.0': + '@octokit/oauth-app@7.1.6': dependencies: - '@opentelemetry/api': 1.9.0 + '@octokit/auth-oauth-app': 8.1.4 + '@octokit/auth-oauth-user': 5.1.6 + '@octokit/auth-unauthenticated': 6.1.3 + '@octokit/core': 6.1.6 + '@octokit/oauth-authorization-url': 7.1.1 + '@octokit/oauth-methods': 5.1.5 + '@types/aws-lambda': 8.10.152 + universal-user-agent: 7.0.3 - '@opentelemetry/api@1.9.0': {} + '@octokit/oauth-authorization-url@7.1.1': {} - '@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0)': + '@octokit/oauth-methods@5.1.5': dependencies: - '@opentelemetry/api': 1.9.0 + '@octokit/oauth-authorization-url': 7.1.1 + '@octokit/request': 9.2.4 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.1.0 - '@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.40.0 + '@octokit/openapi-types@19.0.2': {} - '@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.40.0 + '@octokit/openapi-types@25.1.0': {} - '@opentelemetry/instrumentation-amqplib@0.58.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-webhooks-types@11.0.0': {} - '@opentelemetry/instrumentation-connect@0.54.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-paginate-graphql@5.2.4(@octokit/core@6.1.6)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/connect': 3.4.38 - transitivePeerDependencies: - - supports-color + '@octokit/core': 6.1.6 - '@opentelemetry/instrumentation-dataloader@0.28.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-paginate-rest@12.0.0(@octokit/core@6.1.6)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/core': 6.1.6 + '@octokit/types': 14.1.0 - '@opentelemetry/instrumentation-express@0.59.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-paginate-rest@9.1.2(@octokit/core@5.0.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/core': 5.0.1 + '@octokit/types': 12.1.1 - '@opentelemetry/instrumentation-fs@0.30.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-request-log@4.0.0(@octokit/core@5.0.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/core': 5.0.1 - '@opentelemetry/instrumentation-generic-pool@0.54.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-rest-endpoint-methods@10.1.2(@octokit/core@5.0.1)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/core': 5.0.1 + '@octokit/types': 12.1.1 - '@opentelemetry/instrumentation-graphql@0.58.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-rest-endpoint-methods@14.0.0(@octokit/core@6.1.6)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/core': 6.1.6 + '@octokit/types': 14.1.0 - '@opentelemetry/instrumentation-hapi@0.57.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-retry@7.2.1(@octokit/core@6.1.6)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/core': 6.1.6 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.1.0 + bottleneck: 2.19.5 - '@opentelemetry/instrumentation-http@0.211.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-throttling@10.0.0(@octokit/core@6.1.6)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - forwarded-parse: 2.1.2 - transitivePeerDependencies: - - supports-color + '@octokit/core': 6.1.6 + '@octokit/types': 14.1.0 + bottleneck: 2.19.5 - '@opentelemetry/instrumentation-ioredis@0.59.0(@opentelemetry/api@1.9.0)': + '@octokit/request-error@5.0.1': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/types': 12.1.1 + deprecation: 2.3.1 + once: 1.4.0 - '@opentelemetry/instrumentation-kafkajs@0.20.0(@opentelemetry/api@1.9.0)': + '@octokit/request-error@6.1.8': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/types': 14.1.0 - '@opentelemetry/instrumentation-knex@0.55.0(@opentelemetry/api@1.9.0)': + '@octokit/request@8.1.4': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/endpoint': 9.0.2 + '@octokit/request-error': 5.0.1 + '@octokit/types': 12.1.1 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 - '@opentelemetry/instrumentation-koa@0.59.0(@opentelemetry/api@1.9.0)': + '@octokit/request@9.2.4': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/endpoint': 10.1.4 + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.1.0 + fast-content-type-parse: 2.0.1 + universal-user-agent: 7.0.3 - '@opentelemetry/instrumentation-lru-memoizer@0.55.0(@opentelemetry/api@1.9.0)': + '@octokit/rest@20.0.2': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/core': 5.0.1 + '@octokit/plugin-paginate-rest': 9.1.2(@octokit/core@5.0.1) + '@octokit/plugin-request-log': 4.0.0(@octokit/core@5.0.1) + '@octokit/plugin-rest-endpoint-methods': 10.1.2(@octokit/core@5.0.1) - '@opentelemetry/instrumentation-mongodb@0.64.0(@opentelemetry/api@1.9.0)': + '@octokit/types@12.1.1': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-types': 19.0.2 - '@opentelemetry/instrumentation-mongoose@0.57.0(@opentelemetry/api@1.9.0)': + '@octokit/types@14.1.0': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-types': 25.1.0 - '@opentelemetry/instrumentation-mysql2@0.57.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/webhooks-methods@5.1.1': {} - '@opentelemetry/instrumentation-mysql@0.57.0(@opentelemetry/api@1.9.0)': + '@octokit/webhooks@13.9.1': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/mysql': 2.15.27 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-webhooks-types': 11.0.0 + '@octokit/request-error': 6.1.8 + '@octokit/webhooks-methods': 5.1.1 - '@opentelemetry/instrumentation-pg@0.63.0(@opentelemetry/api@1.9.0)': + '@oozcitak/dom@1.15.10': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) - '@types/pg': 8.15.6 - '@types/pg-pool': 2.0.7 - transitivePeerDependencies: - - supports-color + '@oozcitak/infra': 1.0.8 + '@oozcitak/url': 1.0.4 + '@oozcitak/util': 8.3.8 - '@opentelemetry/instrumentation-redis@0.59.0(@opentelemetry/api@1.9.0)': + '@oozcitak/infra@1.0.8': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@oozcitak/util': 8.3.8 - '@opentelemetry/instrumentation-tedious@0.30.0(@opentelemetry/api@1.9.0)': + '@oozcitak/url@1.0.4': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@types/tedious': 4.0.14 - transitivePeerDependencies: - - supports-color + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 - '@opentelemetry/instrumentation-undici@0.21.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - transitivePeerDependencies: - - supports-color + '@oozcitak/util@8.3.8': {} - '@opentelemetry/instrumentation@0.207.0(@opentelemetry/api@1.9.0)': + '@orama/cuid2@2.2.3': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.207.0 - import-in-the-middle: 2.0.6 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color + '@noble/hashes': 1.8.0 - '@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.208.0 - import-in-the-middle: 2.0.6 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color + '@orama/highlight@0.1.8': {} + + '@orama/orama@3.0.3': {} - '@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0)': + '@orama/react-components@0.1.23(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.211.0 - import-in-the-middle: 2.0.6 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color + '@orama/wc-components': 0.1.23 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@opentelemetry/redis-common@0.38.2': {} + '@orama/switch@3.0.3(@orama/orama@3.0.3)(@oramacloud/client@2.1.4)': + dependencies: + '@orama/orama': 3.0.3 + '@oramacloud/client': 2.1.4 - '@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0)': + '@orama/wc-components@0.1.23': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 + '@orama/highlight': 0.1.8 + '@orama/orama': 3.0.3 + '@orama/switch': 3.0.3(@orama/orama@3.0.3)(@oramacloud/client@2.1.4) + '@oramacloud/client': 2.1.4 + '@phosphor-icons/webcomponents': 2.1.5 + '@stencil/core': 4.20.0 + '@stencil/store': 2.0.16(@stencil/core@4.20.0) + dompurify: 3.2.6 + highlight.js: 11.10.0 + markdown-it: 14.1.0 + marked: 13.0.2 + marked-highlight: 2.1.4(marked@13.0.2) + shiki: 1.10.3 + sse.js: 2.5.0 - '@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0)': + '@oramacloud/client@2.1.4': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 + '@orama/cuid2': 2.2.3 + '@orama/orama': 3.0.3 + lodash: 4.17.21 - '@opentelemetry/semantic-conventions@1.38.0': {} + '@oslojs/asn1@1.0.0': + dependencies: + '@oslojs/binary': 1.0.0 - '@opentelemetry/semantic-conventions@1.40.0': {} + '@oslojs/binary@1.0.0': {} - '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': + '@oslojs/crypto@1.0.1': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) + '@oslojs/asn1': 1.0.0 + '@oslojs/binary': 1.0.0 + + '@oslojs/encoding@1.1.0': {} '@panva/hkdf@1.2.1': {} @@ -10501,639 +11037,652 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.1 '@parcel/watcher-win32-x64': 2.5.1 - '@pkgjs/parseargs@0.11.0': - optional: true + '@peculiar/asn1-android@2.4.0': + dependencies: + '@peculiar/asn1-schema': 2.4.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.4.0': + dependencies: + '@peculiar/asn1-schema': 2.4.0 + '@peculiar/asn1-x509': 2.4.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.4.0': + dependencies: + '@peculiar/asn1-schema': 2.4.0 + '@peculiar/asn1-x509': 2.4.0 + asn1js: 3.0.6 + tslib: 2.8.1 - '@playwright/test@1.57.0': + '@peculiar/asn1-schema@2.4.0': dependencies: - playwright: 1.57.0 + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 - '@posthog/core@1.9.1': + '@peculiar/asn1-x509@2.4.0': dependencies: - cross-spawn: 7.0.6 + '@peculiar/asn1-schema': 2.4.0 + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 - '@prisma/instrumentation@7.2.0(@opentelemetry/api@1.9.0)': + '@phosphor-icons/webcomponents@2.1.5': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.207.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + lit: 3.2.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.2': {} '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-arrow@1.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) - - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-arrow@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-collection@1.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-collection@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.2.0(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.12)(react@19.0.0)': dependencies: - react: 19.2.3 + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-context@1.1.2(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-context@1.1.2(@types/react@18.3.12)(react@19.0.0)': dependencies: - react: 19.2.3 + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-dialog@1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.3) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.12)(react@19.0.0) aria-hidden: 1.2.4 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - react-remove-scroll: 2.6.3(@types/react@19.2.10)(react@19.2.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@18.3.12)(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-direction@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-direction@1.1.1(@types/react@18.3.12)(react@19.0.0)': dependencies: - react: 19.2.3 + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-dismissable-layer@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-dismissable-layer@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-dropdown-menu@2.1.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-dropdown-menu@2.1.12(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-menu': 2.1.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) - - '@radix-ui/react-focus-guards@1.1.2(@types/react@19.2.10)(react@19.2.3)': - dependencies: - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.10 - - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.10)(react@19.2.3)': - dependencies: - react: 19.2.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-menu': 2.1.12(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-focus-scope@1.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-focus-guards@1.1.2(@types/react@18.3.12)(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-focus-scope@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-id@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-id@1.1.1(@types/react@18.3.12)(react@19.0.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-menu@2.1.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-menu@2.1.12(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-popper': 1.2.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-portal': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.2.0(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) + '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0) aria-hidden: 1.2.4 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - react-remove-scroll: 2.6.3(@types/react@19.2.10)(react@19.2.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@18.3.12)(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) - - '@radix-ui/react-popper@1.2.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-arrow': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.3) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-popper@1.2.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.12)(react@19.0.0) '@radix-ui/rect': 1.1.1 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) - - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/rect': 1.1.1 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-portal@1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-portal@1.1.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-presence@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-presence@1.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-primitive@2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-primitive@2.1.0(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.2.0(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-roving-focus@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-roving-focus@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-select@2.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: + '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-collection': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-popper': 1.2.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + aria-hidden: 1.2.4 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@18.3.12)(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-slot@1.2.0(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-slot@1.2.0(@types/react@18.3.12)(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-slot@1.2.3(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-slot@1.2.3(@types/react@18.3.12)(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-toast@1.2.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.12)(react@19.0.0)': dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.12)(react@19.0.0)': dependencies: - react: 19.2.3 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.12)(react@19.0.0)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.12)(react@19.0.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.12)(react@19.0.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-use-previous@1.1.1(@types/react@18.3.12)(react@19.0.0)': dependencies: - react: 19.2.3 + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-use-rect@1.1.1(@types/react@18.3.12)(react@19.0.0)': dependencies: '@radix-ui/rect': 1.1.1 - react: 19.2.3 + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@radix-ui/react-use-size@1.1.1(@types/react@18.3.12)(react@19.0.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0) + react: 19.0.0 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-visually-hidden@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-primitive': 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 '@radix-ui/rect@1.1.1': {} - '@react-three/drei@10.7.7(@react-three/fiber@9.5.0(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(three@0.182.0))(@types/react@19.2.10)(@types/three@0.182.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(three@0.182.0)': - dependencies: - '@babel/runtime': 7.28.4 - '@mediapipe/tasks-vision': 0.10.17 - '@monogrid/gainmap-js': 3.4.0(three@0.182.0) - '@react-three/fiber': 9.5.0(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(three@0.182.0) - '@use-gesture/react': 10.3.1(react@19.2.3) - camera-controls: 3.1.2(three@0.182.0) - cross-env: 7.0.3 - detect-gpu: 5.0.70 - glsl-noise: 0.0.0 - hls.js: 1.6.15 - maath: 0.10.8(@types/three@0.182.0)(three@0.182.0) - meshline: 3.3.1(three@0.182.0) - react: 19.2.3 - stats-gl: 2.4.2(@types/three@0.182.0)(three@0.182.0) - stats.js: 0.17.0 - suspend-react: 0.1.3(react@19.2.3) - three: 0.182.0 - three-mesh-bvh: 0.8.3(three@0.182.0) - three-stdlib: 2.36.1(three@0.182.0) - troika-three-text: 0.52.4(three@0.182.0) - tunnel-rat: 0.1.2(@types/react@19.2.10)(react@19.2.3) - use-sync-external-store: 1.6.0(react@19.2.3) - utility-types: 3.11.0 - zustand: 5.0.9(@types/react@19.2.10)(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3)) + '@remix-run/node@2.8.1(typescript@5.9.2)': + dependencies: + '@remix-run/server-runtime': 2.8.1(typescript@5.9.2) + '@remix-run/web-fetch': 4.4.2 + '@remix-run/web-file': 3.1.0 + '@remix-run/web-stream': 1.1.0 + '@web3-storage/multipart-parser': 1.0.0 + cookie-signature: 1.2.1 + source-map-support: 0.5.21 + stream-slice: 0.1.2 optionalDependencies: - react-dom: 19.2.3(react@19.2.3) - transitivePeerDependencies: - - '@types/react' - - '@types/three' - - immer + typescript: 5.9.2 - '@react-three/fiber@9.5.0(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(three@0.182.0)': + '@remix-run/router@1.15.3': {} + + '@remix-run/server-runtime@2.8.1(typescript@5.9.2)': dependencies: - '@babel/runtime': 7.24.5 - '@types/webxr': 0.5.24 - base64-js: 1.5.1 - buffer: 6.0.3 - its-fine: 2.0.0(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - react-use-measure: 2.1.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - scheduler: 0.27.0 - suspend-react: 0.1.3(react@19.2.3) - three: 0.182.0 - use-sync-external-store: 1.6.0(react@19.2.3) - zustand: 5.0.9(@types/react@19.2.10)(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3)) + '@remix-run/router': 1.15.3 + '@types/cookie': 0.6.0 + '@web3-storage/multipart-parser': 1.0.0 + cookie: 0.6.0 + set-cookie-parser: 2.7.1 + source-map: 0.7.6 optionalDependencies: - react-dom: 19.2.3(react@19.2.3) - transitivePeerDependencies: - - '@types/react' - - immer + typescript: 5.9.2 + + '@remix-run/web-blob@3.1.0': + dependencies: + '@remix-run/web-stream': 1.1.0 + web-encoding: 1.1.5 + + '@remix-run/web-fetch@4.4.2': + dependencies: + '@remix-run/web-blob': 3.1.0 + '@remix-run/web-file': 3.1.0 + '@remix-run/web-form-data': 3.1.0 + '@remix-run/web-stream': 1.1.0 + '@web3-storage/multipart-parser': 1.0.0 + abort-controller: 3.0.0 + data-uri-to-buffer: 3.0.1 + mrmime: 1.0.1 + + '@remix-run/web-file@3.1.0': + dependencies: + '@remix-run/web-blob': 3.1.0 + + '@remix-run/web-form-data@3.1.0': + dependencies: + web-encoding: 1.1.5 + + '@remix-run/web-stream@1.1.0': + dependencies: + web-streams-polyfill: 3.3.3 '@rolldown/pluginutils@1.0.0-beta.40': {} - '@rollup/pluginutils@5.3.0(rollup@4.53.3)': + '@rollup/pluginutils@5.3.0(rollup@4.52.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.3 + rollup: 4.52.2 - '@rollup/rollup-android-arm-eabi@4.53.3': + '@rollup/rollup-android-arm-eabi@4.52.2': optional: true - '@rollup/rollup-android-arm64@4.53.3': + '@rollup/rollup-android-arm64@4.52.2': optional: true - '@rollup/rollup-darwin-arm64@4.53.3': + '@rollup/rollup-darwin-arm64@4.52.2': optional: true - '@rollup/rollup-darwin-x64@4.53.3': + '@rollup/rollup-darwin-x64@4.52.2': optional: true - '@rollup/rollup-freebsd-arm64@4.53.3': + '@rollup/rollup-freebsd-arm64@4.52.2': optional: true - '@rollup/rollup-freebsd-x64@4.53.3': + '@rollup/rollup-freebsd-x64@4.52.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.3': + '@rollup/rollup-linux-arm-musleabihf@4.52.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.3': + '@rollup/rollup-linux-arm64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.3': + '@rollup/rollup-linux-arm64-musl@4.52.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.3': + '@rollup/rollup-linux-loong64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.3': + '@rollup/rollup-linux-ppc64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.3': + '@rollup/rollup-linux-riscv64-musl@4.52.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.3': + '@rollup/rollup-linux-s390x-gnu@4.52.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.3': + '@rollup/rollup-linux-x64-gnu@4.52.2': optional: true - '@rollup/rollup-linux-x64-musl@4.53.3': + '@rollup/rollup-linux-x64-musl@4.52.2': optional: true - '@rollup/rollup-openharmony-arm64@4.53.3': + '@rollup/rollup-openharmony-arm64@4.52.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.3': + '@rollup/rollup-win32-arm64-msvc@4.52.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.3': + '@rollup/rollup-win32-ia32-msvc@4.52.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.3': + '@rollup/rollup-win32-x64-gnu@4.52.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.3': + '@rollup/rollup-win32-x64-msvc@4.52.2': optional: true - '@sec-ant/readable-stream@0.4.1': {} + '@rushstack/eslint-patch@1.7.2': {} - '@sentry-internal/browser-utils@10.43.0': + '@sentry-internal/browser-utils@8.35.0': dependencies: - '@sentry/core': 10.43.0 + '@sentry/core': 8.35.0 + '@sentry/types': 8.35.0 + '@sentry/utils': 8.35.0 - '@sentry-internal/feedback@10.43.0': + '@sentry-internal/feedback@8.35.0': dependencies: - '@sentry/core': 10.43.0 + '@sentry/core': 8.35.0 + '@sentry/types': 8.35.0 + '@sentry/utils': 8.35.0 - '@sentry-internal/replay-canvas@10.43.0': + '@sentry-internal/replay-canvas@8.35.0': dependencies: - '@sentry-internal/replay': 10.43.0 - '@sentry/core': 10.43.0 + '@sentry-internal/replay': 8.35.0 + '@sentry/core': 8.35.0 + '@sentry/types': 8.35.0 + '@sentry/utils': 8.35.0 - '@sentry-internal/replay@10.43.0': + '@sentry-internal/replay@8.35.0': dependencies: - '@sentry-internal/browser-utils': 10.43.0 - '@sentry/core': 10.43.0 + '@sentry-internal/browser-utils': 8.35.0 + '@sentry/core': 8.35.0 + '@sentry/types': 8.35.0 + '@sentry/utils': 8.35.0 - '@sentry/babel-plugin-component-annotate@5.1.1': {} + '@sentry/babel-plugin-component-annotate@2.22.6': {} - '@sentry/browser@10.43.0': + '@sentry/browser@8.35.0': dependencies: - '@sentry-internal/browser-utils': 10.43.0 - '@sentry-internal/feedback': 10.43.0 - '@sentry-internal/replay': 10.43.0 - '@sentry-internal/replay-canvas': 10.43.0 - '@sentry/core': 10.43.0 + '@sentry-internal/browser-utils': 8.35.0 + '@sentry-internal/feedback': 8.35.0 + '@sentry-internal/replay': 8.35.0 + '@sentry-internal/replay-canvas': 8.35.0 + '@sentry/core': 8.35.0 + '@sentry/types': 8.35.0 + '@sentry/utils': 8.35.0 - '@sentry/bundler-plugin-core@5.1.1': + '@sentry/bundler-plugin-core@2.22.6': dependencies: - '@babel/core': 7.29.0 - '@sentry/babel-plugin-component-annotate': 5.1.1 - '@sentry/cli': 2.58.5 + '@babel/core': 7.28.3 + '@sentry/babel-plugin-component-annotate': 2.22.6 + '@sentry/cli': 2.38.1 dotenv: 16.6.1 find-up: 5.0.0 - glob: 13.0.0 - magic-string: 0.30.19 + glob: 9.3.5 + magic-string: 0.30.8 + unplugin: 1.0.1 transitivePeerDependencies: - encoding - supports-color - '@sentry/cli-darwin@2.58.5': - optional: true - - '@sentry/cli-linux-arm64@2.58.5': + '@sentry/cli-darwin@2.38.1': optional: true - '@sentry/cli-linux-arm@2.58.5': + '@sentry/cli-linux-arm64@2.38.1': optional: true - '@sentry/cli-linux-i686@2.58.5': + '@sentry/cli-linux-arm@2.38.1': optional: true - '@sentry/cli-linux-x64@2.58.5': + '@sentry/cli-linux-i686@2.38.1': optional: true - '@sentry/cli-win32-arm64@2.58.5': + '@sentry/cli-linux-x64@2.38.1': optional: true - '@sentry/cli-win32-i686@2.58.5': + '@sentry/cli-win32-i686@2.38.1': optional: true - '@sentry/cli-win32-x64@2.58.5': + '@sentry/cli-win32-x64@2.38.1': optional: true - '@sentry/cli@2.58.5': + '@sentry/cli@2.38.1': dependencies: https-proxy-agent: 5.0.1 node-fetch: 2.7.0 @@ -11141,185 +11690,43 @@ snapshots: proxy-from-env: 1.1.0 which: 2.0.2 optionalDependencies: - '@sentry/cli-darwin': 2.58.5 - '@sentry/cli-linux-arm': 2.58.5 - '@sentry/cli-linux-arm64': 2.58.5 - '@sentry/cli-linux-i686': 2.58.5 - '@sentry/cli-linux-x64': 2.58.5 - '@sentry/cli-win32-arm64': 2.58.5 - '@sentry/cli-win32-i686': 2.58.5 - '@sentry/cli-win32-x64': 2.58.5 + '@sentry/cli-darwin': 2.38.1 + '@sentry/cli-linux-arm': 2.38.1 + '@sentry/cli-linux-arm64': 2.38.1 + '@sentry/cli-linux-i686': 2.38.1 + '@sentry/cli-linux-x64': 2.38.1 + '@sentry/cli-win32-i686': 2.38.1 + '@sentry/cli-win32-x64': 2.38.1 transitivePeerDependencies: - encoding - supports-color - '@sentry/core@10.42.0': {} - - '@sentry/core@10.43.0': {} - - '@sentry/node-core@10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': - dependencies: - '@sentry/core': 10.42.0 - '@sentry/opentelemetry': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - import-in-the-middle: 2.0.6 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - - '@sentry/node-core@10.43.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': - dependencies: - '@sentry/core': 10.43.0 - '@sentry/opentelemetry': 10.43.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - import-in-the-middle: 2.0.6 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - - '@sentry/node@10.42.0': - dependencies: - '@fastify/otel': 0.16.0(@opentelemetry/api@1.9.0) - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.54.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.30.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.54.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.20.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.64.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.63.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.30.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.21.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@prisma/instrumentation': 7.2.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.42.0 - '@sentry/node-core': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/opentelemetry': 10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - import-in-the-middle: 2.0.6 - transitivePeerDependencies: - - supports-color - - '@sentry/node@10.43.0': - dependencies: - '@fastify/otel': 0.16.0(@opentelemetry/api@1.9.0) - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.54.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.30.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.54.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.58.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.20.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.64.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.63.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.59.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.30.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.21.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@prisma/instrumentation': 7.2.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.43.0 - '@sentry/node-core': 10.43.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/opentelemetry': 10.43.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - import-in-the-middle: 2.0.6 - transitivePeerDependencies: - - supports-color - - '@sentry/opentelemetry@10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@sentry/core': 10.42.0 - - '@sentry/opentelemetry@10.43.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/core@8.35.0': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.40.0 - '@sentry/core': 10.43.0 + '@sentry/types': 8.35.0 + '@sentry/utils': 8.35.0 - '@sentry/react@10.43.0(react@19.2.3)': + '@sentry/react@8.35.0(react@19.0.0)': dependencies: - '@sentry/browser': 10.43.0 - '@sentry/core': 10.43.0 - react: 19.2.3 + '@sentry/browser': 8.35.0 + '@sentry/core': 8.35.0 + '@sentry/types': 8.35.0 + '@sentry/utils': 8.35.0 + hoist-non-react-statics: 3.3.2 + react: 19.0.0 - '@sentry/rollup-plugin@5.1.1(rollup@4.53.3)': - dependencies: - '@sentry/bundler-plugin-core': 5.1.1 - magic-string: 0.30.19 - rollup: 4.53.3 - transitivePeerDependencies: - - encoding - - supports-color + '@sentry/types@8.35.0': {} - '@sentry/tanstackstart-react@10.43.0(react@19.2.3)(rollup@4.53.3)': + '@sentry/utils@8.35.0': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 - '@sentry-internal/browser-utils': 10.43.0 - '@sentry/core': 10.43.0 - '@sentry/node': 10.43.0 - '@sentry/react': 10.43.0(react@19.2.3) - '@sentry/vite-plugin': 5.1.1(rollup@4.53.3) - transitivePeerDependencies: - - encoding - - react - - rollup - - supports-color + '@sentry/types': 8.35.0 - '@sentry/vite-plugin@5.1.1(rollup@4.53.3)': + '@sentry/vite-plugin@2.22.6': dependencies: - '@sentry/bundler-plugin-core': 5.1.1 - '@sentry/rollup-plugin': 5.1.1(rollup@4.53.3) + '@sentry/bundler-plugin-core': 2.22.6 + unplugin: 1.0.1 transitivePeerDependencies: - encoding - - rollup - supports-color '@shikijs/core@1.10.3': @@ -11330,7 +11737,17 @@ snapshots: dependencies: shiki: 1.10.3 - '@sindresorhus/merge-streams@4.0.0': {} + '@simplewebauthn/browser@13.1.2': {} + + '@simplewebauthn/server@13.1.2': + dependencies: + '@hexagon/base64': 1.1.28 + '@levischuck/tiny-cbor': 0.2.11 + '@peculiar/asn1-android': 2.4.0 + '@peculiar/asn1-ecc': 2.4.0 + '@peculiar/asn1-rsa': 2.4.0 + '@peculiar/asn1-schema': 2.4.0 + '@peculiar/asn1-x509': 2.4.0 '@so-ric/colorspace@1.1.6': dependencies: @@ -11339,11 +11756,14 @@ snapshots: '@stablelib/base64@1.0.1': {} - '@stackblitz/sdk@1.11.0': {} + '@standard-schema/spec@1.0.0': + optional: true - '@standard-schema/spec@1.0.0-beta.4': {} + '@stencil/core@4.20.0': {} - '@standard-schema/spec@1.1.0': {} + '@stencil/store@2.0.16(@stencil/core@4.20.0)': + dependencies: + '@stencil/core': 4.20.0 '@tailwindcss/node@4.1.11': dependencies: @@ -11417,128 +11837,128 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.1.11 - '@tailwindcss/vite@4.1.11(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.11(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.11 '@tailwindcss/oxide': 4.1.11 tailwindcss: 4.1.11 - vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - - '@tanstack/create@0.49.1(tslib@2.8.1)': - dependencies: - ejs: 3.1.10 - execa: 9.6.1 - ignore: 7.0.5 - memfs: 4.56.10(tslib@2.8.1) - parse-gitignore: 2.0.0 - prettier: 3.7.4 - rimraf: 6.1.2 - zod: 3.25.76 - transitivePeerDependencies: - - tslib - - '@tanstack/devtools-event-client@0.3.5': {} - - '@tanstack/history@1.154.14': {} + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) - '@tanstack/hotkeys@0.0.2': - dependencies: - '@tanstack/store': 0.8.0 + '@tanstack/devtools-event-client@0.2.5': {} - '@tanstack/pacer@0.16.4': + '@tanstack/directive-functions-plugin@1.132.51(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: - '@tanstack/devtools-event-client': 0.3.5 - '@tanstack/store': 0.8.0 + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@tanstack/router-utils': 1.132.51 + babel-dead-code-elimination: 1.0.10 + pathe: 2.0.3 + tiny-invariant: 1.3.3 + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color - '@tanstack/query-core@5.90.12': {} + '@tanstack/history@1.132.31': {} - '@tanstack/react-hotkeys@0.0.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/pacer@0.15.3': dependencies: - '@tanstack/hotkeys': 0.0.2 - '@tanstack/react-store': 0.8.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@tanstack/devtools-event-client': 0.2.5 + '@tanstack/store': 0.7.7 - '@tanstack/react-pacer@0.17.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@tanstack/pacer': 0.16.4 - '@tanstack/react-store': 0.8.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@tanstack/query-core@5.90.2': {} - '@tanstack/react-query@5.90.12(react@19.2.3)': + '@tanstack/react-pacer@0.16.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tanstack/query-core': 5.90.12 - react: 19.2.3 + '@tanstack/pacer': 0.15.3 + '@tanstack/react-store': 0.7.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@tanstack/react-router-devtools@1.157.16(@tanstack/react-router@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.157.16)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-query@5.90.2(react@19.0.0)': dependencies: - '@tanstack/react-router': 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-devtools-core': 1.157.16(@tanstack/router-core@1.157.16)(csstype@3.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@tanstack/router-core': 1.157.16 - transitivePeerDependencies: - - csstype + '@tanstack/query-core': 5.90.2 + react: 19.0.0 - '@tanstack/react-router-ssr-query@1.157.16(@tanstack/query-core@5.90.12)(@tanstack/react-query@5.90.12(react@19.2.3))(@tanstack/react-router@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.157.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-router-devtools@1.132.51(@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.132.47)(@types/node@24.3.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1)': dependencies: - '@tanstack/query-core': 5.90.12 - '@tanstack/react-query': 5.90.12(react@19.2.3) - '@tanstack/react-router': 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-ssr-query-core': 1.157.16(@tanstack/query-core@5.90.12)(@tanstack/router-core@1.157.16) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@tanstack/react-router': 1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-devtools-core': 1.132.51(@tanstack/router-core@1.132.47)(@types/node@24.3.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - '@tanstack/router-core' - - '@tanstack/react-router@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@tanstack/history': 1.154.14 - '@tanstack/react-store': 0.8.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-core': 1.157.16 + - '@types/node' + - csstype + - jiti + - less + - lightningcss + - sass + - sass-embedded + - solid-js + - stylus + - sugarss + - terser + - tiny-invariant + - tsx + - yaml + + '@tanstack/react-router-with-query@1.130.17(@tanstack/react-query@5.90.2(react@19.0.0))(@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@tanstack/router-core@1.132.47)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@tanstack/react-query': 5.90.2(react@19.0.0) + '@tanstack/react-router': 1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-core': 1.132.47 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@tanstack/history': 1.132.31 + '@tanstack/react-store': 0.7.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-core': 1.132.47 isbot: 5.1.31 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-client@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-start-client@1.132.48(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tanstack/react-router': 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-core': 1.157.16 - '@tanstack/start-client-core': 1.157.16 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@tanstack/react-router': 1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-core': 1.132.47 + '@tanstack/start-client-core': 1.132.48 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-server@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-start-server@1.132.48(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tanstack/history': 1.154.14 - '@tanstack/react-router': 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-core': 1.157.16 - '@tanstack/start-client-core': 1.157.16 - '@tanstack/start-server-core': 1.157.16 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@tanstack/history': 1.132.31 + '@tanstack/react-router': 1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-core': 1.132.47 + '@tanstack/start-client-core': 1.132.48 + '@tanstack/start-server-core': 1.132.48 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tanstack/react-start@1.132.51(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: - '@tanstack/react-router': 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-client': 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-server': 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-utils': 1.154.7 - '@tanstack/start-client-core': 1.157.16 - '@tanstack/start-plugin-core': 1.157.16(@tanstack/react-router@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.157.16 + '@tanstack/react-router': 1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-start-client': 1.132.48(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-start-server': 1.132.48(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-utils': 1.132.51 + '@tanstack/start-client-core': 1.132.48 + '@tanstack/start-plugin-core': 1.132.51(@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.132.48 pathe: 2.0.3 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -11546,83 +11966,99 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-store@0.8.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-store@0.7.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tanstack/store': 0.8.0 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - use-sync-external-store: 1.6.0(react@19.2.3) + '@tanstack/store': 0.7.7 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + use-sync-external-store: 1.5.0(react@19.0.0) - '@tanstack/react-table@8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-table@8.21.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@tanstack/table-core': 8.21.3 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@tanstack/router-core@1.157.16': + '@tanstack/react-virtual@3.1.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@tanstack/history': 1.154.14 - '@tanstack/store': 0.8.0 + '@tanstack/virtual-core': 3.1.3 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@tanstack/router-core@1.132.47': + dependencies: + '@tanstack/history': 1.132.31 + '@tanstack/store': 0.7.7 cookie-es: 2.0.0 - seroval: 1.5.0 - seroval-plugins: 1.5.0(seroval@1.5.0) + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.157.16(@tanstack/router-core@1.157.16)(csstype@3.2.3)': + '@tanstack/router-devtools-core@1.132.51(@tanstack/router-core@1.132.47)(@types/node@24.3.0)(csstype@3.1.3)(jiti@2.6.0)(lightningcss@1.30.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.5)(yaml@2.8.1)': dependencies: - '@tanstack/router-core': 1.157.16 + '@tanstack/router-core': 1.132.47 clsx: 2.1.1 - goober: 2.1.16(csstype@3.2.3) + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.9 tiny-invariant: 1.3.3 + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) optionalDependencies: - csstype: 3.2.3 - - '@tanstack/router-generator@1.157.16': - dependencies: - '@tanstack/router-core': 1.157.16 - '@tanstack/router-utils': 1.154.7 - '@tanstack/virtual-file-routes': 1.154.7 - prettier: 3.7.4 + csstype: 3.1.3 + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + '@tanstack/router-generator@1.132.51': + dependencies: + '@tanstack/router-core': 1.132.47 + '@tanstack/router-utils': 1.132.51 + '@tanstack/virtual-file-routes': 1.132.31 + prettier: 3.6.2 recast: 0.23.11 source-map: 0.7.6 - tsx: 4.21.0 + tsx: 4.20.5 zod: 3.25.76 transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.157.16(@tanstack/react-router@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@tanstack/router-core': 1.157.16 - '@tanstack/router-generator': 1.157.16 - '@tanstack/router-utils': 1.154.7 - '@tanstack/virtual-file-routes': 1.154.7 - babel-dead-code-elimination: 1.0.12 + '@tanstack/router-plugin@1.132.51(@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@tanstack/router-core': 1.132.47 + '@tanstack/router-generator': 1.132.51 + '@tanstack/router-utils': 1.132.51 + '@tanstack/virtual-file-routes': 1.132.31 + babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 unplugin: 2.3.10 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + '@tanstack/react-router': 1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/router-ssr-query-core@1.157.16(@tanstack/query-core@5.90.12)(@tanstack/router-core@1.157.16)': - dependencies: - '@tanstack/query-core': 5.90.12 - '@tanstack/router-core': 1.157.16 - - '@tanstack/router-utils@1.154.7': + '@tanstack/router-utils@1.132.51': dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) ansis: 4.1.0 diff: 8.0.2 pathe: 2.0.3 @@ -11630,39 +12066,53 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/start-client-core@1.157.16': + '@tanstack/server-functions-plugin@1.132.51(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.4 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@tanstack/directive-functions-plugin': 1.132.51(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) + babel-dead-code-elimination: 1.0.10 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color + - vite + + '@tanstack/start-client-core@1.132.48': dependencies: - '@tanstack/router-core': 1.157.16 - '@tanstack/start-fn-stubs': 1.154.7 - '@tanstack/start-storage-context': 1.157.16 - seroval: 1.5.0 + '@tanstack/router-core': 1.132.47 + '@tanstack/start-storage-context': 1.132.48 + seroval: 1.3.2 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-fn-stubs@1.154.7': {} - - '@tanstack/start-plugin-core@1.157.16(@tanstack/react-router@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@tanstack/start-plugin-core@1.132.51(@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.29.0 - '@babel/types': 7.28.5 + '@babel/code-frame': 7.26.2 + '@babel/core': 7.28.4 + '@babel/types': 7.28.4 '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.157.16 - '@tanstack/router-generator': 1.157.16 - '@tanstack/router-plugin': 1.157.16(@tanstack/react-router@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - '@tanstack/router-utils': 1.154.7 - '@tanstack/start-client-core': 1.157.16 - '@tanstack/start-server-core': 1.157.16 - babel-dead-code-elimination: 1.0.12 + '@tanstack/router-core': 1.132.47 + '@tanstack/router-generator': 1.132.51 + '@tanstack/router-plugin': 1.132.51(@tanstack/react-router@1.132.47(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) + '@tanstack/router-utils': 1.132.51 + '@tanstack/server-functions-plugin': 1.132.51(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) + '@tanstack/start-client-core': 1.132.48 + '@tanstack/start-server-core': 1.132.48 + babel-dead-code-elimination: 1.0.10 cheerio: 1.1.2 exsolve: 1.0.7 pathe: 2.0.3 - srvx: 0.10.1 + srvx: 0.8.7 tinyglobby: 0.2.15 ufo: 1.6.1 - vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) - xmlbuilder2: 4.0.3 + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) + xmlbuilder2: 3.1.1 zod: 3.25.76 transitivePeerDependencies: - '@rsbuild/core' @@ -11672,59 +12122,57 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.157.16': + '@tanstack/start-server-core@1.132.48': dependencies: - '@tanstack/history': 1.154.14 - '@tanstack/router-core': 1.157.16 - '@tanstack/start-client-core': 1.157.16 - '@tanstack/start-storage-context': 1.157.16 - h3-v2: h3@2.0.1-rc.11 - seroval: 1.5.0 + '@tanstack/history': 1.132.31 + '@tanstack/router-core': 1.132.47 + '@tanstack/start-client-core': 1.132.48 + '@tanstack/start-storage-context': 1.132.48 + h3-v2: h3@2.0.0-beta.4 + seroval: 1.3.2 tiny-invariant: 1.3.3 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.157.16': + '@tanstack/start-storage-context@1.132.48': dependencies: - '@tanstack/router-core': 1.157.16 + '@tanstack/router-core': 1.132.47 - '@tanstack/store@0.8.0': {} + '@tanstack/store@0.7.7': {} '@tanstack/table-core@8.21.3': {} - '@tanstack/virtual-file-routes@1.154.7': {} + '@tanstack/virtual-core@3.1.3': {} + + '@tanstack/virtual-file-routes@1.132.31': {} + + '@tybys/wasm-util@0.8.3': + dependencies: + tslib: 2.8.1 + optional: true - '@tweenjs/tween.js@23.1.3': {} + '@types/aws-lambda@8.10.152': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.5 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.2 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.5 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.28.5 - - '@types/body-parser@1.19.6': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 24.3.0 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 24.3.0 + '@babel/types': 7.28.2 '@types/cookie@0.6.0': {} @@ -11845,58 +12293,33 @@ snapshots: '@types/d3-transition': 3.0.9 '@types/d3-zoom': 3.0.8 - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - '@types/dom-speech-recognition@0.0.1': {} - '@types/draco3d@1.4.10': {} - '@types/estree@1.0.8': {} - '@types/express-serve-static-core@5.1.1': - dependencies: - '@types/node': 24.3.0 - '@types/qs': 6.9.18 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 - - '@types/express@5.0.6': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.1.1 - '@types/serve-static': 2.2.0 - '@types/geojson@7946.0.16': {} '@types/google.maps@3.58.1': {} + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.10 + '@types/hast@3.0.4': dependencies: - '@types/unist': 3.0.3 + '@types/unist': 2.0.10 '@types/hogan.js@3.0.5': {} - '@types/http-errors@2.0.5': {} - '@types/json-schema@7.0.15': {} - '@types/lodash@4.14.200': {} - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/ms@2.1.0': {} + '@types/json5@0.0.29': {} - '@types/mysql@2.15.27': - dependencies: - '@types/node': 24.3.0 + '@types/lodash@4.14.200': {} - '@types/node@22.19.3': + '@types/mdast@3.0.15': dependencies: - undici-types: 6.21.0 + '@types/unist': 2.0.10 '@types/node@24.3.0': dependencies: @@ -11904,216 +12327,218 @@ snapshots: '@types/normalize-package-data@2.4.4': {} - '@types/offscreencanvas@2019.7.3': {} - - '@types/parse-json@4.0.2': - optional: true - - '@types/pg-pool@2.0.7': - dependencies: - '@types/pg': 8.15.6 + '@types/parse-json@4.0.2': {} - '@types/pg@8.11.6': - dependencies: - '@types/node': 24.3.0 - pg-protocol: 1.10.3 - pg-types: 4.1.0 - - '@types/pg@8.15.6': - dependencies: - '@types/node': 24.3.0 - pg-protocol: 1.10.3 - pg-types: 2.2.0 + '@types/prop-types@15.7.13': {} '@types/qs@6.9.18': {} - '@types/range-parser@1.2.7': {} - - '@types/react-dom@19.2.3(@types/react@19.2.10)': - dependencies: - '@types/react': 19.2.10 - - '@types/react-reconciler@0.28.9(@types/react@19.2.10)': + '@types/react-dom@18.3.1': dependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - '@types/react@19.2.10': + '@types/react@18.3.12': dependencies: - csstype: 3.2.3 + '@types/prop-types': 15.7.13 + csstype: 3.1.3 '@types/remove-markdown@0.3.4': {} '@types/retry@0.12.2': {} - '@types/send@1.2.1': - dependencies: - '@types/node': 24.3.0 - - '@types/serve-static@2.2.0': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 24.3.0 - - '@types/stats.js@0.17.4': {} - - '@types/tar-stream@3.1.4': - dependencies: - '@types/node': 24.3.0 - - '@types/tedious@4.0.14': - dependencies: - '@types/node': 24.3.0 - - '@types/three@0.182.0': - dependencies: - '@dimforge/rapier3d-compat': 0.12.0 - '@tweenjs/tween.js': 23.1.3 - '@types/stats.js': 0.17.4 - '@types/webxr': 0.5.24 - '@webgpu/types': 0.1.68 - fflate: 0.8.2 - meshoptimizer: 0.22.0 + '@types/semver@7.5.8': {} '@types/triple-beam@1.3.5': {} - '@types/trusted-types@2.0.7': - optional: true - - '@types/unist@3.0.3': {} + '@types/trusted-types@2.0.7': {} - '@types/webxr@0.5.24': {} + '@types/unist@2.0.10': {} '@types/yauzl@2.10.3': dependencies: '@types/node': 24.3.0 optional: true - '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2))(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2)': dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.48.1 - eslint: 9.39.1(jiti@2.6.0) + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.9.2) + debug: 4.4.1 + eslint: 8.57.0 graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.48.1 - debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.0) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.9.2) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + debug: 4.4.1 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.4.1 + eslint: 8.57.0 + optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.48.1(typescript@5.9.2)': + '@typescript-eslint/project-service@8.46.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.2) - '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.2) + '@typescript-eslint/types': 8.46.0 debug: 4.4.3 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.48.1': + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/scope-manager@7.2.0': dependencies: - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 - '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2) - debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.0) - ts-api-utils: 2.1.0(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.9.2) + debug: 4.4.1 + eslint: 8.57.0 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/types@7.2.0': {} + + '@typescript-eslint/types@8.46.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.2.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.7.2 + ts-api-utils: 1.3.0(typescript@5.9.2) + optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.48.1': {} - - '@typescript-eslint/typescript-estree@8.48.1(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.48.1(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.2) - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/project-service': 8.46.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.2) + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/visitor-keys': 8.46.0 debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.3 - tinyglobby: 0.2.15 + semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.0)) - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.2) - eslint: 9.39.1(jiti@2.6.0) - typescript: 5.9.2 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color + - typescript - '@typescript-eslint/visitor-keys@8.48.1': + '@typescript-eslint/visitor-keys@5.62.0': dependencies: - '@typescript-eslint/types': 8.48.1 - eslint-visitor-keys: 4.2.1 - - '@ungap/structured-clone@1.2.0': {} - - '@uploadthing/mime-types@0.3.6': {} + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 - '@uploadthing/react@7.3.3(react@19.2.3)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11))': + '@typescript-eslint/visitor-keys@7.2.0': dependencies: - '@uploadthing/shared': 7.1.10 - file-selector: 0.6.0 - react: 19.2.3 - uploadthing: 7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11) + '@typescript-eslint/types': 7.2.0 + eslint-visitor-keys: 3.4.3 - '@uploadthing/shared@7.1.10': + '@typescript-eslint/visitor-keys@8.46.0': dependencies: - '@uploadthing/mime-types': 0.3.6 - effect: 3.17.7 - sqids: 0.3.0 - - '@use-gesture/core@10.3.1': {} + '@typescript-eslint/types': 8.46.0 + eslint-visitor-keys: 4.2.1 - '@use-gesture/react@10.3.1(react@19.2.3)': - dependencies: - '@use-gesture/core': 10.3.1 - react: 19.2.3 + '@ungap/structured-clone@1.2.0': {} - '@vercel/nft@0.29.4(rollup@4.53.3)': + '@vercel/nft@0.29.4(rollup@4.52.2)': dependencies: '@mapbox/node-pre-gyp': 2.0.0 - '@rollup/pluginutils': 5.3.0(rollup@4.53.3) + '@rollup/pluginutils': 5.3.0(rollup@4.52.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: 13.0.0 + glob: 10.4.5 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 picomatch: 4.0.3 @@ -12123,40 +12548,40 @@ snapshots: - rollup - supports-color - '@visx/group@2.17.0(react@19.2.3)': + '@visx/group@2.17.0(react@19.0.0)': dependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 classnames: 2.3.2 prop-types: 15.8.1 - react: 19.2.3 + react: 19.0.0 - '@visx/hierarchy@2.17.0(react@19.2.3)': + '@visx/hierarchy@2.17.0(react@19.0.0)': dependencies: '@types/d3-hierarchy': 1.1.10 - '@types/react': 19.2.10 - '@visx/group': 2.17.0(react@19.2.3) + '@types/react': 18.3.12 + '@visx/group': 2.17.0(react@19.0.0) classnames: 2.3.2 d3-hierarchy: 1.1.9 prop-types: 15.8.1 - react: 19.2.3 + react: 19.0.0 - '@visx/responsive@2.17.0(react@19.2.3)': + '@visx/responsive@2.17.0(react@19.0.0)': dependencies: '@juggle/resize-observer': 3.4.0 '@types/lodash': 4.14.200 - '@types/react': 19.2.10 + '@types/react': 18.3.12 lodash: 4.17.21 prop-types: 15.8.1 - react: 19.2.3 + react: 19.0.0 - '@vitejs/plugin-react@4.3.4(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitejs/plugin-react@4.3.4(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.28.4) + '@babel/core': 7.28.3 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.28.3) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -12192,9 +12617,7 @@ snapshots: '@vue/shared@3.5.22': {} - '@webcontainer/api@1.6.1': {} - - '@webgpu/types@0.1.68': {} + '@web3-storage/multipart-parser@1.0.0': {} '@whatwg-node/disposablestack@0.0.6': dependencies: @@ -12225,15 +12648,13 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 - '@xstate/react@6.0.0(@types/react@19.2.10)(react@19.2.3)(xstate@5.25.0)': + '@zxing/text-encoding@0.9.0': + optional: true + + JSONStream@1.3.5: dependencies: - react: 19.2.3 - use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.10)(react@19.2.3) - use-sync-external-store: 1.6.0(react@19.2.3) - optionalDependencies: - xstate: 5.25.0 - transitivePeerDependencies: - - '@types/react' + jsonparse: 1.3.1 + through: 2.3.8 abbrev@1.1.1: {} @@ -12243,11 +12664,6 @@ snapshots: dependencies: event-target-shim: 5.0.1 - accepts@2.0.0: - dependencies: - mime-types: 3.0.1 - negotiator: 1.0.0 - acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -12258,12 +12674,9 @@ snapshots: acorn@8.15.0: {} - acorn@8.16.0: - optional: true - agent-base@6.0.2: dependencies: - debug: 4.4.3 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -12273,10 +12686,6 @@ snapshots: dependencies: ajv: 8.17.1 - ajv-formats@3.0.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -12335,7 +12744,7 @@ snapshots: archiver-utils@5.0.2: dependencies: - glob: 13.0.0 + glob: 10.4.5 graceful-fs: 4.2.11 is-stream: 2.0.1 lazystream: 1.0.1 @@ -12350,71 +12759,90 @@ snapshots: buffer-crc32: 1.0.0 readable-stream: 4.7.0 readdir-glob: 1.1.3 - tar-stream: 3.1.8 + tar-stream: 3.1.7 zip-stream: 6.0.1 transitivePeerDependencies: - - bare-buffer - react-native-b4a argparse@1.0.10: dependencies: sprintf-js: 1.0.3 + argparse@2.0.1: {} + aria-hidden@1.2.4: dependencies: tslib: 2.8.1 - aria-query@5.3.2: {} + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - array-buffer-byte-length@1.0.2: + array-includes@3.1.7: dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + get-intrinsic: 1.3.0 + is-string: 1.0.7 - array-includes@3.1.9: + array-union@2.1.0: {} + + array.prototype.filter@1.0.3: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 + es-abstract: 1.22.5 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 - array.prototype.findlast@1.2.5: + array.prototype.findlast@1.2.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.22.5 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + array.prototype.findlastindex@1.2.4: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 es-errors: 1.3.0 - es-object-atoms: 1.1.1 es-shim-unscopables: 1.0.2 array.prototype.flat@1.3.2: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.3: + array.prototype.toreversed@1.1.2: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.22.5 es-shim-unscopables: 1.0.2 - array.prototype.tosorted@1.1.4: + array.prototype.tosorted@1.1.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.22.5 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 @@ -12429,15 +12857,11 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - arraybuffer.prototype.slice@1.0.4: + asn1js@3.0.6: dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 + pvtsutils: 1.3.6 + pvutils: 1.1.3 + tslib: 2.8.1 ast-module-types@6.0.1: {} @@ -12451,6 +12875,12 @@ snapshots: async@3.2.6: {} + asynciterator.prototype@1.0.0: + dependencies: + has-symbols: 1.1.0 + + asynckit@0.4.0: {} + autoprefixer@10.4.18(postcss@8.5.6): dependencies: browserslist: 4.24.4 @@ -12465,67 +12895,103 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - axe-core@4.11.0: {} + axe-core@4.7.0: {} - axobject-query@4.1.0: {} + axios@0.21.4: + dependencies: + follow-redirects: 1.15.9 + transitivePeerDependencies: + - debug + + axios@1.7.8: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@3.2.1: + dependencies: + dequal: 2.0.3 b4a@1.7.3: {} - babel-dead-code-elimination@1.0.12: + babel-dead-code-elimination@1.0.10: dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.24.5 cosmiconfig: 7.1.0 - resolve: 1.22.11 - optional: true - - bail@2.0.2: {} - - balanced-match@1.0.2: {} - - balanced-match@3.0.1: {} - - bare-events@2.7.0: {} + resolve: 1.22.10 - bare-fs@4.5.5: + babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.28.3): dependencies: - bare-events: 2.7.0 - bare-path: 3.0.0 - bare-stream: 2.8.1(bare-events@2.7.0) - bare-url: 2.3.2 - fast-fifo: 1.3.2 + '@babel/compat-data': 7.27.5 + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.28.3) + semver: 6.3.1 transitivePeerDependencies: - - react-native-b4a - - bare-os@3.7.1: {} + - supports-color - bare-path@3.0.0: + babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.28.3): dependencies: - bare-os: 3.7.1 + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.28.3) + core-js-compat: 3.36.0 + transitivePeerDependencies: + - supports-color - bare-stream@2.8.1(bare-events@2.7.0): + babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.28.3): dependencies: - streamx: 2.23.0 - teex: 1.0.1 - optionalDependencies: - bare-events: 2.7.0 + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.28.3) transitivePeerDependencies: - - react-native-b4a + - supports-color - bare-url@2.3.2: - dependencies: - bare-path: 3.0.0 + babel-plugin-transform-react-remove-prop-types@0.4.24: {} + + babel-preset-react-app@10.0.1: + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.28.3) + '@babel/plugin-proposal-decorators': 7.24.0(@babel/core@7.28.3) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.28.3) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.28.3) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.28.3) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.28.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.28.3) + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.28.3) + '@babel/plugin-transform-runtime': 7.24.0(@babel/core@7.28.3) + '@babel/preset-env': 7.24.0(@babel/core@7.28.3) + '@babel/preset-react': 7.23.3(@babel/core@7.28.3) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) + '@babel/runtime': 7.24.5 + babel-plugin-macros: 3.1.0 + babel-plugin-transform-react-remove-prop-types: 0.4.24 + transitivePeerDependencies: + - supports-color + + bail@1.0.5: {} + + balanced-match@1.0.2: {} + + bare-events@2.7.0: {} base64-js@1.5.1: {} + before-after-hook@2.2.3: {} + + before-after-hook@3.0.2: {} + better-ajv-errors@1.2.0(ajv@8.17.1): dependencies: '@babel/code-frame': 7.27.1 @@ -12535,9 +13001,30 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - bidi-js@1.0.3: + better-auth@1.3.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - require-from-string: 2.0.2 + '@better-auth/utils': 0.2.6 + '@better-fetch/fetch': 1.1.18 + '@noble/ciphers': 0.6.0 + '@noble/hashes': 1.8.0 + '@simplewebauthn/browser': 13.1.2 + '@simplewebauthn/server': 13.1.2 + better-call: 1.0.16 + defu: 6.1.4 + jose: 5.10.0 + kysely: 0.28.5 + nanostores: 0.11.4 + zod: 4.1.9 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + better-call@1.0.16: + dependencies: + '@better-fetch/fetch': 1.1.18 + rou3: 0.5.1 + set-cookie-parser: 2.7.1 + uncrypto: 0.1.3 binary-extensions@2.2.0: {} @@ -12547,23 +13034,11 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 - body-parser@2.2.2: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.3 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - on-finished: 2.4.1 - qs: 6.14.1 - raw-body: 3.0.2 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - boolbase@1.0.0: {} - brace-expansion@1.1.12: + bottleneck@2.19.5: {} + + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -12572,10 +13047,6 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@4.0.1: - dependencies: - balanced-match: 3.0.1 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -12587,8 +13058,6 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) - btoa@1.2.1: {} - buffer-crc32@0.2.13: {} buffer-crc32@1.0.0: {} @@ -12602,7 +13071,7 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bytes@3.1.2: {} + builtin-modules@3.3.0: {} call-bind-apply-helpers@1.0.2: dependencies: @@ -12617,13 +13086,6 @@ snapshots: get-intrinsic: 1.3.0 set-function-length: 1.2.2 - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 @@ -12635,14 +13097,8 @@ snapshots: camelcase@8.0.0: {} - camera-controls@3.1.2(three@0.182.0): - dependencies: - three: 0.182.0 - caniuse-lite@1.0.30001692: {} - ccount@2.0.1: {} - chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -12656,11 +13112,11 @@ snapshots: chalk@5.6.2: {} - character-entities-html4@2.1.0: {} + character-entities-legacy@1.1.4: {} - character-entities-legacy@3.0.0: {} + character-entities@1.2.4: {} - character-entities@2.0.2: {} + character-reference-invalid@1.1.4: {} cheerio-select@2.1.0: dependencies: @@ -12717,42 +13173,48 @@ snapshots: chownr@3.0.0: {} + ci-info@3.9.0: {} + citty@0.1.6: dependencies: consola: 3.4.2 - cjs-module-lexer@2.2.0: {} - classnames@2.3.2: {} + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + client-only@0.0.1: {} + clipboardy@4.0.0: dependencies: execa: 8.0.1 is-wsl: 3.1.0 is64bit: 2.0.0 - cliui@7.0.4: + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - cliui@8.0.1: + clone-deep@4.0.1: dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + cmdk@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-dialog': 1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -12784,7 +13246,11 @@ snapshots: color-convert: 3.1.2 color-string: 2.1.2 - comma-separated-tokens@2.0.3: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@1.0.8: {} commander@10.0.1: {} @@ -12800,6 +13266,8 @@ snapshots: common-path-prefix@3.0.0: {} + common-tags@1.8.2: {} + compress-commons@6.0.2: dependencies: crc-32: 1.2.2 @@ -12808,27 +13276,63 @@ snapshots: normalize-path: 3.0.0 readable-stream: 4.7.0 + compute-scroll-into-view@3.1.1: {} + concat-map@0.0.1: {} confbox@0.1.8: {} confbox@0.2.2: {} + confusing-browser-globals@1.0.11: {} + consola@3.4.2: {} - content-disposition@1.0.1: {} + convert-source-map@2.0.0: {} + + convex-helpers@0.1.104(@standard-schema/spec@1.0.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@3.25.76): + dependencies: + convex: 1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + optionalDependencies: + '@standard-schema/spec': 1.0.0 + react: 19.0.0 + typescript: 5.9.2 + zod: 3.25.76 - content-type@1.0.5: {} + convex-helpers@0.1.104(@standard-schema/spec@1.0.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@4.0.17): + dependencies: + convex: 1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + optionalDependencies: + '@standard-schema/spec': 1.0.0 + react: 19.0.0 + typescript: 5.9.2 + zod: 4.0.17 - convert-source-map@1.9.0: {} + convex-helpers@0.1.99(@standard-schema/spec@1.0.0)(convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0))(react@19.0.0)(typescript@5.9.2)(zod@4.0.17): + dependencies: + convex: 1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + optionalDependencies: + '@standard-schema/spec': 1.0.0 + react: 19.0.0 + typescript: 5.9.2 + zod: 4.0.17 - convert-source-map@2.0.0: {} + convex@1.27.0(@clerk/clerk-react@5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0): + dependencies: + esbuild: 0.25.4 + jwt-decode: 4.0.0 + prettier: 3.6.2 + optionalDependencies: + '@clerk/clerk-react': 5.48.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 cookie-es@1.2.2: {} cookie-es@2.0.0: {} - cookie-signature@1.2.2: {} + cookie-signature@1.2.1: {} + + cookie@0.6.0: {} cookie@0.7.1: {} @@ -12839,12 +13343,11 @@ snapshots: graceful-fs: 4.2.11 p-event: 6.0.1 - core-util-is@1.0.3: {} - - cors@2.8.5: + core-js-compat@3.36.0: dependencies: - object-assign: 4.1.1 - vary: 1.1.2 + browserslist: 4.24.4 + + core-util-is@1.0.3: {} cose-base@1.0.3: dependencies: @@ -12857,11 +13360,10 @@ snapshots: cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.1 + import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - optional: true crc-32@1.2.2: {} @@ -12874,11 +13376,7 @@ snapshots: dependencies: luxon: 3.5.0 - cross-env@7.0.3: - dependencies: - cross-spawn: 7.0.6 - - cross-spawn@6.0.6: + cross-spawn@6.0.5: dependencies: nice-try: 1.0.5 path-key: 2.0.1 @@ -12924,7 +13422,7 @@ snapshots: dependencies: css-tree: 2.2.1 - csstype@3.2.3: {} + csstype@3.1.3: {} cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): dependencies: @@ -13114,32 +13612,22 @@ snapshots: damerau-levenshtein@1.0.8: {} - data-uri-to-buffer@4.0.1: {} - - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 + data-uri-to-buffer@3.0.1: {} - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 + data-uri-to-buffer@4.0.1: {} date-fns@2.30.0: dependencies: '@babel/runtime': 7.24.5 + date-fns@4.1.0: {} + dayjs@1.11.18: {} + debug@3.2.7: + dependencies: + ms: 2.1.3 + debug@4.4.1: dependencies: ms: 2.1.3 @@ -13152,10 +13640,6 @@ snapshots: dependencies: callsite: 1.0.0 - decode-named-character-reference@1.2.0: - dependencies: - character-entities: 2.0.2 - dedent@1.7.0(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -13182,7 +13666,7 @@ snapshots: dependencies: robust-predicates: 3.0.2 - depd@2.0.0: {} + delayed-stream@1.0.0: {} deprecation@2.3.1: {} @@ -13190,10 +13674,6 @@ snapshots: destr@2.0.5: {} - detect-gpu@5.0.70: - dependencies: - webgl-constants: 1.1.1 - detect-libc@1.0.3: {} detect-libc@2.0.4: {} @@ -13238,7 +13718,7 @@ snapshots: detective-typescript@14.0.0(typescript@5.9.2): dependencies: - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.2) ast-module-types: 6.0.1 node-source-walk: 7.0.1 typescript: 5.9.2 @@ -13260,18 +13740,20 @@ snapshots: dettle@1.0.5: {} - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - diff@8.0.2: {} - discord-interactions@4.4.0: {} + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 doctrine@2.1.0: dependencies: esutils: 2.0.3 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -13309,24 +13791,20 @@ snapshots: dotenv@16.6.1: {} - draco3d@1.5.7: {} - - drizzle-kit@0.31.7: + download-stats@0.3.4: dependencies: - '@drizzle-team/brocli': 0.10.2 - '@esbuild-kit/esm-loader': 2.6.5 - esbuild: 0.25.10 - esbuild-register: 3.6.0(esbuild@0.25.10) - transitivePeerDependencies: - - supports-color + JSONStream: 1.3.5 + lazy-cache: 2.0.2 + moment: 2.30.1 - drizzle-orm@0.44.7(@neondatabase/serverless@0.10.4)(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.5)(postgres@3.4.7): - optionalDependencies: - '@neondatabase/serverless': 0.10.4 - '@opentelemetry/api': 1.9.0 - '@types/pg': 8.15.6 - kysely: 0.28.5 - postgres: 3.4.7 + downshift@9.0.9(react@19.0.0): + dependencies: + '@babel/runtime': 7.24.5 + compute-scroll-into-view: 3.1.1 + prop-types: 15.8.1 + react: 19.0.0 + react-is: 18.2.0 + tslib: 2.8.1 dunder-proto@1.0.1: dependencies: @@ -13334,25 +13812,12 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - duplexer@0.1.2: {} - eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 - ee-first@1.1.1: {} - - effect@3.17.7: - dependencies: - '@standard-schema/spec': 1.1.0 - fast-check: 3.23.2 - - ejs@3.1.10: - dependencies: - jake: 10.9.4 - electron-to-chromium@1.5.83: {} emoji-regex@8.0.0: {} @@ -13363,8 +13828,6 @@ snapshots: enabled@2.0.0: {} - encodeurl@2.0.0: {} - encoding-sniffer@0.2.1: dependencies: iconv-lite: 0.6.3 @@ -13389,11 +13852,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - optional: true - es-abstract@1.22.5: dependencies: array-buffer-byte-length: 1.0.1 @@ -13438,85 +13896,29 @@ snapshots: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 + es-array-method-boxes-properly@1.0.0: {} es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.1: + es-iterator-helpers@1.0.17: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 + asynciterator.prototype: 1.0.0 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.22.5 es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 + es-set-tostringtag: 2.0.3 function-bind: 1.1.2 get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 + globalthis: 1.0.3 has-property-descriptors: 1.0.2 - has-proto: 1.2.0 + has-proto: 1.0.3 has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 es-module-lexer@1.7.0: {} @@ -13530,13 +13932,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 @@ -13547,46 +13942,6 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - es6-promise@4.2.8: {} - - esbuild-register@3.6.0(esbuild@0.25.10): - dependencies: - debug: 4.4.3 - esbuild: 0.25.10 - transitivePeerDependencies: - - supports-color - - 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@0.25.10: optionalDependencies: '@esbuild/aix-ppc64': 0.25.10 @@ -13616,6 +13971,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.10 '@esbuild/win32-x64': 0.25.10 + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + esbuild@0.25.9: optionalDependencies: '@esbuild/aix-ppc64': 0.25.9 @@ -13645,39 +14028,8 @@ snapshots: '@esbuild/win32-ia32': 0.25.9 '@esbuild/win32-x64': 0.25.9 - esbuild@0.27.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.0 - '@esbuild/android-arm': 0.27.0 - '@esbuild/android-arm64': 0.27.0 - '@esbuild/android-x64': 0.27.0 - '@esbuild/darwin-arm64': 0.27.0 - '@esbuild/darwin-x64': 0.27.0 - '@esbuild/freebsd-arm64': 0.27.0 - '@esbuild/freebsd-x64': 0.27.0 - '@esbuild/linux-arm': 0.27.0 - '@esbuild/linux-arm64': 0.27.0 - '@esbuild/linux-ia32': 0.27.0 - '@esbuild/linux-loong64': 0.27.0 - '@esbuild/linux-mips64el': 0.27.0 - '@esbuild/linux-ppc64': 0.27.0 - '@esbuild/linux-riscv64': 0.27.0 - '@esbuild/linux-s390x': 0.27.0 - '@esbuild/linux-x64': 0.27.0 - '@esbuild/netbsd-arm64': 0.27.0 - '@esbuild/netbsd-x64': 0.27.0 - '@esbuild/openbsd-arm64': 0.27.0 - '@esbuild/openbsd-x64': 0.27.0 - '@esbuild/openharmony-arm64': 0.27.0 - '@esbuild/sunos-x64': 0.27.0 - '@esbuild/win32-arm64': 0.27.0 - '@esbuild/win32-ia32': 0.27.0 - '@esbuild/win32-x64': 0.27.0 - escalade@3.2.0: {} - escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} @@ -13692,115 +14044,234 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1(jiti@2.6.0)): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.3))(eslint@8.57.0)(typescript@5.9.2): + dependencies: + '@babel/core': 7.28.3 + '@babel/eslint-parser': 7.23.10(@babel/core@7.28.3)(eslint@8.57.0) + '@rushstack/eslint-patch': 1.7.2 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.9.2) + babel-preset-react-app: 10.0.1 + confusing-browser-globals: 1.0.11 + eslint: 8.57.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.3))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.34.0(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 5.11.1(eslint@8.57.0)(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.9.2) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.3))(eslint@8.57.0): + dependencies: + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) + eslint: 8.57.0 + lodash: 4.17.21 + string-natural-compare: 3.0.1 + + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0): + dependencies: + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.4 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.2 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.9.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.9.2) + eslint: 8.57.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): dependencies: - aria-query: 5.3.2 - array-includes: 3.1.9 - array.prototype.flatmap: 1.3.3 + '@babel/runtime': 7.24.5 + aria-query: 5.3.0 + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.8 - axe-core: 4.11.0 - axobject-query: 4.1.0 + axe-core: 4.7.0 + axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.1(jiti@2.6.0) + es-iterator-helpers: 1.0.17 + eslint: 8.57.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 + object.entries: 1.1.7 + object.fromentries: 2.0.7 - eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.0)): + eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 - eslint: 9.39.1(jiti@2.6.0) - hermes-parser: 0.25.1 - zod: 4.3.5 - zod-validation-error: 4.0.2(zod@4.3.5) - transitivePeerDependencies: - - supports-color + eslint: 8.57.0 - eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.0)): + eslint-plugin-react@7.34.0(eslint@8.57.0): dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 + array-includes: 3.1.7 + array.prototype.findlast: 1.2.4 + array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 9.39.1(jiti@2.6.0) + es-iterator-helpers: 1.0.17 + eslint: 8.57.0 estraverse: 5.3.0 - hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 + string.prototype.matchall: 4.0.10 + + eslint-plugin-testing-library@5.11.1(eslint@8.57.0)(typescript@5.9.2): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.9.2) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-unicorn@49.0.0(eslint@8.57.0): + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + ci-info: 3.9.0 + clean-regexp: 1.0.0 + eslint: 8.57.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.1.0 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.7.2 + strip-indent: 3.0.0 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 - eslint-scope@8.4.0: + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-visitor-keys@2.1.0: {} + eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.1: {} - eslint@9.39.1(jiti@2.6.0): - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.0)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.39.1 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.1 + doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 + file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.3 - optionalDependencies: - jiti: 2.6.0 + strip-ansi: 6.0.1 + text-table: 0.2.0 transitivePeerDependencies: - supports-color esm-env@1.1.4: {} - espree@10.4.0: + espree@9.6.1: dependencies: acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 4.2.1 + eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -13812,6 +14283,8 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-walker@2.0.2: {} @@ -13828,12 +14301,6 @@ snapshots: events@3.3.0: {} - eventsource-parser@3.0.6: {} - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.0.6 - execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -13846,58 +14313,6 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - execa@9.6.1: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 8.0.1 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 6.0.0 - pretty-ms: 9.3.0 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.1.2 - - express-rate-limit@7.5.1(express@5.2.1): - dependencies: - express: 5.2.1 - - express@5.2.1: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.2 - content-disposition: 1.0.1 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.2.2 - debug: 4.4.3 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1 - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.1 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.1 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 - statuses: 2.0.2 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - exsolve@1.0.7: {} extend-shallow@2.0.1: @@ -13916,9 +14331,7 @@ snapshots: transitivePeerDependencies: - supports-color - fast-check@3.23.2: - dependencies: - pure-rand: 6.1.0 + fast-content-type-parse@2.0.1: {} fast-deep-equal@3.1.3: {} @@ -13961,49 +14374,31 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - fflate@0.6.10: {} - - fflate@0.8.2: {} + fetchdts@0.1.7: {} figures@6.1.0: dependencies: is-unicode-supported: 2.1.0 - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - - file-selector@0.6.0: + file-entry-cache@6.0.1: dependencies: - tslib: 2.8.1 + flat-cache: 3.2.0 file-uri-to-path@1.0.0: {} - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 filter-obj@6.1.0: {} - finalhandler@2.1.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - find-my-way-ts@0.1.6: {} - find-up-simple@1.0.1: {} + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -14015,20 +14410,19 @@ snapshots: path-exists: 5.0.0 unicorn-magic: 0.1.0 - flat-cache@4.0.1: + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 + rimraf: 3.0.2 flatted@3.3.1: {} fn.name@1.1.0: {} - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 + follow-redirects@1.15.9: {} - for-each@0.3.5: + for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -14037,21 +14431,32 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 - forwarded-parse@2.1.2: {} - - forwarded@0.2.0: {} - fraction.js@4.3.7: {} - fresh@2.0.0: {} + framer-motion@11.18.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + motion-dom: 11.18.1 + motion-utils: 11.18.1 + tslib: 2.8.1 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - fsevents@2.3.2: + fs-monkey@1.1.0: optional: true + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true @@ -14064,15 +14469,6 @@ snapshots: es-abstract: 1.22.5 functions-have-names: 1.2.3 - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - functions-have-names@1.2.3: {} gensync@1.0.0-beta.2: {} @@ -14114,23 +14510,12 @@ snapshots: get-stream@8.0.1: {} - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -14145,11 +14530,9 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regex.js@1.2.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 + glob-to-regexp@0.4.1: {} - glob@10.5.0: + glob@10.4.5: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 @@ -14158,13 +14541,27 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@13.0.0: + glob@7.2.3: dependencies: - minimatch: 10.1.1 - minipass: 7.1.2 - path-scurry: 2.0.1 + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@9.3.5: + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.11.1 - globals@14.0.0: {} + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 globals@15.15.0: {} @@ -14172,22 +14569,24 @@ snapshots: dependencies: define-properties: 1.2.1 - globalthis@1.0.4: + globby@11.1.0: dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 globrex@0.1.2: {} - glsl-noise@0.0.0: {} - gonzales-pe@4.3.0: dependencies: minimist: 1.2.8 - goober@2.1.16(csstype@3.2.3): + goober@2.1.16(csstype@3.1.3): dependencies: - csstype: 3.2.3 + csstype: 3.1.3 gopd@1.2.0: {} @@ -14195,17 +14594,20 @@ snapshots: graphemer@1.4.0: {} + graphql-tag@2.12.6(graphql@16.11.0): + dependencies: + graphql: 16.11.0 + tslib: 2.8.1 + + graphql@16.11.0: {} + gray-matter@4.0.3: dependencies: - js-yaml: 3.14.2 + js-yaml: 3.14.1 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - gzip-size@6.0.0: - dependencies: - duplexer: 0.1.2 - h3@1.15.4: dependencies: cookie-es: 1.2.2 @@ -14218,10 +14620,12 @@ snapshots: ufo: 1.6.1 uncrypto: 0.1.3 - h3@2.0.1-rc.11: + h3@2.0.0-beta.4: dependencies: - rou3: 0.7.12 - srvx: 0.10.1 + cookie-es: 2.0.0 + fetchdts: 0.1.7 + rou3: 0.7.5 + srvx: 0.8.7 hachure-fill@0.5.2: {} @@ -14237,10 +14641,6 @@ snapshots: has-proto@1.0.3: {} - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -14251,112 +14651,16 @@ snapshots: dependencies: function-bind: 1.1.2 - hast-util-from-html@2.0.3: - dependencies: - '@types/hast': 3.0.4 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.3 - parse5: 7.3.0 - vfile: 6.0.3 - vfile-message: 4.0.3 - - hast-util-from-parse5@8.0.3: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - devlop: 1.1.0 - hastscript: 9.0.1 - property-information: 7.1.0 - vfile: 6.0.3 - vfile-location: 5.0.3 - web-namespaces: 2.0.1 - - hast-util-heading-rank@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-is-element@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-parse-selector@4.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-raw@9.1.0: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.3 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - parse5: 7.3.0 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-to-html@9.0.5: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - - hast-util-to-parse5@8.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-to-string@3.0.1: - dependencies: - '@types/hast': 3.0.4 - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hastscript@9.0.1: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - - hls.js@1.6.15: {} + highlight.js@11.10.0: {} hogan.js@3.0.2: dependencies: mkdirp: 0.3.0 nopt: 1.0.10 - hono-rate-limiter@0.4.2(hono@4.11.3): + hoist-non-react-statics@3.3.2: dependencies: - hono: 4.11.3 - - hono@4.11.3: {} + react-is: 16.13.1 hosted-git-info@2.8.9: {} @@ -14371,17 +14675,15 @@ snapshots: domhandler: 5.0.3 htmlparser2: 9.1.0 - html-react-parser@5.1.10(@types/react@19.2.10)(react@19.2.3): + html-react-parser@5.1.10(@types/react@18.3.12)(react@19.0.0): dependencies: domhandler: 5.0.3 html-dom-parser: 5.0.8 - react: 19.2.3 + react: 19.0.0 react-property: 2.0.2 style-to-js: 1.1.12 optionalDependencies: - '@types/react': 19.2.10 - - html-void-elements@3.0.0: {} + '@types/react': 18.3.12 htmlparser2@10.0.0: dependencies: @@ -14397,20 +14699,12 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - http-shutdown@1.2.2: {} https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.3 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -14423,63 +14717,47 @@ snapshots: human-signals@5.0.0: {} - human-signals@8.0.1: {} - - husky@9.1.7: {} - - hyperdyperid@1.2.0: {} - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.2: - dependencies: - safer-buffer: 2.1.2 - ieee754@1.2.1: {} ignore@5.3.2: {} - ignore@7.0.5: {} - image-meta@0.2.2: {} image-size@2.0.2: {} - immediate@3.0.6: {} - import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - optional: true - - import-in-the-middle@2.0.6: - dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) - cjs-module-lexer: 2.2.0 - module-details-from-path: 1.0.4 + import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + indent-string@5.0.0: {} index-to-position@1.2.0: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.4: {} + inline-style-parser@0.1.1: {} + inline-style-parser@0.2.3: {} instantsearch-ui-components@0.11.1: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.24.5 instantsearch.js@4.78.1(algoliasearch@5.23.4): dependencies: @@ -14494,7 +14772,7 @@ snapshots: htm: 3.1.1 instantsearch-ui-components: 0.11.1 preact: 10.26.5 - qs: 6.14.1 + qs: 6.9.7 search-insights: 2.17.3 internal-slot@1.0.7: @@ -14503,12 +14781,6 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - internmap@1.0.1: {} internmap@2.0.3: {} @@ -14517,9 +14789,7 @@ snapshots: dependencies: binary-search-bounds: 2.0.5 - ipaddr.js@1.9.1: {} - - ipx@3.1.1(@netlify/blobs@10.0.11)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11)): + ipx@3.1.1(@netlify/blobs@10.0.11): dependencies: '@fastify/accept-negotiator': 2.0.1 citty: 0.1.6 @@ -14535,7 +14805,7 @@ snapshots: sharp: 0.34.4 svgo: 4.0.0 ufo: 1.6.1 - unstorage: 1.17.1(@netlify/blobs@10.0.11)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11)) + unstorage: 1.17.1(@netlify/blobs@10.0.11) xss: 1.0.15 transitivePeerDependencies: - '@azure/app-configuration' @@ -14560,15 +14830,21 @@ snapshots: iron-webcrypto@1.2.1: {} - is-array-buffer@3.0.4: + is-alphabetical@1.0.4: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-arguments@1.1.1: dependencies: call-bind: 1.0.7 - get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: + is-array-buffer@3.0.4: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 + call-bind: 1.0.7 get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} @@ -14581,10 +14857,6 @@ snapshots: dependencies: has-bigints: 1.0.2 - is-bigint@1.1.0: - dependencies: - has-bigints: 1.0.2 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 @@ -14594,10 +14866,13 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-boolean-object@1.2.2: + is-buffer@1.1.6: {} + + is-buffer@2.0.5: {} + + is-builtin-module@3.2.1: dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 + builtin-modules: 3.3.0 is-callable@1.2.7: {} @@ -14605,22 +14880,11 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-docker@2.2.1: {} + is-decimal@1.0.4: {} is-docker@3.0.0: {} @@ -14628,9 +14892,9 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: + is-finalizationregistry@1.0.2: dependencies: - call-bound: 1.0.4 + call-bind: 1.0.7 is-fullwidth-code-point@3.0.0: {} @@ -14642,6 +14906,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@1.0.4: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -14656,47 +14922,33 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-number@7.0.0: {} + is-path-inside@3.0.3: {} + is-path-inside@4.0.0: {} is-plain-obj@2.1.0: {} is-plain-obj@4.1.0: {} - is-plain-object@5.0.0: {} - - is-promise@2.2.2: {} + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 - is-promise@4.0.0: {} + is-plain-object@5.0.0: {} is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - is-set@2.0.3: {} is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - is-stream@2.0.1: {} is-stream@3.0.0: {} @@ -14707,29 +14959,14 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-symbol@1.0.4: dependencies: has-symbols: 1.1.0 - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - is-unicode-supported@2.1.0: {} is-url-superb@4.0.0: {} @@ -14742,19 +14979,11 @@ snapshots: dependencies: call-bind: 1.0.7 - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - is-weakset@2.0.3: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.7 get-intrinsic: 1.3.0 - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 @@ -14771,23 +15000,17 @@ snapshots: isexe@2.0.0: {} + isobject@3.0.1: {} + isoformat@0.2.1: {} - iterator.prototype@1.1.5: + iterator.prototype@1.1.2: dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 + define-properties: 1.2.1 get-intrinsic: 1.3.0 - get-proto: 1.0.1 has-symbols: 1.1.0 - set-function-name: 2.0.2 - - its-fine@2.0.0(@types/react@19.2.10)(react@19.2.3): - dependencies: - '@types/react-reconciler': 0.28.9(@types/react@19.2.10) - react: 19.2.3 - transitivePeerDependencies: - - '@types/react' + reflect.getprototypeof: 1.0.5 + set-function-name: 2.0.1 jackspeak@3.4.3: dependencies: @@ -14795,57 +15018,60 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.4: - dependencies: - async: 3.2.6 - filelist: 1.0.4 - picocolors: 1.1.1 - jiti@2.5.1: {} jiti@2.6.0: {} jose@5.10.0: {} - jose@6.1.3: {} - jpeg-js@0.4.4: {} + js-cookie@3.0.5: {} + js-image-generator@1.0.4: dependencies: jpeg-js: 0.4.4 js-tokens@4.0.0: {} - js-yaml@3.14.2: + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@0.5.0: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} - json-parse-even-better-errors@2.3.1: - optional: true + json-parse-even-better-errors@2.3.1: {} json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} - json-schema-typed@8.0.2: {} - json-stable-stringify-without-jsonify@1.0.1: {} + json5@1.0.2: + dependencies: + minimist: 1.2.8 + json5@2.2.3: {} + jsonparse@1.3.1: {} + jsonpointer@5.0.1: {} jsonwebtoken@9.0.2: dependencies: - jws: 3.2.3 + jws: 3.2.2 lodash.includes: 4.3.0 lodash.isboolean: 3.0.3 lodash.isinteger: 4.0.4 @@ -14854,21 +15080,14 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.3 + semver: 7.7.2 jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.9 + array-includes: 3.1.7 array.prototype.flat: 1.3.2 - object.assign: 4.1.7 - object.values: 1.2.1 - - jszip@3.10.1: - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 + object.assign: 4.1.5 + object.values: 1.1.7 junk@4.0.1: {} @@ -14878,7 +15097,7 @@ snapshots: ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - jws@3.2.3: + jws@3.2.2: dependencies: jwa: 1.4.2 safe-buffer: 5.2.1 @@ -14895,14 +15114,17 @@ snapshots: khroma@2.1.0: {} + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + kind-of@6.0.3: {} kolorist@1.8.0: {} kuler@2.0.0: {} - kysely@0.28.5: - optional: true + kysely@0.28.5: {} lambda-local@2.2.0: dependencies: @@ -14928,6 +15150,10 @@ snapshots: layout-base@2.0.1: {} + lazy-cache@2.0.2: + dependencies: + set-getter: 0.1.1 + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 @@ -14939,10 +15165,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lie@3.3.0: - dependencies: - immediate: 3.0.6 - lightningcss-darwin-arm64@1.30.1: optional: true @@ -14988,8 +15210,11 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.1 lightningcss-win32-x64-msvc: 1.30.1 - lines-and-columns@1.2.4: - optional: true + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 listhen@1.9.0: dependencies: @@ -15005,13 +15230,29 @@ snapshots: http-shutdown: 1.2.2 jiti: 2.6.0 mlly: 1.7.4 - node-forge: 1.3.3 + 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 + lit-element@4.1.0: + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.1 + '@lit/reactive-element': 2.0.4 + lit-html: 3.2.0 + + lit-html@3.2.0: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.2.0: + dependencies: + '@lit/reactive-element': 2.0.4 + lit-element: 4.1.0 + lit-html: 3.2.0 + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 @@ -15025,6 +15266,10 @@ snapshots: pkg-types: 2.3.0 quansync: 0.2.11 + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -15037,6 +15282,8 @@ snapshots: lodash.castarray@4.4.0: {} + lodash.debounce@4.0.8: {} + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -15064,33 +15311,25 @@ snapshots: safe-stable-stringify: 2.5.0 triple-beam: 1.4.1 - longest-streak@3.1.0: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 lru-cache@10.4.3: {} - lru-cache@11.2.5: {} - lru-cache@5.1.1: dependencies: yallist: 3.1.1 lru-cache@7.18.3: {} - lucide-react@0.561.0(react@19.2.3): + lucia@3.2.2: dependencies: - react: 19.2.3 + '@oslojs/crypto': 1.0.1 + '@oslojs/encoding': 1.1.0 luxon@3.5.0: {} - maath@0.10.8(@types/three@0.182.0)(three@0.182.0): - dependencies: - '@types/three': 0.182.0 - three: 0.182.0 - magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -15099,387 +15338,124 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - map-obj@5.0.2: {} - - markdown-table@3.0.4: {} - - marked@15.0.12: {} - - match-sorter@8.2.0: - dependencies: - '@babel/runtime': 7.28.4 - remove-accents: 0.5.0 - - math-intrinsics@1.1.0: {} - - mdast-util-find-and-replace@3.0.2: - dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 - - mdast-util-from-markdown@2.0.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.2.0 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.2 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-decode-string: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-autolink-literal@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.2 - micromark-util-character: 2.1.1 - - mdast-util-gfm-footnote@2.1.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-table@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm@3.1.0: - dependencies: - mdast-util-from-markdown: 2.0.2 - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@4.1.0: - dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.1 - - mdast-util-to-hast@13.2.1: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - - mdast-util-to-markdown@2.1.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-classify-character: 2.0.1 - micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - - mdn-data@2.0.28: {} - - mdn-data@2.12.2: {} - - media-typer@1.1.0: {} - - memfs@4.56.10(tslib@2.8.1): - dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-to-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - memorystream@0.3.1: {} - - merge-descriptors@2.0.0: {} - - merge-options@3.0.4: - dependencies: - is-plain-obj: 2.1.0 - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - mermaid@11.11.0: - dependencies: - '@braintree/sanitize-url': 7.1.1 - '@iconify/utils': 3.0.1 - '@mermaid-js/parser': 0.6.2 - '@types/d3': 7.4.3 - cytoscape: 3.33.1 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) - cytoscape-fcose: 2.2.0(cytoscape@3.33.1) - d3: 7.9.0 - d3-sankey: 0.12.3 - dagre-d3-es: 7.0.11 - dayjs: 1.11.18 - dompurify: 3.2.6 - katex: 0.16.22 - khroma: 2.1.0 - lodash-es: 4.17.21 - marked: 15.0.12 - roughjs: 4.6.6 - stylis: 4.3.6 - ts-dedent: 2.2.0 - uuid: 11.1.0 - transitivePeerDependencies: - - supports-color - - meshline@3.3.1(three@0.182.0): - dependencies: - three: 0.182.0 - - meshoptimizer@0.22.0: {} - - micromark-core-commonmark@2.0.3: - dependencies: - decode-named-character-reference: 1.2.0 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.0.1 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-autolink-literal@2.1.0: + magic-string@0.30.8: dependencies: - micromark-util-character: 2.1.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-footnote@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-strikethrough@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-table@2.1.1: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + '@jridgewell/sourcemap-codec': 1.5.5 - micromark-extension-gfm-tagfilter@2.0.0: - dependencies: - micromark-util-types: 2.0.2 + map-obj@5.0.2: {} - micromark-extension-gfm-task-list-item@2.1.0: + markdown-it@14.1.0: dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 - micromark-extension-gfm@3.0.0: + marked-alert@2.0.1(marked@13.0.2): dependencies: - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.1 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 + marked: 13.0.2 - micromark-factory-destination@2.0.1: + marked-gfm-heading-id@4.0.0(marked@13.0.2): dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + github-slugger: 2.0.0 + marked: 13.0.2 - micromark-factory-label@2.0.1: + marked-highlight@2.1.4(marked@13.0.2): dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + marked: 13.0.2 - micromark-factory-space@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 + marked@13.0.2: {} - micromark-factory-title@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + marked@15.0.12: {} - micromark-factory-whitespace@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + math-intrinsics@1.1.0: {} - micromark-util-character@2.1.1: + mdast-util-definitions@4.0.0: dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + unist-util-visit: 2.0.3 - micromark-util-chunked@2.0.1: + mdast-util-from-markdown@0.8.5: dependencies: - micromark-util-symbol: 2.0.1 + '@types/mdast': 3.0.15 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color - micromark-util-classify-character@2.0.1: + mdast-util-to-hast@10.2.0: dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + mdast-util-definitions: 4.0.0 + mdurl: 1.0.1 + unist-builder: 2.0.3 + unist-util-generated: 1.1.6 + unist-util-position: 3.1.0 + unist-util-visit: 2.0.3 - micromark-util-combine-extensions@2.0.1: - dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 + mdast-util-to-string@2.0.0: {} - micromark-util-decode-numeric-character-reference@2.0.2: - dependencies: - micromark-util-symbol: 2.0.1 + mdn-data@2.0.28: {} - micromark-util-decode-string@2.0.1: - dependencies: - decode-named-character-reference: 1.2.0 - micromark-util-character: 2.1.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-symbol: 2.0.1 + mdn-data@2.12.2: {} - micromark-util-encode@2.0.1: {} + mdurl@1.0.1: {} - micromark-util-html-tag-name@2.0.1: {} + mdurl@2.0.0: {} - micromark-util-normalize-identifier@2.0.1: + memfs-browser@3.5.10302: dependencies: - micromark-util-symbol: 2.0.1 + memfs: 3.5.3 + optional: true - micromark-util-resolve-all@2.0.1: + memfs@3.5.3: dependencies: - micromark-util-types: 2.0.2 + fs-monkey: 1.1.0 + optional: true - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 + memorystream@0.3.1: {} - micromark-util-subtokenize@2.1.0: + merge-options@3.0.4: dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + is-plain-obj: 2.1.0 - micromark-util-symbol@2.0.1: {} + merge-stream@2.0.0: {} - micromark-util-types@2.0.2: {} + merge2@1.4.1: {} - micromark@4.0.2: + mermaid@11.11.0: dependencies: - '@types/debug': 4.1.12 - debug: 4.4.3 - decode-named-character-reference: 1.2.0 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-combine-extensions: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 3.0.1 + '@mermaid-js/parser': 0.6.2 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.11 + dayjs: 1.11.18 + dompurify: 3.2.6 + katex: 0.16.22 + khroma: 2.1.0 + lodash-es: 4.17.21 + marked: 15.0.12 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + transitivePeerDependencies: + - supports-color + + micromark@2.11.4: + dependencies: + debug: 4.4.1 + parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -15488,29 +15464,37 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.52.0: {} + mime-db@1.54.0: {} - mime-types@3.0.1: + mime-types@2.1.35: dependencies: - mime-db: 1.54.0 + mime-db: 1.52.0 - mime-types@3.0.2: + mime-types@3.0.1: dependencies: mime-db: 1.54.0 mimic-fn@4.0.0: {} - minimatch@10.1.1: - dependencies: - '@isaacs/brace-expansion': 5.0.0 + min-indent@1.0.1: {} minimatch@3.1.2: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.11 minimatch@5.1.6: dependencies: - brace-expansion: 4.0.1 + brace-expansion: 2.0.2 + + minimatch@8.0.4: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: @@ -15518,6 +15502,8 @@ snapshots: minimist@1.2.8: {} + minipass@4.2.8: {} + minipass@7.1.2: {} minizlib@3.0.2: @@ -15526,10 +15512,6 @@ snapshots: mkdirp@0.3.0: {} - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - mkdirp@3.0.1: {} mlly@1.7.4: @@ -15544,38 +15526,40 @@ snapshots: ast-module-types: 6.0.1 node-source-walk: 7.0.1 - module-details-from-path@1.0.4: {} + moment@2.30.1: {} + + motion-dom@11.18.1: + dependencies: + motion-utils: 11.18.1 + + motion-utils@11.18.1: {} + + mrmime@1.0.1: {} ms@2.1.3: {} - msgpackr-extract@3.0.3: + nano@10.1.4: dependencies: - node-gyp-build-optional-packages: 5.2.2 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 - optional: true + axios: 1.7.8 + node-abort-controller: 3.1.1 + qs: 6.14.0 + transitivePeerDependencies: + - debug - msgpackr@1.11.8: - optionalDependencies: - msgpackr-extract: 3.0.3 + nanoid@3.3.11: {} - multipasta@0.2.7: {} + nanostores@0.11.4: {} - nanoid@3.3.11: {} + natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} - negotiator@1.0.0: {} - netlify-redirector@0.5.0: {} nice-try@1.0.5: {} + node-abort-controller@3.1.1: {} + node-addon-api@7.1.1: {} node-domexception@1.0.0: {} @@ -15592,12 +15576,7 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-forge@1.3.3: {} - - node-gyp-build-optional-packages@5.2.2: - dependencies: - detect-libc: 2.1.2 - optional: true + node-forge@1.3.1: {} node-gyp-build@4.8.4: {} @@ -15629,7 +15608,7 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.3 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -15640,13 +15619,23 @@ snapshots: normalize-range@0.1.2: {} - normalize-wheel@1.0.1: {} + npm-api@1.0.1: + dependencies: + JSONStream: 1.3.5 + clone-deep: 4.0.1 + download-stats: 0.3.4 + moment: 2.30.1 + node-fetch: 2.7.0 + paged-request: 2.0.2 + transitivePeerDependencies: + - debug + - encoding npm-run-all@4.1.5: dependencies: ansi-styles: 3.2.1 chalk: 2.4.2 - cross-spawn: 6.0.6 + cross-spawn: 6.0.5 memorystream: 0.3.1 minimatch: 3.1.2 pidtree: 0.3.1 @@ -15658,11 +15647,6 @@ snapshots: dependencies: path-key: 4.0.0 - npm-run-path@6.0.0: - dependencies: - path-key: 4.0.0 - unicorn-magic: 0.3.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -15686,37 +15670,50 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - object.assign@4.1.7: + object.entries@1.1.7: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 + call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 + es-abstract: 1.22.5 - object.entries@1.1.9: + object.fromentries@2.0.7: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 + call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-abstract: 1.22.5 - object.fromentries@2.0.8: + object.groupby@1.0.2: dependencies: - call-bind: 1.0.8 + array.prototype.filter: 1.0.3 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 + es-abstract: 1.22.5 + es-errors: 1.3.0 - object.values@1.2.1: + object.hasown@1.1.3: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-abstract: 1.22.5 + + object.values@1.1.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 - obuf@1.1.2: {} + octokit@4.1.4: + dependencies: + '@octokit/app': 15.1.6 + '@octokit/core': 6.1.6 + '@octokit/oauth-app': 7.1.6 + '@octokit/plugin-paginate-graphql': 5.2.4(@octokit/core@6.1.6) + '@octokit/plugin-paginate-rest': 12.0.0(@octokit/core@6.1.6) + '@octokit/plugin-rest-endpoint-methods': 14.0.0(@octokit/core@6.1.6) + '@octokit/plugin-retry': 7.2.1(@octokit/core@6.1.6) + '@octokit/plugin-throttling': 10.0.0(@octokit/core@6.1.6) + '@octokit/request-error': 6.1.8 + '@octokit/types': 14.1.0 + '@octokit/webhooks': 13.9.1 ofetch@1.4.1: dependencies: @@ -15726,10 +15723,6 @@ snapshots: omit.js@2.0.2: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -15742,11 +15735,6 @@ snapshots: dependencies: mimic-fn: 4.0.0 - open@7.4.2: - dependencies: - is-docker: 2.2.1 - is-wsl: 2.2.0 - optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -15756,16 +15744,19 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - own-keys@1.0.1: + oslo@1.2.1: dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 + '@node-rs/argon2': 1.7.0 + '@node-rs/bcrypt': 1.9.0 p-event@6.0.1: dependencies: p-timeout: 6.1.4 + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -15778,6 +15769,10 @@ snapshots: dependencies: yocto-queue: 1.2.1 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -15796,6 +15791,8 @@ snapshots: p-timeout@6.1.4: {} + p-try@2.2.0: {} + p-wait-for@5.0.2: dependencies: p-timeout: 6.1.4 @@ -15804,12 +15801,25 @@ snapshots: package-manager-detector@1.3.0: {} - pako@1.0.11: {} + paged-request@2.0.2: + dependencies: + axios: 0.21.4 + transitivePeerDependencies: + - debug parent-module@1.0.1: dependencies: callsites: 3.1.0 + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + parse-gitignore@2.0.0: {} parse-imports@2.2.1: @@ -15824,11 +15834,10 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 - error-ex: 1.3.4 + '@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 - optional: true parse-json@8.3.0: dependencies: @@ -15836,8 +15845,6 @@ snapshots: index-to-position: 1.2.0 type-fest: 4.41.0 - parse-ms@4.0.0: {} - parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 @@ -15851,14 +15858,14 @@ snapshots: dependencies: entities: 6.0.1 - parseurl@1.3.3: {} - path-data-parser@0.1.0: {} path-exists@4.0.0: {} path-exists@5.0.0: {} + path-is-absolute@1.0.1: {} + path-key@2.0.1: {} path-key@3.1.1: {} @@ -15872,19 +15879,13 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-scurry@2.0.1: - dependencies: - lru-cache: 11.2.5 - minipass: 7.1.2 - - path-to-regexp@8.3.0: {} + path-to-regexp@6.3.0: {} path-type@3.0.0: dependencies: pify: 3.0.0 - path-type@4.0.0: - optional: true + path-type@4.0.0: {} path-type@6.0.0: {} @@ -15894,30 +15895,6 @@ snapshots: pend@1.2.0: {} - pg-int8@1.0.1: {} - - pg-numeric@1.0.2: {} - - pg-protocol@1.10.3: {} - - pg-types@2.2.0: - dependencies: - pg-int8: 1.0.1 - postgres-array: 2.0.0 - postgres-bytea: 1.0.0 - postgres-date: 1.0.7 - postgres-interval: 1.2.0 - - pg-types@4.1.0: - dependencies: - pg-int8: 1.0.1 - pg-numeric: 1.0.2 - postgres-array: 3.0.4 - postgres-bytea: 3.0.0 - postgres-date: 2.1.0 - postgres-interval: 3.0.0 - postgres-range: 1.1.4 - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -15930,8 +15907,6 @@ snapshots: pify@3.0.0: {} - pkce-challenge@5.0.1: {} - pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -15944,14 +15919,6 @@ snapshots: exsolve: 1.0.7 pathe: 2.0.3 - playwright-core@1.57.0: {} - - playwright@1.57.0: - dependencies: - playwright-core: 1.57.0 - optionalDependencies: - fsevents: 2.3.2 - pluralize@8.0.0: {} points-on-curve@0.2.0: {} @@ -15983,36 +15950,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postgres-array@2.0.0: {} - - postgres-array@3.0.4: {} - - postgres-bytea@1.0.0: {} - - postgres-bytea@3.0.0: - dependencies: - obuf: 1.1.2 - - postgres-date@1.0.7: {} - - postgres-date@2.1.0: {} - - postgres-interval@1.2.0: - dependencies: - xtend: 4.0.2 - - postgres-interval@3.0.0: {} - - postgres-range@1.1.4: {} - - postgres@3.4.7: {} - - posthog-node@5.20.0: - dependencies: - '@posthog/core': 1.9.1 - - potpack@1.0.2: {} - preact-render-to-string@5.2.3(preact@10.11.3): dependencies: preact: 10.11.3 @@ -16044,13 +15981,11 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.7.4: {} + prettier@2.8.8: {} - pretty-format@3.8.0: {} + prettier@3.6.2: {} - pretty-ms@9.3.0: - dependencies: - parse-ms: 4.0.0 + pretty-format@3.8.0: {} process-nextick-args@2.0.1: {} @@ -16058,25 +15993,15 @@ snapshots: progress@2.0.3: {} - promise-worker-transferable@1.0.4: - dependencies: - is-promise: 2.2.2 - lie: 3.3.0 - prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - property-information@6.5.0: {} - - property-information@7.1.0: {} - - proxy-addr@2.0.7: + property-information@5.6.0: dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 + xtend: 4.0.2 proxy-from-env@1.1.0: {} @@ -16085,17 +16010,25 @@ snapshots: end-of-stream: 1.4.5 once: 1.4.0 + punycode.js@2.3.1: {} + punycode@2.3.1: {} - pure-rand@6.1.0: {} + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 - qs@6.14.1: + pvutils@1.1.3: {} + + qs@6.14.0: dependencies: side-channel: 1.1.0 - quansync@0.2.11: {} + qs@6.9.7: {} - querystringify@2.2.0: {} + qss@3.0.0: {} + + quansync@0.2.11: {} queue-microtask@1.2.3: {} @@ -16107,91 +16040,97 @@ snapshots: dependencies: safe-buffer: 5.2.1 - range-parser@1.2.1: {} - - raw-body@3.0.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - unpipe: 1.0.0 - - react-colorful@5.6.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + react-colorful@5.6.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - react-dom@19.2.3(react@19.2.3): + react-dom@19.0.0(react@19.0.0): dependencies: - react: 19.2.3 - scheduler: 0.27.0 + react: 19.0.0 + scheduler: 0.25.0 - react-easy-crop@5.5.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + react-icons@5.3.0(react@19.0.0): dependencies: - normalize-wheel: 1.0.1 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - tslib: 2.8.1 + react: 19.0.0 - react-instantsearch-core@7.15.5(algoliasearch@5.23.4)(react@19.2.3): + react-instantsearch-core@7.15.5(algoliasearch@5.23.4)(react@19.0.0): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.24.5 algoliasearch: 5.23.4 algoliasearch-helper: 3.24.3(algoliasearch@5.23.4) instantsearch.js: 4.78.1(algoliasearch@5.23.4) - react: 19.2.3 - use-sync-external-store: 1.6.0(react@19.2.3) + react: 19.0.0 + use-sync-external-store: 1.5.0(react@19.0.0) - react-instantsearch@7.15.5(algoliasearch@5.23.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + react-instantsearch@7.15.5(algoliasearch@5.23.4)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@babel/runtime': 7.24.5 algoliasearch: 5.23.4 instantsearch-ui-components: 0.11.1 instantsearch.js: 4.78.1(algoliasearch@5.23.4) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - react-instantsearch-core: 7.15.5(algoliasearch@5.23.4)(react@19.2.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-instantsearch-core: 7.15.5(algoliasearch@5.23.4)(react@19.0.0) react-is@16.13.1: {} + react-is@17.0.2: {} + + react-is@18.2.0: {} + + react-markdown@6.0.3(@types/react@18.3.12)(react@19.0.0): + dependencies: + '@types/hast': 2.3.10 + '@types/react': 18.3.12 + '@types/unist': 2.0.10 + comma-separated-tokens: 1.0.8 + prop-types: 15.8.1 + property-information: 5.6.0 + react: 19.0.0 + react-is: 17.0.2 + remark-parse: 9.0.0 + remark-rehype: 8.1.0 + space-separated-tokens: 1.1.5 + style-to-object: 0.3.0 + unified: 9.2.2 + unist-util-visit: 2.0.3 + vfile: 4.2.1 + transitivePeerDependencies: + - supports-color + react-property@2.0.2: {} react-refresh@0.14.2: {} - react-remove-scroll-bar@2.3.8(@types/react@19.2.10)(react@19.2.3): + react-remove-scroll-bar@2.3.8(@types/react@18.3.12)(react@19.0.0): dependencies: - react: 19.2.3 - react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.3) + react: 19.0.0 + react-style-singleton: 2.2.3(@types/react@18.3.12)(react@19.0.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - react-remove-scroll@2.6.3(@types/react@19.2.10)(react@19.2.3): + react-remove-scroll@2.6.3(@types/react@18.3.12)(react@19.0.0): dependencies: - react: 19.2.3 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.10)(react@19.2.3) - react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.3) + react: 19.0.0 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.12)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@18.3.12)(react@19.0.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.10)(react@19.2.3) - use-sidecar: 1.1.3(@types/react@19.2.10)(react@19.2.3) + use-callback-ref: 1.3.3(@types/react@18.3.12)(react@19.0.0) + use-sidecar: 1.1.3(@types/react@18.3.12)(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - react-style-singleton@2.2.3(@types/react@19.2.10)(react@19.2.3): + react-style-singleton@2.2.3(@types/react@18.3.12)(react@19.0.0): dependencies: get-nonce: 1.0.1 - react: 19.2.3 + react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 - - react-use-measure@2.1.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3): - dependencies: - react: 19.2.3 - optionalDependencies: - react-dom: 19.2.3(react@19.2.3) + '@types/react': 18.3.12 - react@19.2.3: {} + react@19.0.0: {} read-package-up@11.0.0: dependencies: @@ -16199,12 +16138,25 @@ snapshots: read-pkg: 9.0.1 type-fest: 4.41.0 + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.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 @@ -16255,19 +16207,30 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 - reflect.getprototypeof@1.0.10: + reflect.getprototypeof@1.0.5: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.22.5 es-errors: 1.3.0 - es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + + regenerate-unicode-properties@10.1.1: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} regenerator-runtime@0.14.1: {} + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.24.5 + + regexp-tree@0.1.27: {} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 @@ -16275,93 +16238,45 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.1 - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - - rehype-autolink-headings@7.1.0: - dependencies: - '@types/hast': 3.0.4 - '@ungap/structured-clone': 1.2.0 - hast-util-heading-rank: 3.0.0 - hast-util-is-element: 3.0.0 - unified: 11.0.5 - unist-util-visit: 5.0.0 - - rehype-callouts@2.1.2: - dependencies: - '@types/hast': 3.0.4 - hast-util-from-html: 2.0.3 - hast-util-is-element: 3.0.0 - hastscript: 9.0.1 - unist-util-visit: 5.0.0 - - rehype-parse@9.0.1: - dependencies: - '@types/hast': 3.0.4 - hast-util-from-html: 2.0.3 - unified: 11.0.5 - - rehype-raw@7.0.0: + regexpu-core@5.3.2: dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.1.0 - vfile: 6.0.3 + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 - rehype-slug@6.0.0: + regjsparser@0.10.0: dependencies: - '@types/hast': 3.0.4 - github-slugger: 2.0.0 - hast-util-heading-rank: 3.0.0 - hast-util-to-string: 3.0.1 - unist-util-visit: 5.0.0 + jsesc: 0.5.0 - rehype-stringify@10.0.1: + regjsparser@0.9.1: dependencies: - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - unified: 11.0.5 + jsesc: 0.5.0 - remark-gfm@4.0.1: + remark-parse@9.0.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-gfm: 3.1.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.5 + mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - remark-parse@11.0.0: + remark-rehype@8.1.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.2 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color + mdast-util-to-hast: 10.2.0 - remark-rehype@11.1.2: + remeda@2.26.1: dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.2.1 - unified: 11.0.5 - vfile: 6.0.3 + type-fest: 4.41.0 - remark-stringify@11.0.0: + remix-utils@8.5.0(@oslojs/crypto@1.0.1)(@oslojs/encoding@1.1.0)(react@19.0.0)(zod@4.0.17): dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.2 - unified: 11.0.5 - - remove-accents@0.5.0: {} + type-fest: 4.41.0 + optionalDependencies: + '@oslojs/crypto': 1.0.1 + '@oslojs/encoding': 1.1.0 + react: 19.0.0 + zod: 4.0.17 remove-markdown@0.5.0: {} @@ -16371,21 +16286,8 @@ snapshots: require-from-string@2.0.2: {} - require-in-the-middle@8.0.1: - dependencies: - debug: 4.4.3 - module-details-from-path: 1.0.4 - transitivePeerDependencies: - - supports-color - require-package-name@2.0.1: {} - requires-port@1.0.0: {} - - resend@6.6.0: - dependencies: - svix: 1.76.1 - resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -16398,13 +16300,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.11: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - optional: true - resolve@2.0.0-next.5: dependencies: is-core-module: 2.16.1 @@ -16415,46 +16310,43 @@ snapshots: reusify@1.0.4: {} - rimraf@2.6.3: - dependencies: - glob: 13.0.0 - - rimraf@6.1.2: + rimraf@3.0.2: dependencies: - glob: 13.0.0 - package-json-from-dist: 1.0.1 + glob: 7.2.3 robust-predicates@3.0.2: {} - rollup@4.53.3: + rollup@4.52.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.3 - '@rollup/rollup-android-arm64': 4.53.3 - '@rollup/rollup-darwin-arm64': 4.53.3 - '@rollup/rollup-darwin-x64': 4.53.3 - '@rollup/rollup-freebsd-arm64': 4.53.3 - '@rollup/rollup-freebsd-x64': 4.53.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 - '@rollup/rollup-linux-arm-musleabihf': 4.53.3 - '@rollup/rollup-linux-arm64-gnu': 4.53.3 - '@rollup/rollup-linux-arm64-musl': 4.53.3 - '@rollup/rollup-linux-loong64-gnu': 4.53.3 - '@rollup/rollup-linux-ppc64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-musl': 4.53.3 - '@rollup/rollup-linux-s390x-gnu': 4.53.3 - '@rollup/rollup-linux-x64-gnu': 4.53.3 - '@rollup/rollup-linux-x64-musl': 4.53.3 - '@rollup/rollup-openharmony-arm64': 4.53.3 - '@rollup/rollup-win32-arm64-msvc': 4.53.3 - '@rollup/rollup-win32-ia32-msvc': 4.53.3 - '@rollup/rollup-win32-x64-gnu': 4.53.3 - '@rollup/rollup-win32-x64-msvc': 4.53.3 + '@rollup/rollup-android-arm-eabi': 4.52.2 + '@rollup/rollup-android-arm64': 4.52.2 + '@rollup/rollup-darwin-arm64': 4.52.2 + '@rollup/rollup-darwin-x64': 4.52.2 + '@rollup/rollup-freebsd-arm64': 4.52.2 + '@rollup/rollup-freebsd-x64': 4.52.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.2 + '@rollup/rollup-linux-arm-musleabihf': 4.52.2 + '@rollup/rollup-linux-arm64-gnu': 4.52.2 + '@rollup/rollup-linux-arm64-musl': 4.52.2 + '@rollup/rollup-linux-loong64-gnu': 4.52.2 + '@rollup/rollup-linux-ppc64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-gnu': 4.52.2 + '@rollup/rollup-linux-riscv64-musl': 4.52.2 + '@rollup/rollup-linux-s390x-gnu': 4.52.2 + '@rollup/rollup-linux-x64-gnu': 4.52.2 + '@rollup/rollup-linux-x64-musl': 4.52.2 + '@rollup/rollup-openharmony-arm64': 4.52.2 + '@rollup/rollup-win32-arm64-msvc': 4.52.2 + '@rollup/rollup-win32-ia32-msvc': 4.52.2 + '@rollup/rollup-win32-x64-gnu': 4.52.2 + '@rollup/rollup-win32-x64-msvc': 4.52.2 fsevents: 2.3.3 - rou3@0.7.12: {} + rou3@0.5.1: {} + + rou3@0.7.5: {} roughjs@4.6.6: dependencies: @@ -16463,16 +16355,6 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 - router@2.2.0: - dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.3.0 - transitivePeerDependencies: - - supports-color - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -16486,42 +16368,23 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - 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: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} sax@1.4.1: {} - scheduler@0.27.0: {} + scheduler@0.25.0: {} search-insights@2.17.3: {} @@ -16536,42 +16399,19 @@ snapshots: semver@7.7.2: {} - semver@7.7.3: {} - - send@1.2.1: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.1 - mime-types: 3.0.2 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - seroval-plugins@1.5.0(seroval@1.5.0): + seroval-plugins@1.3.3(seroval@1.3.2): dependencies: - seroval: 1.5.0 + seroval: 1.3.2 - seroval@1.5.0: {} + seroval@1.3.2: {} - serve-static@2.2.1: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1 - transitivePeerDependencies: - - supports-color + server-only@0.0.1: {} + + set-cookie-parser@2.7.1: {} set-function-length@1.2.2: dependencies: @@ -16588,28 +16428,19 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: + set-getter@0.1.1: dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 + to-object-path: 0.3.0 - set-proto@1.0.0: + shallow-clone@3.0.1: dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - - setimmediate@1.0.5: {} - - setprototypeof@1.2.0: {} + kind-of: 6.0.3 sharp@0.34.4: dependencies: '@img/colour': 1.0.0 detect-libc: 2.1.2 - semver: 7.7.3 + semver: 7.7.2 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.4 '@img/sharp-darwin-x64': 0.34.4 @@ -16683,22 +16514,15 @@ snapshots: signal-exit@4.1.0: {} + slash@3.0.0: {} + slashes@3.0.12: {} - source-map-explorer@2.5.3: + solid-js@1.9.9: dependencies: - btoa: 1.2.1 - chalk: 4.1.2 - convert-source-map: 1.9.0 - ejs: 3.1.10 - escape-html: 1.0.3 - glob: 10.5.0 - gzip-size: 6.0.0 - lodash: 4.17.21 - open: 7.4.2 - source-map: 0.7.6 - temp: 0.9.4 - yargs: 16.2.0 + csstype: 3.1.3 + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) source-map-js@1.2.1: {} @@ -16711,7 +16535,7 @@ snapshots: source-map@0.7.6: {} - space-separated-tokens@2.0.2: {} + space-separated-tokens@1.1.5: {} spdx-correct@3.2.0: dependencies: @@ -16729,27 +16553,22 @@ snapshots: sprintf-js@1.0.3: {} - sqids@0.3.0: {} + srvx@0.8.7: + dependencies: + cookie-es: 2.0.0 - srvx@0.10.1: {} + sse.js@2.5.0: {} stack-trace@0.0.10: {} - stats-gl@2.4.2(@types/three@0.182.0)(three@0.182.0): + standardwebhooks@1.0.0: dependencies: - '@types/three': 0.182.0 - three: 0.182.0 - - stats.js@0.17.0: {} - - statuses@2.0.2: {} + '@stablelib/base64': 1.0.1 + fast-sha256: 1.3.0 std-env@3.9.0: {} - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 + stream-slice@0.1.2: {} streamx@2.23.0: dependencies: @@ -16759,6 +16578,8 @@ snapshots: transitivePeerDependencies: - react-native-b4a + string-natural-compare@3.0.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -16771,26 +16592,16 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.2 - string.prototype.includes@2.0.1: + string.prototype.matchall@4.0.10: dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-abstract: 1.22.5 get-intrinsic: 1.3.0 - gopd: 1.2.0 has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.1 side-channel: 1.1.0 string.prototype.padend@3.1.5: @@ -16799,21 +16610,6 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.5 - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - string.prototype.trim@1.2.8: dependencies: call-bind: 1.0.7 @@ -16826,25 +16622,12 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.5 - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -16853,11 +16636,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -16872,7 +16650,9 @@ snapshots: strip-final-newline@3.0.0: {} - strip-final-newline@4.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 strip-json-comments@3.1.1: {} @@ -16880,6 +16660,10 @@ snapshots: dependencies: style-to-object: 1.0.6 + style-to-object@0.3.0: + dependencies: + inline-style-parser: 0.1.1 + style-to-object@1.0.6: dependencies: inline-style-parser: 0.2.3 @@ -16896,10 +16680,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - suspend-react@0.1.3(react@19.2.3): - dependencies: - react: 19.2.3 - svgo@4.0.0: dependencies: commander: 11.1.0 @@ -16910,14 +16690,11 @@ snapshots: picocolors: 1.1.1 sax: 1.4.1 - svix@1.76.1: + swr@2.3.4(react@19.0.0): dependencies: - '@stablelib/base64': 1.0.1 - '@types/node': 22.19.3 - es6-promise: 4.2.8 - fast-sha256: 1.3.0 - url-parse: 1.5.10 - uuid: 10.0.0 + dequal: 2.0.3 + react: 19.0.0 + use-sync-external-store: 1.5.0(react@19.0.0) system-architecture@0.1.0: {} @@ -16925,22 +16702,16 @@ snapshots: tailwind-merge@1.14.0: {} - tailwindcss-animate@1.0.7(tailwindcss@4.1.11): - dependencies: - tailwindcss: 4.1.11 - tailwindcss@4.1.11: {} tapable@2.2.2: {} - tar-stream@3.1.8: + tar-stream@3.1.7: dependencies: b4a: 1.7.3 - bare-fs: 4.5.5 fast-fifo: 1.3.2 streamx: 2.23.0 transitivePeerDependencies: - - bare-buffer - react-native-b4a tar@7.4.3: @@ -16952,21 +16723,10 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - teex@1.0.1: - dependencies: - streamx: 2.23.0 - transitivePeerDependencies: - - react-native-b4a - - temp@0.9.4: - dependencies: - mkdirp: 0.5.6 - rimraf: 2.6.3 - terser@5.44.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 optional: true @@ -16979,25 +16739,9 @@ snapshots: text-hex@1.0.0: {} - thingies@2.5.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - three-mesh-bvh@0.8.3(three@0.182.0): - dependencies: - three: 0.182.0 + text-table@0.2.0: {} - three-stdlib@2.36.1(three@0.182.0): - dependencies: - '@types/draco3d': 1.4.10 - '@types/offscreencanvas': 2019.7.3 - '@types/webxr': 0.5.24 - draco3d: 1.5.7 - fflate: 0.6.10 - potpack: 1.0.2 - three: 0.182.0 - - three@0.182.0: {} + through@2.3.8: {} tiny-invariant@1.3.3: {} @@ -17021,11 +16765,15 @@ snapshots: tmp@0.2.5: {} + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} + toad-cache@3.7.0: {} toml@3.0.0: {} @@ -17033,29 +16781,13 @@ snapshots: tr46@0.0.3: {} - tree-dump@1.1.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - trim-lines@3.0.1: {} - triple-beam@1.4.1: {} - troika-three-text@0.52.4(three@0.182.0): - dependencies: - bidi-js: 1.0.3 - three: 0.182.0 - troika-three-utils: 0.52.4(three@0.182.0) - troika-worker-utils: 0.52.0 - webgl-sdf-generator: 1.1.1 + trough@1.0.5: {} - troika-three-utils@0.52.4(three@0.182.0): + ts-api-utils@1.3.0(typescript@5.9.2): dependencies: - three: 0.182.0 - - troika-worker-utils@0.52.0: {} - - trough@2.2.0: {} + typescript: 5.9.2 ts-api-utils@2.1.0(typescript@5.9.2): dependencies: @@ -17067,34 +16799,40 @@ snapshots: optionalDependencies: typescript: 5.9.2 + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + tslib@2.8.1: {} - tsx@4.21.0: + tsutils@3.21.0(typescript@5.9.2): + dependencies: + tslib: 1.14.1 + typescript: 5.9.2 + + tsx@4.20.5: dependencies: - esbuild: 0.27.0 + esbuild: 0.25.10 get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 - tunnel-rat@0.1.2(@types/react@19.2.10)(react@19.2.3): - dependencies: - zustand: 4.5.2(@types/react@19.2.10)(react@19.2.3) - transitivePeerDependencies: - - '@types/react' - - immer - - react - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-fest@4.41.0: {} + type-fest@0.20.2: {} - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.1 + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@4.41.0: {} typed-array-buffer@1.0.2: dependencies: @@ -17102,12 +16840,6 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.13 - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -17116,14 +16848,6 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 @@ -17133,16 +16857,6 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.5: dependencies: call-bind: 1.0.7 @@ -17152,28 +16866,10 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.10 - - typescript-eslint@8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2): - dependencies: - '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2))(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2) - eslint: 9.39.1(jiti@2.6.0) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - typescript@5.9.2: {} + uc.micro@2.1.0: {} + ufo@1.6.1: {} ulid@3.0.1: {} @@ -17185,65 +16881,74 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.0.2 - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.0.2 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - uncrypto@0.1.3: {} - undici-types@6.21.0: {} - undici-types@7.10.0: {} undici@7.14.0: {} - unicorn-magic@0.1.0: {} + unicode-canonical-property-names-ecmascript@2.0.0: {} - unicorn-magic@0.3.0: {} + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.1.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unicorn-magic@0.1.0: {} - unified@11.0.5: + unified@9.2.2: dependencies: - '@types/unist': 3.0.3 - bail: 2.0.2 - devlop: 1.1.0 + '@types/unist': 2.0.10 + bail: 1.0.5 extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 6.0.3 + is-buffer: 2.0.5 + is-plain-obj: 2.1.0 + trough: 1.0.5 + vfile: 4.2.1 - unist-util-is@6.0.1: - dependencies: - '@types/unist': 3.0.3 + unist-builder@2.0.3: {} - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 + unist-util-generated@1.1.6: {} + + unist-util-is@4.1.0: {} - unist-util-stringify-position@4.0.0: + unist-util-position@3.1.0: {} + + unist-util-stringify-position@2.0.3: dependencies: - '@types/unist': 3.0.3 + '@types/unist': 2.0.10 - unist-util-visit-parents@6.0.2: + unist-util-visit-parents@3.1.1: dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 - unist-util-visit@5.0.0: + unist-util-visit@2.0.3: dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + + universal-github-app-jwt@2.2.2: {} universal-user-agent@6.0.0: {} + universal-user-agent@7.0.3: {} + unixify@1.0.0: dependencies: normalize-path: 2.1.1 - unpipe@1.0.0: {} + unplugin@1.0.1: + dependencies: + acorn: 8.15.0 + chokidar: 3.6.0 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 unplugin@2.3.10: dependencies: @@ -17252,7 +16957,7 @@ snapshots: picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 - unstorage@1.17.1(@netlify/blobs@10.0.11)(uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11)): + unstorage@1.17.1(@netlify/blobs@10.0.11): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -17264,7 +16969,6 @@ snapshots: ufo: 1.6.1 optionalDependencies: '@netlify/blobs': 10.0.11 - uploadthing: 7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11) untun@0.1.3: dependencies: @@ -17278,74 +16982,51 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uploadthing@7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11): - dependencies: - '@effect/platform': 0.90.3(effect@3.17.7) - '@standard-schema/spec': 1.0.0-beta.4 - '@uploadthing/mime-types': 0.3.6 - '@uploadthing/shared': 7.1.10 - effect: 3.17.7 - optionalDependencies: - express: 5.2.1 - h3: 1.15.4 - tailwindcss: 4.1.11 - uqr@0.1.2: {} uri-js@4.4.1: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - urlpattern-polyfill@10.1.0: {} urlpattern-polyfill@8.0.2: {} - use-callback-ref@1.3.3(@types/react@19.2.10)(react@19.2.3): + use-callback-ref@1.3.3(@types/react@18.3.12)(react@19.0.0): dependencies: - react: 19.2.3 + react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 - - use-isomorphic-layout-effect@1.2.1(@types/react@19.2.10)(react@19.2.3): - dependencies: - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - use-sidecar@1.1.3(@types/react@19.2.10)(react@19.2.3): + use-sidecar@1.1.3(@types/react@18.3.12)(react@19.0.0): dependencies: detect-node-es: 1.1.0 - react: 19.2.3 + react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.10 + '@types/react': 18.3.12 - use-sync-external-store@1.2.0(react@19.2.3): + use-sync-external-store@1.2.0(react@19.0.0): dependencies: - react: 19.2.3 + react: 19.0.0 - use-sync-external-store@1.6.0(react@19.2.3): + use-sync-external-store@1.5.0(react@19.0.0): dependencies: - react: 19.2.3 + react: 19.0.0 util-deprecate@1.0.2: {} - utility-types@3.11.0: {} - - uuid@10.0.0: {} + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 uuid@11.1.0: {} - valibot@1.2.0(typescript@5.9.2): - optionalDependencies: - typescript: 5.9.2 - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -17353,43 +17034,38 @@ snapshots: validate-npm-package-name@5.0.1: {} - vary@1.1.2: {} - - vfile-location@5.0.3: + vfile-message@2.0.4: dependencies: - '@types/unist': 3.0.3 - vfile: 6.0.3 + '@types/unist': 2.0.10 + unist-util-stringify-position: 2.0.3 - vfile-message@4.0.3: + vfile@4.2.1: dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.3 + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 2.0.3 + vfile-message: 2.0.4 vite-bundle-analyzer@1.2.1: {} - vite-tsconfig-paths@5.0.1(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-tsconfig-paths@5.0.1(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)): dependencies: - debug: 4.4.3 + debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.9.2) optionalDependencies: - vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.3 + rollup: 4.52.2 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.3.0 @@ -17397,12 +17073,12 @@ snapshots: jiti: 2.6.0 lightningcss: 1.30.1 terser: 5.44.0 - tsx: 4.21.0 + tsx: 4.20.5 yaml: 2.8.1 - vitefu@1.1.1(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)): optionalDependencies: - vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) vscode-jsonrpc@8.2.0: {} @@ -17421,15 +17097,19 @@ snapshots: vscode-uri@3.0.8: {} - web-namespaces@2.0.1: {} + web-encoding@1.1.5: + dependencies: + util: 0.12.5 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 web-streams-polyfill@3.3.3: {} - webgl-constants@1.1.1: {} + webidl-conversions@3.0.1: {} - webgl-sdf-generator@1.1.1: {} + webpack-sources@3.2.3: {} - webidl-conversions@3.0.1: {} + webpack-virtual-modules@0.5.0: {} webpack-virtual-modules@0.6.2: {} @@ -17452,29 +17132,20 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 - which-boxed-primitive@1.1.1: + which-builtin-type@1.1.3: dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 + function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 is-async-function: 2.0.0 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 is-generator-function: 1.0.10 - is-regex: 1.2.1 - is-weakref: 1.1.1 + is-regex: 1.1.4 + is-weakref: 1.0.2 isarray: 2.0.5 - which-boxed-primitive: 1.1.1 + which-boxed-primitive: 1.0.2 which-collection: 1.0.2 - which-typed-array: 1.1.19 + which-typed-array: 1.1.15 which-collection@1.0.2: dependencies: @@ -17491,16 +17162,6 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - which@1.3.1: dependencies: isexe: 2.0.0 @@ -17548,20 +17209,18 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - xmlbuilder2@4.0.3: + xmlbuilder2@3.1.1: dependencies: - '@oozcitak/dom': 2.0.2 - '@oozcitak/infra': 2.0.2 - '@oozcitak/util': 10.0.0 - js-yaml: 3.14.2 + '@oozcitak/dom': 1.15.10 + '@oozcitak/infra': 1.0.8 + '@oozcitak/util': 8.3.8 + js-yaml: 3.14.1 xss@1.0.15: dependencies: commander: 2.20.3 cssfilter: 0.0.10 - xstate@5.25.0: {} - xtend@4.0.2: {} y18n@5.0.8: {} @@ -17570,25 +17229,12 @@ snapshots: yallist@5.0.0: {} - yaml@1.10.2: - optional: true + yaml@1.10.2: {} yaml@2.8.1: {} - yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -17608,37 +17254,21 @@ snapshots: yocto-queue@1.2.1: {} - yoctocolors@2.1.2: {} - zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 compress-commons: 6.0.2 readable-stream: 4.7.0 - zod-to-json-schema@3.25.1(zod@4.3.5): - dependencies: - zod: 4.3.5 - - zod-validation-error@4.0.2(zod@4.3.5): - dependencies: - zod: 4.3.5 - zod@3.25.76: {} - zod@4.3.5: {} + zod@4.0.17: {} - zustand@4.5.2(@types/react@19.2.10)(react@19.2.3): - dependencies: - use-sync-external-store: 1.2.0(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.10 - react: 19.2.3 + zod@4.1.9: {} - zustand@5.0.9(@types/react@19.2.10)(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3)): + zustand@4.5.2(@types/react@18.3.12)(react@19.0.0): + dependencies: + use-sync-external-store: 1.2.0(react@19.0.0) optionalDependencies: - '@types/react': 19.2.10 - react: 19.2.3 - use-sync-external-store: 1.6.0(react@19.2.3) - - zwitch@2.0.4: {} + '@types/react': 18.3.12 + react: 19.0.0 diff --git a/public/Algolia-logo-blue.svg b/public/Algolia-logo-blue.svg deleted file mode 100644 index 44e9942d1..000000000 --- a/public/Algolia-logo-blue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/Algolia-logo-white.svg b/public/Algolia-logo-white.svg deleted file mode 100644 index f2cb9d3c5..000000000 --- a/public/Algolia-logo-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/_headers b/public/_headers deleted file mode 100644 index 66f2a0769..000000000 --- a/public/_headers +++ /dev/null @@ -1,5 +0,0 @@ -# WebContainer requires these headers for SharedArrayBuffer support -# Only apply to /builder route to avoid affecting other pages -/builder - Cross-Origin-Opener-Policy: same-origin - Cross-Origin-Embedder-Policy: require-corp diff --git a/public/blog-assets/composite-components/header.jpg b/public/blog-assets/composite-components/header.jpg deleted file mode 100644 index 316bd94b7..000000000 Binary files a/public/blog-assets/composite-components/header.jpg and /dev/null differ diff --git a/public/blog-assets/directives-and-the-platform-boundary/header.png b/public/blog-assets/directives-and-the-platform-boundary/header.png deleted file mode 100644 index e7d314f25..000000000 Binary files a/public/blog-assets/directives-and-the-platform-boundary/header.png and /dev/null differ diff --git a/public/blog-assets/from-docs-to-agents/diagram-discovery.svg b/public/blog-assets/from-docs-to-agents/diagram-discovery.svg deleted file mode 100644 index c74c331de..000000000 --- a/public/blog-assets/from-docs-to-agents/diagram-discovery.svg +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - npx intent install — DEPENDENCY GRAPH DISCOVERY - - - node_modules/ - - - - react - no skills - - - - - @tanstack/router - - - - tailwindcss - no skills - - - - - @tanstack/query - - - - zod - no skills - - - - - @tanstack/table - - - - typescript - no skills - - - - - - - - - intent install - discovers + wires - - - - - - - AGENT CONFIG - - - CLAUDE.md - - - .cursorrules - - - .windsurfrules - - Router skills ✓ - Query skills ✓ - Table skills ✓ - - - - intent-enabled package - - standard package (skipped) - diff --git a/public/blog-assets/from-docs-to-agents/diagram-lifecycle.svg b/public/blog-assets/from-docs-to-agents/diagram-lifecycle.svg deleted file mode 100644 index 83769c5b8..000000000 --- a/public/blog-assets/from-docs-to-agents/diagram-lifecycle.svg +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - THE @TANSTACK/INTENT LIFECYCLE - - - - YOUR DOCS - guides/ - migration/ - source of truth - - - - - - - CLI - intent scaffold - guided generation - + intent validate - - - - - - - NPM PACKAGE - skills/ - SKILL.md - versioned with code - - - - - - - CONSUMER PROJECT - npm install / update - intent install - auto-wires agent config - - - - - STALENESS - intent stale - CI catches drift - - - - - docs change? - - - - update skill - - - - FEEDBACK - intent feedback - structured reports - - - - - issue? - - - - - - - npm update = latest code + latest knowledge - Skills travel with the tool, not the model's training cutoff - diff --git a/public/blog-assets/from-docs-to-agents/diagram-split-brain.svg b/public/blog-assets/from-docs-to-agents/diagram-split-brain.svg deleted file mode 100644 index afd854ab5..000000000 --- a/public/blog-assets/from-docs-to-agents/diagram-split-brain.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - THE VERSION SPLIT-BRAIN PROBLEM - - - - MODEL TRAINING DATA - - - - useQuery({ queryKey, queryFn }) - - v5 - - - useQuery(queryKey, queryFn) - - v4 - - - createFileRoute('/posts') - - v1 - - - new Route({ path: '/posts' }) - - pre-v1 - - - No mechanism to know which applies to your project - - - vs - - - - INTENT SKILLS - - - - @tanstack/query-intent@5.62.0 - Pinned to your installed version - - - @tanstack/router-intent@1.95.0 - Pinned to your installed version - - - npm update = latest skills - Knowledge always matches code - - Versioned, maintained, unambiguous - diff --git a/public/blog-assets/from-docs-to-agents/diagram-status-quo.svg b/public/blog-assets/from-docs-to-agents/diagram-status-quo.svg deleted file mode 100644 index 887e4dc2f..000000000 --- a/public/blog-assets/from-docs-to-agents/diagram-status-quo.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - THE STATUS QUO - - - - - GITHUB REPO - awesome-cursorrules - Last updated: 4 months ago - - - - DISCORD MESSAGE - tanstack-router.md - Author: random_dev_42 - - - - GIST - query-v4-rules.md - ⚠ Written for v4, not v5 - - - - BLOG POST - table-tips.md - Author: unknown - - - - - - - - - - copy + paste - - - copy + paste - - - - YOUR PROJECT - .cursorrules / CLAUDE.md - Mixed versions · No update mechanism - No way to detect staleness - - - - No versioning - Which version is this for? - - - No updates - Silently goes stale - - - No ownership - Who maintains this? - - - No composition - Skills don't know each other - diff --git a/public/blog-assets/from-docs-to-agents/header.png b/public/blog-assets/from-docs-to-agents/header.png deleted file mode 100644 index bf1e74c3b..000000000 Binary files a/public/blog-assets/from-docs-to-agents/header.png and /dev/null differ diff --git a/public/blog-assets/generation-hooks/header.png b/public/blog-assets/generation-hooks/header.png deleted file mode 100644 index 29f2c9299..000000000 Binary files a/public/blog-assets/generation-hooks/header.png and /dev/null differ diff --git a/public/blog-assets/openrouter-partnership/header.png b/public/blog-assets/openrouter-partnership/header.png deleted file mode 100644 index 7953e6c9c..000000000 Binary files a/public/blog-assets/openrouter-partnership/header.png and /dev/null differ diff --git a/public/blog-assets/tanstack-2-years/tanstack-2-years-header.jpg b/public/blog-assets/tanstack-2-years/tanstack-2-years-header.jpg deleted file mode 100644 index 89597f620..000000000 Binary files a/public/blog-assets/tanstack-2-years/tanstack-2-years-header.jpg and /dev/null differ diff --git a/public/blog-assets/tanstack-ai-alpha-2/header.jpeg b/public/blog-assets/tanstack-ai-alpha-2/header.jpeg deleted file mode 100644 index d88234067..000000000 Binary files a/public/blog-assets/tanstack-ai-alpha-2/header.jpeg and /dev/null differ diff --git a/public/blog-assets/tanstack-ai-alpha-your-ai-your-way/header.jpg b/public/blog-assets/tanstack-ai-alpha-your-ai-your-way/header.jpg deleted file mode 100644 index 1753fb653..000000000 Binary files a/public/blog-assets/tanstack-ai-alpha-your-ai-your-way/header.jpg and /dev/null differ diff --git a/public/blog-assets/tanstack-ai-lazy-tool-discovery/header.webp b/public/blog-assets/tanstack-ai-lazy-tool-discovery/header.webp deleted file mode 100644 index 34ed068ad..000000000 Binary files a/public/blog-assets/tanstack-ai-lazy-tool-discovery/header.webp and /dev/null differ diff --git a/public/blog-assets/tanstack-ai-middleware/header.webp b/public/blog-assets/tanstack-ai-middleware/header.webp deleted file mode 100644 index 163b24172..000000000 Binary files a/public/blog-assets/tanstack-ai-middleware/header.webp and /dev/null differ diff --git a/public/blog-assets/tanstack-ai-realtime-voice-chat/header.webp b/public/blog-assets/tanstack-ai-realtime-voice-chat/header.webp deleted file mode 100644 index b0e0db9b0..000000000 Binary files a/public/blog-assets/tanstack-ai-realtime-voice-chat/header.webp and /dev/null differ diff --git a/public/blog-assets/tanstack-ai-the-ai-function-postmortem/header.jpg b/public/blog-assets/tanstack-ai-the-ai-function-postmortem/header.jpg deleted file mode 100644 index 9d0a02f81..000000000 Binary files a/public/blog-assets/tanstack-ai-the-ai-function-postmortem/header.jpg and /dev/null differ diff --git a/public/blog-assets/tanstack-ai-why-we-split-the-adapters/header.jpeg b/public/blog-assets/tanstack-ai-why-we-split-the-adapters/header.jpeg deleted file mode 100644 index d21ad6a90..000000000 Binary files a/public/blog-assets/tanstack-ai-why-we-split-the-adapters/header.jpeg and /dev/null differ diff --git a/public/blog-assets/tanstack-db-0.5-query-driven-sync/header.png b/public/blog-assets/tanstack-db-0.5-query-driven-sync/header.png deleted file mode 100644 index 8e5d6fce0..000000000 Binary files a/public/blog-assets/tanstack-db-0.5-query-driven-sync/header.png and /dev/null differ diff --git a/public/blog-assets/tanstack-router-route-matching-tree-rewrite/buildlocation-evolution-benchmark.png b/public/blog-assets/tanstack-router-route-matching-tree-rewrite/buildlocation-evolution-benchmark.png deleted file mode 100644 index 7179240e4..000000000 Binary files a/public/blog-assets/tanstack-router-route-matching-tree-rewrite/buildlocation-evolution-benchmark.png and /dev/null differ diff --git a/public/blog-assets/tanstack-router-route-matching-tree-rewrite/header.png b/public/blog-assets/tanstack-router-route-matching-tree-rewrite/header.png deleted file mode 100644 index 168492dbe..000000000 Binary files a/public/blog-assets/tanstack-router-route-matching-tree-rewrite/header.png and /dev/null differ diff --git a/public/blog-assets/tanstack-router-route-matching-tree-rewrite/lru-benchmark.png b/public/blog-assets/tanstack-router-route-matching-tree-rewrite/lru-benchmark.png deleted file mode 100644 index 6a391bb4c..000000000 Binary files a/public/blog-assets/tanstack-router-route-matching-tree-rewrite/lru-benchmark.png and /dev/null differ diff --git a/public/blog-assets/tanstack-router-route-matching-tree-rewrite/matching-evolution-benchmark.png b/public/blog-assets/tanstack-router-route-matching-tree-rewrite/matching-evolution-benchmark.png deleted file mode 100644 index ee637614f..000000000 Binary files a/public/blog-assets/tanstack-router-route-matching-tree-rewrite/matching-evolution-benchmark.png and /dev/null differ diff --git a/public/fonts/Inter.woff2 b/public/fonts/Inter.woff2 deleted file mode 100644 index 5a8d3e72a..000000000 Binary files a/public/fonts/Inter.woff2 and /dev/null differ diff --git a/public/fonts/inter-v19-latin-100.woff2 b/public/fonts/inter-v19-latin-100.woff2 new file mode 100644 index 000000000..fbcfb9e55 Binary files /dev/null and b/public/fonts/inter-v19-latin-100.woff2 differ diff --git a/public/fonts/inter-v19-latin-100italic.woff2 b/public/fonts/inter-v19-latin-100italic.woff2 new file mode 100644 index 000000000..8427f1109 Binary files /dev/null and b/public/fonts/inter-v19-latin-100italic.woff2 differ diff --git a/public/fonts/inter-v19-latin-200.woff2 b/public/fonts/inter-v19-latin-200.woff2 new file mode 100644 index 000000000..37267dfe2 Binary files /dev/null and b/public/fonts/inter-v19-latin-200.woff2 differ diff --git a/public/fonts/inter-v19-latin-200italic.woff2 b/public/fonts/inter-v19-latin-200italic.woff2 new file mode 100644 index 000000000..cb15f8db2 Binary files /dev/null and b/public/fonts/inter-v19-latin-200italic.woff2 differ diff --git a/public/fonts/inter-v19-latin-300.woff2 b/public/fonts/inter-v19-latin-300.woff2 new file mode 100644 index 000000000..ece952cf7 Binary files /dev/null and b/public/fonts/inter-v19-latin-300.woff2 differ diff --git a/public/fonts/inter-v19-latin-300italic.woff2 b/public/fonts/inter-v19-latin-300italic.woff2 new file mode 100644 index 000000000..dd92d3b0b Binary files /dev/null and b/public/fonts/inter-v19-latin-300italic.woff2 differ diff --git a/public/fonts/inter-v19-latin-500.woff2 b/public/fonts/inter-v19-latin-500.woff2 new file mode 100644 index 000000000..54f0a595d Binary files /dev/null and b/public/fonts/inter-v19-latin-500.woff2 differ diff --git a/public/fonts/inter-v19-latin-500italic.woff2 b/public/fonts/inter-v19-latin-500italic.woff2 new file mode 100644 index 000000000..f4f25da53 Binary files /dev/null and b/public/fonts/inter-v19-latin-500italic.woff2 differ diff --git a/public/fonts/inter-v19-latin-600.woff2 b/public/fonts/inter-v19-latin-600.woff2 new file mode 100644 index 000000000..d1897949f Binary files /dev/null and b/public/fonts/inter-v19-latin-600.woff2 differ diff --git a/public/fonts/inter-v19-latin-600italic.woff2 b/public/fonts/inter-v19-latin-600italic.woff2 new file mode 100644 index 000000000..e882c7825 Binary files /dev/null and b/public/fonts/inter-v19-latin-600italic.woff2 differ diff --git a/public/fonts/inter-v19-latin-700.woff2 b/public/fonts/inter-v19-latin-700.woff2 new file mode 100644 index 000000000..48fa217dc Binary files /dev/null and b/public/fonts/inter-v19-latin-700.woff2 differ diff --git a/public/fonts/inter-v19-latin-700italic.woff2 b/public/fonts/inter-v19-latin-700italic.woff2 new file mode 100644 index 000000000..b6a7cad16 Binary files /dev/null and b/public/fonts/inter-v19-latin-700italic.woff2 differ diff --git a/public/fonts/inter-v19-latin-800.woff2 b/public/fonts/inter-v19-latin-800.woff2 new file mode 100644 index 000000000..74a16d459 Binary files /dev/null and b/public/fonts/inter-v19-latin-800.woff2 differ diff --git a/public/fonts/inter-v19-latin-800italic.woff2 b/public/fonts/inter-v19-latin-800italic.woff2 new file mode 100644 index 000000000..e98fa7e58 Binary files /dev/null and b/public/fonts/inter-v19-latin-800italic.woff2 differ diff --git a/public/fonts/inter-v19-latin-900.woff2 b/public/fonts/inter-v19-latin-900.woff2 new file mode 100644 index 000000000..4db8333ca Binary files /dev/null and b/public/fonts/inter-v19-latin-900.woff2 differ diff --git a/public/fonts/inter-v19-latin-900italic.woff2 b/public/fonts/inter-v19-latin-900italic.woff2 new file mode 100644 index 000000000..291eafc95 Binary files /dev/null and b/public/fonts/inter-v19-latin-900italic.woff2 differ diff --git a/public/fonts/inter-v19-latin-italic.woff2 b/public/fonts/inter-v19-latin-italic.woff2 new file mode 100644 index 000000000..9e98286ff Binary files /dev/null and b/public/fonts/inter-v19-latin-italic.woff2 differ diff --git a/public/fonts/inter-v19-latin-regular.woff2 b/public/fonts/inter-v19-latin-regular.woff2 new file mode 100644 index 000000000..f15b025d6 Binary files /dev/null and b/public/fonts/inter-v19-latin-regular.woff2 differ diff --git a/public/images/ship.png b/public/images/ship.png deleted file mode 100644 index 1e3188cde..000000000 Binary files a/public/images/ship.png and /dev/null differ diff --git a/public/images/total-support-share.png b/public/images/total-support-share.png deleted file mode 100644 index 857f864c6..000000000 Binary files a/public/images/total-support-share.png and /dev/null differ diff --git a/public/logos/amazon.svg b/public/logos/amazon.svg deleted file mode 100644 index 0dde84436..000000000 --- a/public/logos/amazon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/apple.svg b/public/logos/apple.svg deleted file mode 100644 index 4c7c6cfb9..000000000 --- a/public/logos/apple.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/public/logos/cisco.svg b/public/logos/cisco.svg deleted file mode 100644 index 568be678e..000000000 --- a/public/logos/cisco.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/docusign.svg b/public/logos/docusign.svg deleted file mode 100644 index aac4ba1fc..000000000 --- a/public/logos/docusign.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/google.svg b/public/logos/google.svg deleted file mode 100644 index 519fe653e..000000000 --- a/public/logos/google.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/hp.svg b/public/logos/hp.svg deleted file mode 100644 index 76edb0bb9..000000000 --- a/public/logos/hp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/intuit.svg b/public/logos/intuit.svg deleted file mode 100644 index 23a2827eb..000000000 --- a/public/logos/intuit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/microsoft.svg b/public/logos/microsoft.svg deleted file mode 100644 index 89f62370a..000000000 --- a/public/logos/microsoft.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/nordstrom.svg b/public/logos/nordstrom.svg deleted file mode 100644 index 766d5f06f..000000000 --- a/public/logos/nordstrom.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/salesforce.svg b/public/logos/salesforce.svg deleted file mode 100644 index 2f8d2749f..000000000 --- a/public/logos/salesforce.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/ticketmaster.svg b/public/logos/ticketmaster.svg deleted file mode 100644 index 30283cb11..000000000 --- a/public/logos/ticketmaster.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/uber.svg b/public/logos/uber.svg deleted file mode 100644 index 7ca5b014f..000000000 --- a/public/logos/uber.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/walmart.svg b/public/logos/walmart.svg deleted file mode 100644 index b3755775a..000000000 --- a/public/logos/walmart.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/logos/yahoo.svg b/public/logos/yahoo.svg deleted file mode 100644 index d2a7e2990..000000000 --- a/public/logos/yahoo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/models/Textures/colormap.png b/public/models/Textures/colormap.png deleted file mode 100644 index d070357c2..000000000 Binary files a/public/models/Textures/colormap.png and /dev/null differ diff --git a/public/models/beach-chair.glb b/public/models/beach-chair.glb deleted file mode 100644 index 10f4ac366..000000000 Binary files a/public/models/beach-chair.glb and /dev/null differ diff --git a/public/models/boat.glb b/public/models/boat.glb deleted file mode 100644 index 08282c980..000000000 Binary files a/public/models/boat.glb and /dev/null differ diff --git a/public/models/colormap.png b/public/models/colormap.png deleted file mode 100644 index d070357c2..000000000 Binary files a/public/models/colormap.png and /dev/null differ diff --git a/public/models/palm-tree.glb b/public/models/palm-tree.glb deleted file mode 100644 index 454429375..000000000 Binary files a/public/models/palm-tree.glb and /dev/null differ diff --git a/public/models/palm-trees.glb b/public/models/palm-trees.glb deleted file mode 100644 index d3e903eeb..000000000 Binary files a/public/models/palm-trees.glb and /dev/null differ diff --git a/public/models/rowboat.glb b/public/models/rowboat.glb deleted file mode 100644 index e301aaf2f..000000000 Binary files a/public/models/rowboat.glb and /dev/null differ diff --git a/public/models/sailboat.glb b/public/models/sailboat.glb deleted file mode 100644 index 4401373de..000000000 Binary files a/public/models/sailboat.glb and /dev/null differ diff --git a/public/models/ship.glb b/public/models/ship.glb deleted file mode 100644 index e8e190edf..000000000 Binary files a/public/models/ship.glb and /dev/null differ diff --git a/scripts/auth-login.ts b/scripts/auth-login.ts deleted file mode 100644 index 12ca3bd5a..000000000 --- a/scripts/auth-login.ts +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env tsx -/** - * TanStack CLI Auth Login - * - * Opens a browser for OAuth on tanstack.com, mints a session token, - * and saves it as DEV_SESSION_TOKEN in .env.local for local development. - * - * Usage: - * pnpm auth:login - * pnpm auth:login --url http://localhost:3000 # auth against local server - */ - -import { spawn } from 'child_process' -import { readFileSync, writeFileSync, existsSync } from 'fs' -import { resolve } from 'path' - -// --------------------------------------------------------------------------- -// Config -// --------------------------------------------------------------------------- - -const args = process.argv.slice(2) -const urlFlagIdx = args.indexOf('--url') -const BASE_URL = - urlFlagIdx !== -1 && args[urlFlagIdx + 1] - ? args[urlFlagIdx + 1] - : 'https://tanstack.com' - -const POLL_INTERVAL_MS = 2000 -const TIMEOUT_MS = 5 * 60 * 1000 // 5 minutes -const ENV_FILE = resolve(process.cwd(), '.env.local') -const ENV_KEY = 'DEV_SESSION_TOKEN' - -// --------------------------------------------------------------------------- -// Helpers -// --------------------------------------------------------------------------- - -function openBrowser(url: string) { - const platform = process.platform - const cmd = - platform === 'darwin' ? 'open' : platform === 'win32' ? 'start' : 'xdg-open' - spawn(cmd, [url], { detached: true, stdio: 'ignore' }).unref() -} - -function upsertEnvFile(key: string, value: string) { - let contents = existsSync(ENV_FILE) ? readFileSync(ENV_FILE, 'utf8') : '' - const line = `${key}=${value}` - const pattern = new RegExp(`^${key}=.*$`, 'm') - - if (pattern.test(contents)) { - contents = contents.replace(pattern, line) - } else { - contents = - contents.endsWith('\n') || contents === '' - ? contents + line + '\n' - : contents + '\n' + line + '\n' - } - - writeFileSync(ENV_FILE, contents, 'utf8') -} - -async function fetchJson(url: string, options?: RequestInit): Promise { - const res = await fetch(url, options) - if (!res.ok) { - throw new Error(`HTTP ${res.status} from ${url}`) - } - return res.json() as Promise -} - -// --------------------------------------------------------------------------- -// Main flow -// --------------------------------------------------------------------------- - -async function main() { - console.log(`\nAuthenticating with ${BASE_URL}...\n`) - - // 1. Create a ticket - const { ticketId } = await fetchJson<{ ticketId: string }>( - `${BASE_URL}/api/auth/cli/create-ticket`, - { method: 'POST' }, - ) - - // 2. Open browser - const authUrl = `${BASE_URL}/auth/cli?ticket=${ticketId}` - console.log(`Opening browser to:\n ${authUrl}\n`) - console.log('Waiting for you to complete sign-in...') - openBrowser(authUrl) - - // 3. Poll for authorization - const deadline = Date.now() + TIMEOUT_MS - while (Date.now() < deadline) { - await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS)) - - const result = await fetchJson< - | { authorized: false } - | { authorized: true; sessionToken: string } - | { error: string } - >(`${BASE_URL}/api/auth/cli/status/${ticketId}`).catch(() => null) - - if (!result) continue - - if ('error' in result) { - console.error(`\nError: ${result.error}`) - process.exit(1) - } - - if (result.authorized) { - // 4. Save token - upsertEnvFile(ENV_KEY, result.sessionToken) - console.log(`\nSuccess! Token saved to .env.local as ${ENV_KEY}.`) - console.log('Restart your dev server to pick up the new session.\n') - process.exit(0) - } - } - - console.error('\nTimed out waiting for authorization. Please try again.') - process.exit(1) -} - -main().catch((err) => { - console.error('\nFailed:', err instanceof Error ? err.message : err) - process.exit(1) -}) diff --git a/scripts/link-packages.mjs b/scripts/link-packages.mjs deleted file mode 100644 index 5499124dc..000000000 --- a/scripts/link-packages.mjs +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env node -/** - * Link local packages in parallel for faster dev startup - */ - -import { spawn } from 'node:child_process' - -const packages = [ - '../create-tsrouter-app/packages/cta-engine', - '../create-tsrouter-app/frameworks/react-cra', - '../create-tsrouter-app/frameworks/solid', -] - -async function linkPackage(pkg) { - return new Promise((resolve, reject) => { - const proc = spawn('pnpm', ['link', pkg], { stdio: 'inherit' }) - proc.on('close', (code) => { - if (code === 0) resolve() - else reject(new Error(`Failed to link ${pkg}`)) - }) - proc.on('error', reject) - }) -} - -try { - await Promise.all(packages.map(linkPackage)) -} catch (e) { - console.error(e.message) - process.exit(1) -} diff --git a/scripts/link.js b/scripts/link.js new file mode 100644 index 000000000..b1bc31b9c --- /dev/null +++ b/scripts/link.js @@ -0,0 +1,62 @@ +import { execSync } from 'child_process' +import path from 'path' + +const packages = { + '@tanstack/history': 'router/packages/history', + '@tanstack/react-router': 'router/packages/react-router', + '@tanstack/router-cli': 'router/packages/router-cli', + '@tanstack/router-devtools': 'router/packages/router-devtools', + '@tanstack/router-generator': 'router/packages/router-generator', + '@tanstack/virtual-file-routes': 'router/packages/virtual-file-routes', + '@tanstack/router-plugin': 'router/packages/router-plugin', + '@tanstack/router-vite-plugin': 'router/packages/router-vite-plugin', + '@tanstack/react-router-with-query': + 'router/packages/react-router-with-query', + '@tanstack/zod-adapter': 'router/packages/zod-adapter', + '@tanstack/valibot-adapter': 'router/packages/valibot-adapter', + '@tanstack/arktype-adapter': 'router/packages/arktype-adapter', + '@tanstack/start': 'router/packages/start', + '@tanstack/start-client': 'router/packages/start-client', + '@tanstack/start-server': 'router/packages/start-server', + '@tanstack/start-api-routes': 'router/packages/start-api-routes', + '@tanstack/start-server-functions-fetcher': + 'router/packages/start-server-functions-fetcher', + '@tanstack/start-server-functions-handler': + 'router/packages/start-server-functions-handler', + '@tanstack/start-server-functions-client': + 'router/packages/start-server-functions-client', + '@tanstack/start-server-functions-ssr': + 'router/packages/start-server-functions-ssr', + '@tanstack/start-server-functions-server': + 'router/packages/start-server-functions-server', + '@tanstack/start-router-manifest': 'router/packages/start-router-manifest', + '@tanstack/start-config': 'router/packages/start-config', + '@tanstack/start-plugin': 'router/packages/start-plugin', + '@tanstack/eslint-plugin-router': 'router/packages/eslint-plugin-router', + '@tanstack/server-functions-plugin': + 'router/packages/server-functions-plugin', + '@tanstack/directive-functions-plugin': + 'router/packages/directive-functions-plugin', +} + +const projectDir = process.cwd() +const baseDir = path.resolve(process.cwd(), '..') // Uses the current working directory + +try { + Object.entries(packages).forEach(([packageName, packagePath]) => { + const fullPath = path.join(baseDir, packagePath) + console.log(`Linking ${packageName} from ${fullPath}`) + execSync(`cd "${fullPath}" && pnpm link --global`, { stdio: 'inherit' }) + }) + + console.log(`Linking packages to project at ${projectDir}`) + Object.keys(packages).forEach((packageName) => { + execSync(`cd "${projectDir}" && pnpm link --global ${packageName}`, { + stdio: 'inherit', + }) + }) + + console.log('All packages linked successfully!') +} catch (error) { + console.error('Failed to link packages:', error) +} diff --git a/scripts/mcp-eval/README.md b/scripts/mcp-eval/README.md deleted file mode 100644 index b6536b319..000000000 --- a/scripts/mcp-eval/README.md +++ /dev/null @@ -1,106 +0,0 @@ -# MCP Documentation Discoverability Evaluation - -This tool tests how well AI assistants can find the right TanStack documentation using the MCP server. - -## Why This Exists - -When an AI uses the TanStack MCP to answer questions, it needs to: - -1. Search for relevant docs -2. Find the RIGHT docs (not just related ones) -3. Do so efficiently (fewer searches = better) - -This evaluation suite helps us "train" our docs to be more discoverable by: - -- Identifying search queries that fail to surface important docs -- Finding gaps in doc titles, descriptions, and content -- Measuring improvement over time - -## Running the Tests - -```bash -# Run all tests (requires dev server running on port 3001) -pnpm dev # in another terminal -npx tsx scripts/mcp-eval/run-eval.ts - -# Run a specific test -npx tsx scripts/mcp-eval/run-eval.ts --test router-query-ssr-integration - -# Run tests by tag -npx tsx scripts/mcp-eval/run-eval.ts --tag start -npx tsx scripts/mcp-eval/run-eval.ts --tag query - -# Use a different MCP endpoint -MCP_URL=https://tanstack.com/api/mcp npx tsx scripts/mcp-eval/run-eval.ts - -# Authenticate with an API key (required for production) -MCP_API_KEY=your-api-key MCP_URL=http://localhost:3000/api/mcp npx tsx scripts/mcp-eval/run-eval.ts -``` - -## Test Case Structure - -Each test case in `test-cases.json` includes: - -```json -{ - "id": "unique-id", - "question": "The question an AI might receive", - "difficulty": "easy | medium | hard", - "tags": ["library", "topic"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/data-loading", - "required": true, - "reason": "Why this doc should be found" - } - ], - "idealSearchQueries": ["queries that SHOULD find the doc"], - "badSearchQueries": ["queries that surprisingly DON'T work"], - "correctAnswerMustInclude": ["key terms the answer needs"], - "notes": "Any additional context" -} -``` - -## Scoring - -Each test is scored 0-100: - -- **50%** - Finding required docs -- **30%** - Search efficiency (fewer searches = better) -- **20%** - Doc appearing in top 3 results - -A test passes if: - -- All required docs are found -- Score >= 70 - -## Adding New Tests - -1. Think of a question users/AIs commonly ask -2. Search for it yourself using the MCP tools -3. Document which docs SHOULD be found -4. Add the test case to `test-cases.json` -5. Run the eval to see if it passes -6. If it fails, either: - - Fix the test (wrong expectations) - - Fix the docs (improve discoverability) - -## Improving Doc Discoverability - -When a test fails, consider: - -1. **Doc titles** - Does the title include key search terms? -2. **Doc descriptions** - Is there frontmatter that Algolia indexes? -3. **Cross-references** - Do related docs link to each other? -4. **Canonical terms** - Are you using the terms users search for? - -Example: The "useQuery" search returns API reference, not the guide. -Solution: Either rename the guide or add "useQuery" prominently to it. - -## CI Integration - -```bash -# Exit code is 0 if all tests pass, 1 otherwise -npx tsx scripts/mcp-eval/run-eval.ts || echo "Some tests failed" -``` diff --git a/scripts/mcp-eval/mine-questions.ts b/scripts/mcp-eval/mine-questions.ts deleted file mode 100644 index f478d2409..000000000 --- a/scripts/mcp-eval/mine-questions.ts +++ /dev/null @@ -1,407 +0,0 @@ -/** - * Question Mining Script for MCP Eval Test Cases - * - * This script helps systematically gather real user questions from various sources - * to improve our test coverage. - * - * Sources: - * 1. Stack Overflow - API for tagged questions - * 2. GitHub Issues/Discussions - GraphQL API - * 3. Reddit - API for subreddit search - * - * Usage: - * npx tsx scripts/mcp-eval/mine-questions.ts --source stackoverflow --library query - * npx tsx scripts/mcp-eval/mine-questions.ts --source github --library router - * npx tsx scripts/mcp-eval/mine-questions.ts --all - */ - -const STACK_OVERFLOW_TAGS: Record = { - query: ['tanstackreact-query', 'react-query'], - router: ['tanstack-router'], - table: ['tanstack-table', 'react-table'], - form: ['tanstack-form', 'react-hook-form'], // react-hook-form for comparison - virtual: ['tanstack-virtual', 'react-virtual'], -} - -const GITHUB_REPOS: Record = { - query: 'TanStack/query', - router: 'TanStack/router', - table: 'TanStack/table', - form: 'TanStack/form', - virtual: 'TanStack/virtual', - start: 'TanStack/start', - store: 'TanStack/store', -} - -interface QuestionCandidate { - source: 'stackoverflow' | 'github' | 'reddit' - title: string - url: string - score: number - tags: string[] - library: string - createdAt: string -} - -async function fetchStackOverflowQuestions( - tags: string[], - library: string, -): Promise { - const questions: QuestionCandidate[] = [] - - for (const tag of tags) { - try { - // Stack Overflow API - get questions sorted by votes - const url = `https://api.stackexchange.com/2.3/questions?order=desc&sort=votes&tagged=${tag}&site=stackoverflow&pagesize=50&filter=withbody` - const response = await fetch(url) - const data = await response.json() - - if (data.items) { - for (const item of data.items) { - questions.push({ - source: 'stackoverflow', - title: item.title, - url: item.link, - score: item.score, - tags: item.tags, - library, - createdAt: new Date(item.creation_date * 1000).toISOString(), - }) - } - } - } catch (error) { - console.error(`Error fetching SO questions for ${tag}:`, error) - } - } - - return questions -} - -async function fetchGitHubDiscussions( - repo: string, - library: string, -): Promise { - const questions: QuestionCandidate[] = [] - - // GitHub GraphQL API for discussions - // Note: Requires GITHUB_TOKEN env var - const token = process.env.GITHUB_TOKEN - if (!token) { - console.warn('GITHUB_TOKEN not set, skipping GitHub discussions') - return questions - } - - const query = ` - query($repo: String!, $owner: String!) { - repository(name: $repo, owner: $owner) { - discussions(first: 50, orderBy: {field: CREATED_AT, direction: DESC}, categoryId: null) { - nodes { - title - url - upvoteCount - createdAt - category { - name - } - } - } - } - } - ` - - const [owner, repoName] = repo.split('/') - - try { - const response = await fetch('https://api.github.com/graphql', { - method: 'POST', - headers: { - Authorization: `Bearer ${token}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - query, - variables: { repo: repoName, owner }, - }), - }) - - const data = await response.json() - - if (data.data?.repository?.discussions?.nodes) { - for (const node of data.data.repository.discussions.nodes) { - // Filter to Q&A category - if ( - node.category?.name?.toLowerCase().includes('q&a') || - node.category?.name?.toLowerCase().includes('help') - ) { - questions.push({ - source: 'github', - title: node.title, - url: node.url, - score: node.upvoteCount, - tags: [node.category?.name || 'discussion'], - library, - createdAt: node.createdAt, - }) - } - } - } - } catch (error) { - console.error(`Error fetching GitHub discussions for ${repo}:`, error) - } - - return questions -} - -async function fetchGitHubIssues( - repo: string, - library: string, -): Promise { - const questions: QuestionCandidate[] = [] - - const token = process.env.GITHUB_TOKEN - const headers: Record = { - Accept: 'application/vnd.github.v3+json', - } - if (token) { - headers.Authorization = `Bearer ${token}` - } - - try { - // Get issues labeled as questions or with "how" in title - const url = `https://api.github.com/repos/${repo}/issues?state=all&per_page=100&sort=comments&direction=desc` - const response = await fetch(url, { headers }) - const issues = await response.json() - - if (Array.isArray(issues)) { - for (const issue of issues) { - // Filter to question-like issues - const isQuestion = - issue.title.toLowerCase().includes('how') || - issue.title.toLowerCase().includes('?') || - issue.labels?.some( - (l: { name: string }) => - l.name.toLowerCase().includes('question') || - l.name.toLowerCase().includes('help'), - ) - - if (isQuestion && !issue.pull_request) { - questions.push({ - source: 'github', - title: issue.title, - url: issue.html_url, - score: issue.comments + (issue.reactions?.['+1'] || 0), - tags: issue.labels?.map((l: { name: string }) => l.name) || [], - library, - createdAt: issue.created_at, - }) - } - } - } - } catch (error) { - console.error(`Error fetching GitHub issues for ${repo}:`, error) - } - - return questions -} - -function categorizeQuestion(title: string): string[] { - const categories: string[] = [] - const lower = title.toLowerCase() - - // Topic detection - if (lower.includes('mutation') || lower.includes('mutate')) - categories.push('mutations') - if (lower.includes('cache') || lower.includes('invalidat')) - categories.push('cache') - if (lower.includes('infinite') || lower.includes('pagination')) - categories.push('pagination') - if (lower.includes('ssr') || lower.includes('server')) categories.push('ssr') - if (lower.includes('typescript') || lower.includes('type')) - categories.push('typescript') - if (lower.includes('test')) categories.push('testing') - if (lower.includes('error') || lower.includes('retry')) - categories.push('error-handling') - if (lower.includes('prefetch') || lower.includes('preload')) - categories.push('prefetching') - if (lower.includes('suspense')) categories.push('suspense') - if (lower.includes('devtools')) categories.push('devtools') - if (lower.includes('optimistic')) categories.push('optimistic') - if (lower.includes('dependent') || lower.includes('serial')) - categories.push('dependent') - if (lower.includes('parallel')) categories.push('parallel') - if (lower.includes('refetch') || lower.includes('stale')) - categories.push('refetching') - if (lower.includes('auth')) categories.push('auth') - if (lower.includes('loading') || lower.includes('pending')) - categories.push('loading-states') - if (lower.includes('route') || lower.includes('navigation')) - categories.push('routing') - if (lower.includes('param')) categories.push('params') - if (lower.includes('search')) categories.push('search-params') - if (lower.includes('loader')) categories.push('loaders') - if (lower.includes('sort')) categories.push('sorting') - if (lower.includes('filter')) categories.push('filtering') - if (lower.includes('select')) categories.push('selection') - if (lower.includes('virtual')) categories.push('virtualization') - if (lower.includes('form') || lower.includes('submit')) - categories.push('forms') - if (lower.includes('valid')) categories.push('validation') - - return categories.length > 0 ? categories : ['general'] -} - -function convertToTestCase(q: QuestionCandidate): object { - const categories = categorizeQuestion(q.title) - - return { - id: `mined-${q.library}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, - question: q.title.replace(/'/g, "'").replace(/"/g, '"'), - difficulty: 'medium', - tags: [q.library, ...categories], - source: { - type: q.source, - url: q.url, - score: q.score, - }, - expectedDocs: [ - { - library: q.library, - path: 'TODO: Fill in the correct doc path', - required: true, - reason: 'TODO: Explain why this doc answers the question', - }, - ], - idealSearchQueries: ['TODO: Add ideal search queries'], - correctAnswerMustInclude: ['TODO: Add key terms'], - notes: `Mined from ${q.source} on ${new Date().toISOString()}. Original score: ${q.score}`, - } -} - -async function main() { - const args = process.argv.slice(2) - let source = 'all' as string - let library: string | null = null - - for (let i = 0; i < args.length; i++) { - if (args[i] === '--source' && args[i + 1]) { - source = args[i + 1] - } - if (args[i] === '--library' && args[i + 1]) { - library = args[i + 1] - } - } - - console.log(`\n🔍 Mining questions from ${source}...`) - if (library) console.log(` Filtering to library: ${library}`) - console.log('') - - const allQuestions: QuestionCandidate[] = [] - - const libraries = library ? [library] : Object.keys(GITHUB_REPOS) - - for (const lib of libraries) { - console.log(`\n📚 Processing ${lib}...`) - - if (source === 'stackoverflow' || source === 'all') { - const tags = STACK_OVERFLOW_TAGS[lib] - if (tags) { - console.log(` Stack Overflow tags: ${tags.join(', ')}`) - const soQuestions = await fetchStackOverflowQuestions(tags, lib) - console.log(` Found ${soQuestions.length} SO questions`) - allQuestions.push(...soQuestions) - } - } - - if (source === 'github' || source === 'all') { - const repo = GITHUB_REPOS[lib] - if (repo) { - console.log(` GitHub repo: ${repo}`) - const ghDiscussions = await fetchGitHubDiscussions(repo, lib) - const ghIssues = await fetchGitHubIssues(repo, lib) - console.log( - ` Found ${ghDiscussions.length} discussions, ${ghIssues.length} issues`, - ) - allQuestions.push(...ghDiscussions, ...ghIssues) - } - } - - // Rate limiting - await new Promise((r) => setTimeout(r, 1000)) - } - - // Sort by score and dedupe - const sortedQuestions = allQuestions - .sort((a, b) => b.score - a.score) - .filter( - (q, i, arr) => - arr.findIndex( - (x) => x.title.toLowerCase() === q.title.toLowerCase(), - ) === i, - ) - - console.log(`\n\n📊 Results Summary`) - console.log(` Total unique questions: ${sortedQuestions.length}`) - - // Group by library - const byLibrary: Record = {} - for (const q of sortedQuestions) { - byLibrary[q.library] = (byLibrary[q.library] || 0) + 1 - } - console.log(` By library:`) - for (const [lib, count] of Object.entries(byLibrary)) { - console.log(` ${lib}: ${count}`) - } - - // Group by category - const byCategory: Record = {} - for (const q of sortedQuestions) { - for (const cat of categorizeQuestion(q.title)) { - byCategory[cat] = (byCategory[cat] || 0) + 1 - } - } - console.log(` By category:`) - const sortedCategories = Object.entries(byCategory).sort( - (a, b) => b[1] - a[1], - ) - for (const [cat, count] of sortedCategories.slice(0, 15)) { - console.log(` ${cat}: ${count}`) - } - - // Output top questions as potential test cases - console.log(`\n\n🎯 Top 20 Questions (by score):`) - console.log('='.repeat(80)) - - const testCaseCandidates = sortedQuestions.slice(0, 20).map(convertToTestCase) - - for (const q of sortedQuestions.slice(0, 20)) { - console.log(`\n[${q.library}] ${q.title}`) - console.log(` Score: ${q.score} | Source: ${q.source}`) - console.log(` Categories: ${categorizeQuestion(q.title).join(', ')}`) - console.log(` URL: ${q.url}`) - } - - // Save candidates to file - const outputPath = './scripts/mcp-eval/mined-questions.json' - const fs = await import('fs') - fs.writeFileSync( - outputPath, - JSON.stringify( - { - minedAt: new Date().toISOString(), - totalQuestions: sortedQuestions.length, - topCandidates: testCaseCandidates, - allQuestions: sortedQuestions, - }, - null, - 2, - ), - ) - console.log( - `\n\n💾 Saved ${sortedQuestions.length} questions to ${outputPath}`, - ) - console.log( - ` Review the file and add promising questions to test-cases.json`, - ) -} - -main().catch(console.error) diff --git a/scripts/mcp-eval/results.json b/scripts/mcp-eval/results.json deleted file mode 100644 index 71a07bdba..000000000 --- a/scripts/mcp-eval/results.json +++ /dev/null @@ -1,3051 +0,0 @@ -{ - "timestamp": "2026-01-11T23:15:57.600Z", - "summary": { - "passed": 110, - "total": 115, - "avgScore": 95 - }, - "results": [ - { - "testId": "router-query-ssr-integration", - "question": "In TanStack Start, how do I prefetch data for a route that uses both a loader and TanStack Query, ensuring the data is dehydrated to the client without double-fetching?", - "difficulty": "hard", - "searchesPerformed": [ - { - "query": "query integration", - "resultsCount": 63, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/integrations/query", - "https://tanstack.com/router/latest/docs/integrations/query#what-you-get", - "https://tanstack.com/router/latest/docs/integrations/query#installation", - "https://tanstack.com/router/latest/docs/integrations/query#setup", - "https://tanstack.com/router/latest/docs/integrations/query#ssr-behavior-and-streaming" - ] - } - ], - "expectedDocsFound": ["router:integrations/query"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "createfileroute-basic", - "question": "How do I create a file-based route in TanStack Router?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "createFileRoute", - "resultsCount": 18, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/api/router/createFileRouteFunction", - "https://tanstack.com/router/latest/docs/framework/react/api/router/createFileRouteFunction#createfileroute-options", - "https://tanstack.com/router/latest/docs/framework/react/api/router/createFileRouteFunction#createfileroute-returns", - "https://tanstack.com/router/latest/docs/framework/react/api/router/createFileRouteFunction#examples", - "https://tanstack.com/router/latest/docs/framework/react/api/router/createFileRouteFunction#path-option" - ] - } - ], - "expectedDocsFound": [ - "router:framework/react/api/router/createFileRouteFunction" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-usequery-basic", - "question": "How do I fetch data with TanStack Query in React?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "queries guide", - "resultsCount": 87, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/angular/reference/functions/injectQuery#see", - "https://tanstack.com/query/latest/docs/framework/angular/reference/functions/injectQuery#see-1", - "https://tanstack.com/query/latest/docs/framework/angular/reference/functions/injectQuery#see-2", - "https://tanstack.com/query/latest/docs/framework/angular/reference/functions/injectQuery#see-3", - "https://tanstack.com/query/latest/docs/framework/react/guides/ssr#prefetching-dependent-queries" - ] - }, - { - "query": "query basics", - "resultsCount": 106, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/queries#query-basics", - "https://tanstack.com/query/latest/docs/framework/react/guides/queries#fetchstatus", - "https://tanstack.com/query/latest/docs/framework/react/guides/queries#why-two-different-states", - "https://tanstack.com/query/latest/docs/framework/vue/guides/queries#query-basics", - "https://tanstack.com/query/latest/docs/framework/solid/guides/queries#query-basics" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/queries"], - "expectedDocsMissed": [], - "totalSearches": 2, - "passed": true, - "score": 85, - "notes": [] - }, - { - "testId": "start-server-functions", - "question": "How do I create a server function in TanStack Start that can be called from the client?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "server function", - "resultsCount": 290, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/streaming-data-from-server-functions", - "https://tanstack.com/start/latest/docs/framework/react/guide/static-server-functions", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-functions", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-functions#what-are-server-functions", - "https://tanstack.com/start/latest/docs/framework/react/guide/streaming-data-from-server-functions#typed-readable-streams" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/server-functions"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-search-params-validation", - "question": "How do I validate and type search params in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "search params validation", - "resultsCount": 34, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/code-splitting#how-does-tanstack-router-split-code", - "https://tanstack.com/router/latest/docs/framework/solid/guide/code-splitting#how-does-tanstack-router-split-code", - "https://tanstack.com/router/latest/docs/framework/react/routing/routing-concepts#the-root-route", - "https://tanstack.com/router/latest/docs/framework/solid/routing/routing-concepts#the-root-route", - "https://tanstack.com/router/latest/docs/framework/react/decisions-on-dx#why-is-the-routers-configuration-done-this-way" - ] - }, - { - "query": "validateSearch", - "resultsCount": 16, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/api/router/RouteOptionsType#validatesearch-method", - "https://tanstack.com/router/latest/docs/framework/react/guide/search-params#validating-search-params", - "https://tanstack.com/router/latest/docs/framework/solid/guide/search-params#validating-search-params", - "https://tanstack.com/router/latest/docs/framework/react/guide/search-params#adapters", - "https://tanstack.com/router/latest/docs/framework/solid/guide/search-params#adapters" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/search-params"], - "expectedDocsMissed": [], - "totalSearches": 2, - "passed": true, - "score": 85, - "notes": [] - }, - { - "testId": "table-column-definitions", - "question": "How do I define columns for TanStack Table?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "column definitions", - "resultsCount": 25, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/guide/column-defs#column-definitions-guide", - "https://tanstack.com/table/latest/docs/guide/migrating#update-column-definitions", - "https://tanstack.com/table/latest/docs/guide/tables#defining-columns", - "https://tanstack.com/table/latest/docs/api/core/column-def", - "https://tanstack.com/table/latest/docs/guide/data#data-guide" - ] - } - ], - "expectedDocsFound": ["table:guide/column-defs"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "form-validation-zod", - "question": "How do I use Zod validation with TanStack Form?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "form zod validation", - "resultsCount": 4, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/form/latest/docs/framework/react/guides/dynamic-validation#standard-schema-validation", - "https://tanstack.com/form/latest/docs/framework/react/guides/basic-concepts#validation-with-standard-schema-libraries", - "https://tanstack.com/form/latest/docs/framework/react/guides/validation#standard-schema-libraries", - "https://tanstack.com/form/latest/docs/philosophy#forms-need-flexibility" - ] - } - ], - "expectedDocsFound": ["form:framework/react/guides/validation"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "virtual-dynamic-row-heights", - "question": "How do I handle dynamic/variable row heights in TanStack Virtual?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "dynamic size virtualizer", - "resultsCount": 456, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/virtual/latest/docs/api/virtual-item#size", - "https://tanstack.com/table/latest/docs/guide/virtualization#examples", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#resizeitem", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#measureelement", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#estimatesize" - ] - }, - { - "query": "measureElement", - "resultsCount": 5, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/virtual/latest/docs/api/virtualizer#measureelement", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#measureelement-1", - "https://tanstack.com/virtual/latest/docs/api/virtual-item#size", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#resizeitem", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#estimatesize" - ] - } - ], - "expectedDocsFound": ["virtual:api/virtualizer"], - "expectedDocsMissed": ["virtual:framework/react/examples/dynamic"], - "totalSearches": 2, - "passed": true, - "score": 85, - "notes": [] - }, - { - "testId": "query-mutations", - "question": "How do I update data on the server with TanStack Query?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "mutation", - "resultsCount": 694, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/mutations", - "https://tanstack.com/query/latest/docs/framework/react/guides/mutations#resetting-mutation-state", - "https://tanstack.com/query/latest/docs/framework/react/guides/mutations#mutation-side-effects", - "https://tanstack.com/query/latest/docs/framework/react/guides/mutations#promises", - "https://tanstack.com/query/latest/docs/framework/react/guides/mutations#retry" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/mutations"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-loaderDeps", - "question": "How do I make a TanStack Router loader depend on search params so it reloads when they change?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "loaderDeps", - "resultsCount": 33, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDepsHook", - "https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDepsHook#useloaderdepshook-options", - "https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDepsHook#useloaderdeps-returns", - "https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDepsHook#examples", - "https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDepsHook#optsfrom-option" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/data-loading"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "query-optimistic-updates", - "question": "How do I implement optimistic updates with TanStack Query so the UI updates immediately before the server responds?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "optimistic updates", - "resultsCount": 107, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/optimistic-updates", - "https://tanstack.com/query/latest/docs/framework/react/guides/optimistic-updates#via-the-ui", - "https://tanstack.com/query/latest/docs/framework/react/guides/optimistic-updates#via-the-cache", - "https://tanstack.com/query/latest/docs/framework/react/guides/optimistic-updates#when-to-use-what", - "https://tanstack.com/query/latest/docs/framework/react/guides/optimistic-updates#further-reading" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/optimistic-updates"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-infinite-scroll", - "question": "How do I implement infinite scrolling with TanStack Query?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "infinite query", - "resultsCount": 355, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/infinite-queries", - "https://tanstack.com/query/latest/docs/framework/react/guides/infinite-queries#example", - "https://tanstack.com/query/latest/docs/framework/react/guides/infinite-queries#what-happens-when-an-infinite-query-needs-to-be-refetched", - "https://tanstack.com/query/latest/docs/framework/react/guides/infinite-queries#what-if-i-want-to-implement-a-bi-directional-infinite-list", - "https://tanstack.com/query/latest/docs/framework/react/guides/infinite-queries#what-if-i-want-to-show-the-pages-in-reversed-order" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/infinite-queries"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-cache-invalidation", - "question": "How do I invalidate and refetch queries after a mutation in TanStack Query?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "invalidate queries", - "resultsCount": 65, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/query-invalidation#query-matching-with-invalidatequeries", - "https://tanstack.com/query/latest/docs/framework/vue/guides/query-invalidation#query-matching-with-invalidatequeries", - "https://tanstack.com/query/latest/docs/framework/solid/guides/query-invalidation#query-matching-with-invalidatequeries", - "https://tanstack.com/query/latest/docs/framework/angular/guides/query-invalidation#query-matching-with-invalidatequeries", - "https://tanstack.com/query/latest/docs/reference/QueryClient#queryclientinvalidatequeries" - ] - } - ], - "expectedDocsFound": [ - "query:framework/react/guides/invalidations-from-mutations" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "query-dependent-queries", - "question": "How do I make one query depend on the result of another query in TanStack Query?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "dependent queries", - "resultsCount": 100, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/dependent-queries", - "https://tanstack.com/query/latest/docs/framework/react/guides/dependent-queries#usequery-dependent-query", - "https://tanstack.com/query/latest/docs/framework/react/guides/dependent-queries#usequeries-dependent-query", - "https://tanstack.com/query/latest/docs/framework/react/guides/dependent-queries#a-note-about-performance", - "https://tanstack.com/query/latest/docs/framework/vue/guides/dependent-queries" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/dependent-queries"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-prefetching", - "question": "How do I prefetch data before a user navigates to a page with TanStack Query?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "prefetch query", - "resultsCount": 200, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/reference/usePrefetchQuery", - "https://tanstack.com/query/latest/docs/framework/react/reference/usePrefetchInfiniteQuery", - "https://tanstack.com/query/latest/docs/framework/react/guides/prefetching#prefetchquery--prefetchinfinitequery", - "https://tanstack.com/query/latest/docs/framework/solid/guides/prefetching#prefetchquery--prefetchinfinitequery", - "https://tanstack.com/query/latest/docs/reference/QueryClient#queryclientprefetchquery" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/prefetching"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-suspense", - "question": "How do I use TanStack Query with React Suspense?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "suspense guide", - "resultsCount": 11, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/suspense#suspense-on-the-server-with-streaming", - "https://tanstack.com/query/latest/docs/framework/react/guides/ssr#a-quick-note-on-suspense", - "https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#handling-slow-loaders", - "https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#handling-slow-loaders", - "https://tanstack.com/query/latest/docs/framework/react/guides/request-waterfalls#nested-component-waterfalls" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/suspense"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-devtools", - "question": "How do I set up TanStack Query DevTools to debug my queries?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "query devtools", - "resultsCount": 50, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/network-mode#devtools", - "https://tanstack.com/query/latest/docs/framework/vue/guides/network-mode#devtools", - "https://tanstack.com/query/latest/docs/framework/solid/guides/network-mode#devtools", - "https://tanstack.com/query/latest/docs/framework/angular/guides/network-mode#devtools", - "https://tanstack.com/query/latest/docs/framework/react/guides/migrating-to-react-query-3#devtools-are-now-part-of-the-main-repo-and-npm-package" - ] - } - ], - "expectedDocsFound": ["query:framework/react/devtools"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "router-code-splitting", - "question": "How do I implement code splitting and lazy loading routes in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "code splitting", - "resultsCount": 73, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/code-splitting", - "https://tanstack.com/router/latest/docs/framework/react/guide/automatic-code-splitting", - "https://tanstack.com/router/latest/docs/framework/react/guide/code-splitting#how-does-tanstack-router-split-code", - "https://tanstack.com/router/latest/docs/framework/react/guide/automatic-code-splitting#how-does-it-work", - "https://tanstack.com/router/latest/docs/framework/react/guide/code-splitting#encapsulating-a-routes-files-into-a-directory" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/code-splitting"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-navigation-blocking", - "question": "How do I prevent navigation when a form has unsaved changes in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "navigation blocking", - "resultsCount": 17, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/navigation-blocking", - "https://tanstack.com/router/latest/docs/framework/react/guide/navigation-blocking#how-does-navigation-blocking-work", - "https://tanstack.com/router/latest/docs/framework/react/guide/navigation-blocking#how-do-i-use-navigation-blocking", - "https://tanstack.com/router/latest/docs/framework/react/guide/navigation-blocking#hooklogical-based-blocking", - "https://tanstack.com/router/latest/docs/framework/react/guide/navigation-blocking#component-based-blocking" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/navigation-blocking"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-authenticated-routes", - "question": "How do I protect routes that require authentication in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "authenticated routes", - "resultsCount": 35, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/authenticated-routes", - "https://tanstack.com/router/latest/docs/framework/react/guide/authenticated-routes#the-routebeforeload-option", - "https://tanstack.com/router/latest/docs/framework/react/guide/authenticated-routes#redirecting", - "https://tanstack.com/router/latest/docs/framework/react/guide/authenticated-routes#non-redirected-authentication", - "https://tanstack.com/router/latest/docs/framework/react/guide/authenticated-routes#authentication-using-react-contexthooks" - ] - } - ], - "expectedDocsFound": [ - "router:framework/react/guide/authenticated-routes" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-not-found", - "question": "How do I handle 404 not found pages in TanStack Router?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "not found", - "resultsCount": 443, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/not-found-errors", - "https://tanstack.com/router/latest/docs/framework/react/guide/not-found-errors#overview", - "https://tanstack.com/router/latest/docs/framework/react/guide/not-found-errors#the-notfoundmode-option", - "https://tanstack.com/router/latest/docs/framework/react/guide/not-found-errors#configuring-a-routes-notfoundcomponent", - "https://tanstack.com/router/latest/docs/framework/react/guide/not-found-errors#default-router-wide-not-found-handling" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/not-found-errors"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-path-params", - "question": "How do I access dynamic path parameters like /posts/$postId in TanStack Router?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "path params", - "resultsCount": 124, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/path-params", - "https://tanstack.com/router/latest/docs/framework/react/guide/path-params#path-params-can-be-used-by-child-routes", - "https://tanstack.com/router/latest/docs/framework/react/guide/path-params#path-params-in-loaders", - "https://tanstack.com/router/latest/docs/framework/react/guide/path-params#path-params-in-components", - "https://tanstack.com/router/latest/docs/framework/react/guide/path-params#path-params-outside-of-routes" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/path-params"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-preloading", - "question": "How do I preload route data on hover in TanStack Router?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "preload route", - "resultsCount": 84, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/api/router/RouterType#preloadroute-method", - "https://tanstack.com/router/latest/docs/framework/react/guide/preloading#preloading-manually", - "https://tanstack.com/router/latest/docs/framework/solid/guide/preloading#preloading-manually", - "https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#opting-out-of-caching-while-still-preloading", - "https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#opting-out-of-caching-while-still-preloading" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/preloading"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-devtools", - "question": "How do I set up TanStack Router DevTools?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "router devtools", - "resultsCount": 31, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/installation/manual#install-tanstack-router-vite-plugin-and-the-router-devtools", - "https://tanstack.com/router/latest/docs/framework/solid/installation/manual#install-tanstack-router-vite-plugin-and-the-router-devtools", - "https://tanstack.com/router/latest/docs/framework/react/devtools#using-devtools-in-production", - "https://tanstack.com/router/latest/docs/framework/solid/devtools#using-devtools-in-production", - "https://tanstack.com/router/latest/docs/framework/react/devtools#fixed-mode" - ] - } - ], - "expectedDocsFound": ["router:framework/react/devtools"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "table-sorting", - "question": "How do I implement column sorting in TanStack Table?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "table sorting", - "resultsCount": 97, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/api/features/sorting#getsortedrowmodel-1", - "https://tanstack.com/table/latest/docs/api/features/sorting#using-sorting-functions", - "https://tanstack.com/table/latest/docs/guide/sorting#sorting-apis", - "https://tanstack.com/table/latest/docs/guide/sorting#manual-server-side-sorting", - "https://tanstack.com/table/latest/docs/api/features/sorting#clearsorting" - ] - } - ], - "expectedDocsFound": ["table:guide/sorting"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "table-filtering", - "question": "How do I add filtering to TanStack Table?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "table filtering", - "resultsCount": 132, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/api/features/global-filtering#getfilteredrowmodel-1", - "https://tanstack.com/table/latest/docs/api/features/column-filtering#getfilteredrowmodel-1", - "https://tanstack.com/table/latest/docs/api/features/global-filtering#getprefilteredrowmodel", - "https://tanstack.com/table/latest/docs/api/features/column-filtering#getprefilteredrowmodel", - "https://tanstack.com/table/latest/docs/guide/column-filtering#max-leaf-row-filter-depth" - ] - } - ], - "expectedDocsFound": ["table:guide/column-filtering"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "table-pagination", - "question": "How do I implement pagination in TanStack Table?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "table pagination", - "resultsCount": 67, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/guide/pagination#pagination-apis", - "https://tanstack.com/table/latest/docs/api/features/pagination#getpaginationrowmodel-1", - "https://tanstack.com/table/latest/docs/api/features/pagination#getprepaginationrowmodel", - "https://tanstack.com/table/latest/docs/api/features/pagination#onpaginationchange", - "https://tanstack.com/table/latest/docs/guide/pagination#manual-server-side-pagination" - ] - } - ], - "expectedDocsFound": ["table:guide/pagination"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "table-row-selection", - "question": "How do I enable row selection with checkboxes in TanStack Table?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "row selection", - "resultsCount": 60, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/guide/row-selection", - "https://tanstack.com/table/latest/docs/guide/row-selection#examples", - "https://tanstack.com/table/latest/docs/guide/row-selection#api", - "https://tanstack.com/table/latest/docs/guide/row-selection#row-selection-guide", - "https://tanstack.com/table/latest/docs/guide/row-selection#access-row-selection-state" - ] - } - ], - "expectedDocsFound": ["table:guide/row-selection"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "table-virtualization", - "question": "How do I virtualize a large table with TanStack Table and TanStack Virtual?", - "difficulty": "hard", - "searchesPerformed": [ - { - "query": "table virtualization", - "resultsCount": 6, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/table/latest/docs/guide/virtualization#virtualization-guide", - "https://tanstack.com/table/latest/docs/guide/pagination#should-you-use-virtualization-instead", - "https://tanstack.com/table/latest/docs/guide/virtualization", - "https://tanstack.com/table/latest/docs/guide/virtualization#examples", - "https://tanstack.com/table/latest/docs/guide/features" - ] - }, - { - "query": "virtualized rows", - "resultsCount": 6, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/framework/react/examples/virtualized-rows-experimental", - "https://tanstack.com/table/latest/docs/framework/react/examples/virtualized-rows", - "https://tanstack.com/table/latest/docs/framework/vue/examples/virtualized-rows", - "https://tanstack.com/table/latest/docs/guide/virtualization#examples", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#lanes" - ] - } - ], - "expectedDocsFound": ["table:framework/react/examples/virtualized-rows"], - "expectedDocsMissed": [], - "totalSearches": 2, - "passed": true, - "score": 85, - "notes": [] - }, - { - "testId": "table-server-side", - "question": "How do I implement server-side pagination and sorting with TanStack Table?", - "difficulty": "hard", - "searchesPerformed": [ - { - "query": "server side table", - "resultsCount": 43, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/ssr", - "https://tanstack.com/router/latest/docs/framework/solid/guide/ssr", - "https://tanstack.com/table/latest/docs/guide/grouping#manual-grouping", - "https://tanstack.com/table/latest/docs/guide/global-faceting#custom-global-server-side-faceting", - "https://tanstack.com/table/latest/docs/framework/react/guide/table-state#individual-controlled-state" - ] - }, - { - "query": "manual pagination", - "resultsCount": 13, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/api/features/pagination#manualpagination", - "https://tanstack.com/table/latest/docs/guide/pagination#pagination-options", - "https://tanstack.com/table/latest/docs/guide/pagination#auto-reset-page-index", - "https://tanstack.com/table/latest/docs/api/features/pagination#autoresetpageindex", - "https://tanstack.com/table/latest/docs/guide/pagination#manual-server-side-pagination" - ] - } - ], - "expectedDocsFound": ["table:guide/pagination"], - "expectedDocsMissed": [], - "totalSearches": 2, - "passed": true, - "score": 85, - "notes": [] - }, - { - "testId": "form-field-arrays", - "question": "How do I handle dynamic arrays of fields in TanStack Form?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "form arrays", - "resultsCount": 75, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/form/latest/docs/framework/react/guides/arrays", - "https://tanstack.com/form/latest/docs/reference/index#type-aliases", - "https://tanstack.com/form/latest/docs/reference/type-aliases/DerivedFormState#errors", - "https://tanstack.com/form/latest/docs/reference/interfaces/FormState#errors", - "https://tanstack.com/form/latest/docs/reference/classes/FormApi#validatearrayfieldsstartingfrom" - ] - } - ], - "expectedDocsFound": ["form:framework/react/guides/arrays"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "form-async-validation", - "question": "How do I implement async validation that checks the server in TanStack Form?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "async validation", - "resultsCount": 283, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/form/latest/docs/framework/react/guides/dynamic-validation#async-validation", - "https://tanstack.com/form/latest/docs/reference/interfaces/FormOptions#asyncalways", - "https://tanstack.com/form/latest/docs/reference/interfaces/FieldOptions#asyncalways", - "https://tanstack.com/form/latest/docs/reference/interfaces/FieldApiOptions#asyncalways", - "https://tanstack.com/form/latest/docs/reference/interfaces/FieldOptions#asyncdebouncems" - ] - } - ], - "expectedDocsFound": ["form:framework/react/guides/dynamic-validation"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "form-submission", - "question": "How do I handle form submission with TanStack Form?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "form submit", - "resultsCount": 261, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/form/latest/docs/framework/react/guides/validation#preventing-invalid-forms-from-being-submitted", - "https://tanstack.com/form/latest/docs/reference/interfaces/FormOptions#onsubmit", - "https://tanstack.com/form/latest/docs/framework/react/guides/submission-handling#passing-additional-data-to-submission-handling", - "https://tanstack.com/form/latest/docs/framework/react/guides/ssr#remix-integration", - "https://tanstack.com/form/latest/docs/framework/react/guides/basic-concepts#form-instance" - ] - } - ], - "expectedDocsFound": ["form:framework/react/guides/basic-concepts"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "virtual-horizontal-scroll", - "question": "How do I create a horizontal virtualized list with TanStack Virtual?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "horizontal virtual", - "resultsCount": 5, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/virtual/latest/docs/introduction#the-virtualizer", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#horizontal", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#measureelement", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#lanes", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#isrtl" - ] - } - ], - "expectedDocsFound": ["virtual:api/virtualizer"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "virtual-window-scroll", - "question": "How do I virtualize a list that uses window scrolling instead of a container?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "useWindowVirtualizer", - "resultsCount": 5, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/virtual/latest/docs/framework/react/react-virtual#usewindowvirtualizer", - "https://tanstack.com/virtual/latest/docs/framework/react/react-virtual#useflushsync", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#observeelementoffset", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#observeelementrect", - "https://tanstack.com/virtual/latest/docs/api/virtualizer#scrolltofn" - ] - } - ], - "expectedDocsFound": ["virtual:framework/react/react-virtual"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "virtual-grid", - "question": "How do I create a virtualized grid with TanStack Virtual?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "virtualizer grid", - "resultsCount": 1, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/virtual/latest/docs/introduction#the-virtualizer" - ] - }, - { - "query": "virtual rows columns", - "resultsCount": 1, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/virtual/latest/docs/api/virtualizer#lanes" - ] - } - ], - "expectedDocsFound": ["virtual:api/virtualizer"], - "expectedDocsMissed": [], - "totalSearches": 2, - "passed": true, - "score": 85, - "notes": [] - }, - { - "testId": "start-deployment-vercel", - "question": "How do I deploy a TanStack Start app to Vercel?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "hosting vercel", - "resultsCount": 5, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#vercel", - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#deployment", - "https://tanstack.com/start/latest/docs/framework/solid/guide/hosting#vercel", - "https://tanstack.com/start/latest/docs/framework/solid/guide/hosting#deployment", - "https://tanstack.com/start/latest/docs/framework/react/comparison#deployment-flexibility" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/hosting"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-deployment-netlify", - "question": "How do I deploy a TanStack Start app to Netlify?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "hosting netlify", - "resultsCount": 13, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#what-should-i-use", - "https://tanstack.com/start/latest/docs/framework/solid/guide/hosting#what-should-i-use", - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#netlify--official-partner", - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#netlify", - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#manual-configuration" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/hosting"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-middleware", - "question": "How do I add middleware to TanStack Start for things like authentication?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "start middleware", - "resultsCount": 112, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/comparison#server-functions-vs-server-actions", - "https://tanstack.com/start/latest/docs/framework/react/guide/middleware#global-server-function-middleware", - "https://tanstack.com/start/latest/docs/framework/solid/guide/middleware#global-server-function-middleware", - "https://tanstack.com/start/latest/docs/framework/react/comparison#middleware-architecture", - "https://tanstack.com/start/latest/docs/framework/react/guide/middleware#global-request-middleware" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/middleware"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-api-routes", - "question": "How do I create API routes in TanStack Start?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "server routes", - "resultsCount": 263, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/server-routes", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-routes#server-routes-and-app-routes", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-routes#file-route-conventions", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-routes#unique-route-paths", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-routes#escaped-matching" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/server-routes"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-static-prerendering", - "question": "How do I statically prerender pages at build time in TanStack Start?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "static prerender", - "resultsCount": 23, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/static-prerendering#prerendering", - "https://tanstack.com/start/latest/docs/framework/react/guide/static-prerendering#crawling-links", - "https://tanstack.com/start/latest/docs/framework/solid/guide/static-prerendering#prerendering", - "https://tanstack.com/start/latest/docs/framework/solid/guide/static-prerendering#crawling-links", - "https://tanstack.com/start/latest/docs/framework/react/guide/static-prerendering" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/static-prerendering"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "store-basics", - "question": "How do I create and use a store with TanStack Store?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "store quick start", - "resultsCount": 11, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/store/latest/docs/framework/react/quick-start", - "https://tanstack.com/store/latest/docs/quick-start", - "https://tanstack.com/store/latest/docs/quick-start#store", - "https://tanstack.com/store/latest/docs/quick-start#derived", - "https://tanstack.com/store/latest/docs/quick-start#effects" - ] - } - ], - "expectedDocsFound": ["store:framework/react/quick-start"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "store-derived", - "question": "How do I create derived state from a TanStack Store?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "derived", - "resultsCount": 213, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/store/latest/docs/reference/classes/Derived", - "https://tanstack.com/store/latest/docs/reference/classes/Derived#type-parameters", - "https://tanstack.com/store/latest/docs/reference/classes/Derived#constructors", - "https://tanstack.com/store/latest/docs/reference/classes/Derived#properties", - "https://tanstack.com/store/latest/docs/reference/classes/Derived#methods" - ] - } - ], - "expectedDocsFound": ["store:reference/classes/Derived"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-vue-basics", - "question": "How do I use TanStack Query with Vue?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "vue query", - "resultsCount": 316, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/vue", - "https://tanstack.com/query/latest/docs/framework/vue/guides/migrating-to-v5#vue-query-breaking-changes", - "https://tanstack.com/query/latest/docs/framework/vue/guides/migrating-to-v5#usequeries-composable-returns-ref-instead-of-reactive", - "https://tanstack.com/query/latest/docs/framework/vue/guides/migrating-to-v5#vue-v33-is-now-required", - "https://tanstack.com/query/latest/docs/framework/vue/installation#vue-query-initialization" - ] - }, - { - "query": "tanstack query vue", - "resultsCount": 86, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/vue/guides/does-this-replace-client-state", - "https://tanstack.com/query/latest/docs/framework/vue/guides/does-this-replace-client-state#a-contrived-example", - "https://tanstack.com/query/latest/docs/framework/vue", - "https://tanstack.com/query/latest/docs/framework/vue/overview", - "https://tanstack.com/query/latest/docs/framework/vue/overview#motivation" - ] - } - ], - "expectedDocsFound": ["query:framework/vue/overview"], - "expectedDocsMissed": [], - "totalSearches": 2, - "passed": false, - "score": 65, - "notes": [] - }, - { - "testId": "query-solid-basics", - "question": "How do I use TanStack Query with SolidJS?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "solid query", - "resultsCount": 379, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/solid/examples/start-basic-solid-query", - "https://tanstack.com/router/latest/docs/framework/solid/examples/router-monorepo-solid-query", - "https://tanstack.com/router/latest/docs/framework/solid/examples/kitchen-sink-solid-query-file-based", - "https://tanstack.com/router/latest/docs/framework/solid/examples/kitchen-sink-solid-query", - "https://tanstack.com/router/latest/docs/framework/solid/examples/basic-solid-query-file-based" - ] - }, - { - "query": "tanstack query solid", - "resultsCount": 74, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/solid/quick-start", - "https://tanstack.com/query/latest/docs/framework/solid", - "https://tanstack.com/query/latest/docs/framework/solid/plugins/createPersister#installation", - "https://tanstack.com/query/latest/docs/framework/solid/overview", - "https://tanstack.com/router/latest/docs/framework/solid/overview" - ] - } - ], - "expectedDocsFound": ["query:framework/solid/overview"], - "expectedDocsMissed": [], - "totalSearches": 2, - "passed": false, - "score": 65, - "notes": [] - }, - { - "testId": "router-vue-basics", - "question": "How do I use TanStack Router with Vue?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "router overview", - "resultsCount": 44, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/routing", - "https://tanstack.com/start/latest/docs/framework/solid/guide/routing", - "https://tanstack.com/router/latest/docs/framework/react/overview", - "https://tanstack.com/router/latest/docs/framework/react/overview#a-fork-in-the-route", - "https://tanstack.com/start/latest/docs/framework/react/overview#should-i-use-tanstack-start-or-just-tanstack-router" - ] - } - ], - "expectedDocsFound": ["router:framework/react/overview"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-testing", - "question": "How do I test components that use TanStack Query?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "testing query", - "resultsCount": 22, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/testing#further-reading", - "https://tanstack.com/db/latest/docs/guides/live-queries#complex-nested-subqueries", - "https://tanstack.com/query/latest/docs/framework/react/guides/testing", - "https://tanstack.com/query/latest/docs/framework/react/guides/testing#our-first-test", - "https://tanstack.com/query/latest/docs/framework/react/guides/testing#turn-off-retries" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/testing"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-typescript", - "question": "How do I properly type TanStack Query hooks with TypeScript?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "query typescript", - "resultsCount": 138, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/typescript#further-reading", - "https://tanstack.com/query/latest/docs/framework/react/reference/queryOptions", - "https://tanstack.com/query/latest/docs/framework/vue/reference/queryOptions", - "https://tanstack.com/query/latest/docs/framework/solid/reference/queryOptions", - "https://tanstack.com/query/latest/docs/framework/react/reference/infiniteQueryOptions" - ] - } - ], - "expectedDocsFound": ["query:framework/react/typescript"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-scroll-restoration", - "question": "How do I handle scroll position restoration in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "scroll restoration", - "resultsCount": 25, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/scroll-restoration", - "https://tanstack.com/query/latest/docs/framework/react/guides/scroll-restoration", - "https://tanstack.com/router/latest/docs/framework/react/guide/scroll-restoration#hashtop-of-page-scrolling", - "https://tanstack.com/router/latest/docs/framework/react/guide/scroll-restoration#scroll-to-top--nested-scrollable-areas", - "https://tanstack.com/router/latest/docs/framework/react/guide/scroll-restoration#scroll-restoration" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/scroll-restoration"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-error-handling", - "question": "How do I handle route errors and show error boundaries in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "router error boundary", - "resultsCount": 34, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultoncatch-property", - "https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#handling-errors-with-routeoptionserrorcomponent", - "https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#handling-errors-with-routeoptionserrorcomponent", - "https://tanstack.com/start/latest/docs/framework/react/guide/error-boundaries#error-boundaries-react-start", - "https://tanstack.com/start/latest/docs/framework/solid/guide/error-boundaries#error-boundaries-solid-start" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/data-loading"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-pending-ui", - "question": "How do I show loading states during navigation in TanStack Router?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "pending component", - "resultsCount": 70, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#showing-a-pending-component", - "https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#avoiding-pending-component-flash", - "https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#showing-a-pending-component", - "https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#avoiding-pending-component-flash", - "https://tanstack.com/router/latest/docs/framework/react/api/router/RouteOptionsType#pendingcomponent-property" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/data-loading"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-forms", - "question": "How do I handle form submissions with server actions in TanStack Start?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "server functions", - "resultsCount": 290, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/streaming-data-from-server-functions", - "https://tanstack.com/start/latest/docs/framework/react/guide/static-server-functions", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-functions", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-functions#what-are-server-functions", - "https://tanstack.com/start/latest/docs/framework/react/guide/streaming-data-from-server-functions#typed-readable-streams" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/server-functions"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-head-meta", - "question": "How do I set page titles and meta tags in TanStack Start?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "document head", - "resultsCount": 46, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/document-head-management", - "https://tanstack.com/router/latest/docs/framework/react/guide/document-head-management#managing-the-document-head", - "https://tanstack.com/router/latest/docs/framework/react/guide/document-head-management#managing-body-scripts", - "https://tanstack.com/router/latest/docs/framework/react/guide/document-head-management#deduping", - "https://tanstack.com/router/latest/docs/framework/react/guide/document-head-management#headcontent-" - ] - } - ], - "expectedDocsFound": [ - "router:framework/react/guide/document-head-management" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-enabled-button-click", - "question": "How do I trigger a query only when a button is clicked instead of on component mount?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "disable query", - "resultsCount": 72, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/react-native#disable-queries-on-out-of-focus-screens", - "https://tanstack.com/query/latest/docs/framework/react/guides/disabling-queries", - "https://tanstack.com/query/latest/docs/framework/vue/guides/disabling-queries", - "https://tanstack.com/query/latest/docs/framework/solid/guides/disabling-queries", - "https://tanstack.com/query/latest/docs/framework/angular/guides/disabling-queries" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/disabling-queries"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-stale-cache-time", - "question": "What is the difference between staleTime and gcTime (cacheTime) in TanStack Query?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "staleTime gcTime", - "resultsCount": 23, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/comparison#built-in-client-side-caching", - "https://tanstack.com/db/latest/docs/reference/interfaces/BaseCollectionConfig#startsync", - "https://tanstack.com/db/latest/docs/reference/interfaces/LocalStorageCollectionConfig#startsync", - "https://tanstack.com/db/latest/docs/reference/interfaces/CollectionConfig#startsync", - "https://tanstack.com/query/latest/docs/reference/timeoutManager" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/caching"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "query-conditional-enabled", - "question": "How do I conditionally run a query based on some state or prop in TanStack Query?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "dependent queries", - "resultsCount": 100, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/dependent-queries", - "https://tanstack.com/query/latest/docs/framework/react/guides/dependent-queries#usequery-dependent-query", - "https://tanstack.com/query/latest/docs/framework/react/guides/dependent-queries#usequeries-dependent-query", - "https://tanstack.com/query/latest/docs/framework/react/guides/dependent-queries#a-note-about-performance", - "https://tanstack.com/query/latest/docs/framework/vue/guides/dependent-queries" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/dependent-queries"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-callbacks-deprecated", - "question": "The onSuccess, onError, and onSettled callbacks are deprecated in TanStack Query. What should I use instead?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "migrate v5", - "resultsCount": 3, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/migrating-to-v5#codemod", - "https://tanstack.com/query/latest/docs/framework/vue/guides/migrating-to-v5#codemod", - "https://tanstack.com/query/latest/docs/framework/svelte/migrate-from-v5-to-v6" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/migrating-to-v5"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-provider-error", - "question": "I'm getting 'No QueryClient set, use QueryClientProvider to set one'. How do I fix this?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "QueryClientProvider", - "resultsCount": 23, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/reference/QueryClientProvider", - "https://tanstack.com/query/latest/docs/framework/svelte/reference/type-aliases/QueryClientProviderProps", - "https://tanstack.com/query/latest/docs/framework/svelte/reference/type-aliases/QueryClientProviderProps#properties", - "https://tanstack.com/query/latest/docs/framework/svelte/reference/type-aliases/QueryClientProviderProps#children", - "https://tanstack.com/query/latest/docs/framework/svelte/reference/type-aliases/QueryClientProviderProps#client" - ] - }, - { - "query": "quick start query", - "resultsCount": 19, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/quick-start", - "https://tanstack.com/start/latest/docs/framework/react/quick-start#examples", - "https://tanstack.com/start/latest/docs/framework/react/quick-start#other-router-examples", - "https://tanstack.com/query/latest/docs/framework/vue/quick-start", - "https://tanstack.com/query/latest/docs/framework/solid/quick-start" - ] - } - ], - "expectedDocsFound": ["query:framework/react/quick-start"], - "expectedDocsMissed": [], - "totalSearches": 2, - "passed": true, - "score": 85, - "notes": [] - }, - { - "testId": "table-default-sorting", - "question": "How do I set a default/initial sort order when the table first loads in TanStack Table?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "initial sorting", - "resultsCount": 4, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/guide/sorting#initial-sorting-state", - "https://tanstack.com/table/latest/docs/api/features/sorting#resetsorting", - "https://tanstack.com/table/latest/docs/guide/sorting#sorting-apis", - "https://tanstack.com/table/latest/docs/guide/custom-features#getdefaultcolumndef" - ] - } - ], - "expectedDocsFound": ["table:guide/sorting"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "table-column-visibility", - "question": "How do I hide or show columns dynamically in TanStack Table?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "column visibility", - "resultsCount": 48, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/guide/column-visibility", - "https://tanstack.com/table/latest/docs/guide/column-visibility#examples", - "https://tanstack.com/table/latest/docs/guide/column-visibility#api", - "https://tanstack.com/table/latest/docs/guide/column-visibility#column-visibility-guide", - "https://tanstack.com/table/latest/docs/guide/column-visibility#other-examples" - ] - } - ], - "expectedDocsFound": ["table:guide/column-visibility"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "table-row-click-handler", - "question": "How do I handle row click events and select a row when clicked in TanStack Table?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "row selection", - "resultsCount": 60, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/guide/row-selection", - "https://tanstack.com/table/latest/docs/guide/row-selection#examples", - "https://tanstack.com/table/latest/docs/guide/row-selection#api", - "https://tanstack.com/table/latest/docs/guide/row-selection#row-selection-guide", - "https://tanstack.com/table/latest/docs/guide/row-selection#access-row-selection-state" - ] - } - ], - "expectedDocsFound": ["table:guide/row-selection"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "virtual-scroll-to-index", - "question": "How do I programmatically scroll to a specific item/index in TanStack Virtual?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "scrollToIndex", - "resultsCount": 1, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/virtual/latest/docs/api/virtualizer#scrolltoindex" - ] - } - ], - "expectedDocsFound": ["virtual:api/virtualizer"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-parallel-queries", - "question": "How do I run multiple queries in parallel with TanStack Query?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "parallel queries", - "resultsCount": 46, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/parallel-queries", - "https://tanstack.com/query/latest/docs/framework/react/guides/parallel-queries#manual-parallel-queries", - "https://tanstack.com/query/latest/docs/framework/react/guides/parallel-queries#dynamic-parallel-queries-with-usequeries", - "https://tanstack.com/query/latest/docs/framework/vue/guides/parallel-queries", - "https://tanstack.com/query/latest/docs/framework/solid/guides/parallel-queries" - ] - } - ], - "expectedDocsFound": ["query:framework/react/guides/parallel-queries"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "query-placeholder-data", - "question": "How do I show placeholder or initial data while my query is loading in TanStack Query?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "placeholder data", - "resultsCount": 70, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/placeholder-query-data", - "https://tanstack.com/query/latest/docs/framework/react/guides/placeholder-query-data#what-is-placeholder-data", - "https://tanstack.com/query/latest/docs/framework/react/guides/placeholder-query-data#placeholder-data-as-a-value", - "https://tanstack.com/query/latest/docs/framework/react/guides/placeholder-query-data#placeholder-data-as-a-function", - "https://tanstack.com/query/latest/docs/framework/react/guides/placeholder-query-data#further-reading" - ] - } - ], - "expectedDocsFound": [ - "query:framework/react/guides/placeholder-query-data" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-link-active-state", - "question": "How do I style the active link differently when on that route in TanStack Router?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "Link active", - "resultsCount": 22, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/api/router/ActiveLinkOptionsType", - "https://tanstack.com/router/latest/docs/framework/react/api/router/ActiveLinkOptionsType#activelinkoptions-properties", - "https://tanstack.com/router/latest/docs/framework/react/api/router/ActiveLinkOptionsType#activeprops", - "https://tanstack.com/router/latest/docs/framework/react/api/router/ActiveLinkOptionsType#inactiveprops", - "https://tanstack.com/router/latest/docs/framework/react/api/router/useLinkPropsHook#uselinkprops-options" - ] - } - ], - "expectedDocsFound": [ - "router:framework/react/api/router/ActiveLinkOptionsType" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-layout-routes", - "question": "How do I create layout routes that wrap child routes with shared UI in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "layout routes", - "resultsCount": 69, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/server-routes#pathless-layout-routes-and-break-out-routes", - "https://tanstack.com/start/latest/docs/framework/solid/guide/server-routes#pathless-layout-routes-and-break-out-routes", - "https://tanstack.com/router/latest/docs/framework/react/routing/routing-concepts#layout-routes", - "https://tanstack.com/router/latest/docs/framework/react/routing/routing-concepts#pathless-layout-routes", - "https://tanstack.com/router/latest/docs/framework/react/routing/code-based-routing#layout-routes" - ] - } - ], - "expectedDocsFound": ["router:framework/react/routing/routing-concepts"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-pathless-layout", - "question": "How do I create a pathless layout route that groups routes without adding to the URL path?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "pathless layout", - "resultsCount": 29, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/server-routes#pathless-layout-routes-and-break-out-routes", - "https://tanstack.com/start/latest/docs/framework/solid/guide/server-routes#pathless-layout-routes-and-break-out-routes", - "https://tanstack.com/router/latest/docs/framework/react/routing/routing-concepts#pathless-layout-routes", - "https://tanstack.com/router/latest/docs/framework/react/routing/code-based-routing#pathless-layout-routes", - "https://tanstack.com/router/latest/docs/framework/solid/routing/routing-concepts#pathless-layout-routes" - ] - } - ], - "expectedDocsFound": ["router:framework/react/routing/routing-concepts"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-route-context", - "question": "How do I pass data through route context to child routes in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "route context", - "resultsCount": 188, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/api/router/useRouteContextHook", - "https://tanstack.com/router/latest/docs/framework/react/api/router/rootRouteWithContextFunction", - "https://tanstack.com/router/latest/docs/framework/react/api/router/createRootRouteWithContextFunction", - "https://tanstack.com/router/latest/docs/framework/react/api/router/useRouteContextHook#useroutecontext-options", - "https://tanstack.com/router/latest/docs/framework/react/api/router/rootRouteWithContextFunction#rootroutewithcontext-generics" - ] - } - ], - "expectedDocsFound": [ - "router:framework/react/api/router/createRootRouteWithContextFunction" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-use-navigate", - "question": "How do I programmatically navigate to a route in TanStack Router?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "useNavigate", - "resultsCount": 36, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/api/router/useNavigateHook", - "https://tanstack.com/router/latest/docs/framework/react/api/router/useNavigateHook#usenavigate-options", - "https://tanstack.com/router/latest/docs/framework/react/api/router/useNavigateHook#usenavigate-returns", - "https://tanstack.com/router/latest/docs/framework/react/api/router/useNavigateHook#navigate-function", - "https://tanstack.com/router/latest/docs/framework/react/api/router/useNavigateHook#examples" - ] - } - ], - "expectedDocsFound": [ - "router:framework/react/api/router/useNavigateHook" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-catch-all-splat", - "question": "How do I create a catch-all or splat route that matches any path in TanStack Router?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "splat route", - "resultsCount": 73, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/routing/routing-concepts#splat--catch-all-routes", - "https://tanstack.com/router/latest/docs/framework/solid/routing/routing-concepts#splat--catch-all-routes", - "https://tanstack.com/start/latest/docs/framework/react/guide/routing#types-of-routes", - "https://tanstack.com/start/latest/docs/framework/solid/guide/routing#types-of-routes", - "https://tanstack.com/start/latest/docs/framework/react/migrate-from-next-js#dynamic-and-catch-all-routes" - ] - } - ], - "expectedDocsFound": ["router:framework/react/routing/routing-concepts"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-file-based-routing", - "question": "How does file-based routing work in TanStack Router?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "file based routing", - "resultsCount": 139, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/routing/file-based-routing", - "https://tanstack.com/router/latest/docs/framework/react/routing/file-based-routing#what-is-file-based-routing", - "https://tanstack.com/router/latest/docs/framework/react/routing/file-based-routing#s-or-s", - "https://tanstack.com/router/latest/docs/framework/react/routing/file-based-routing#directory-routes", - "https://tanstack.com/router/latest/docs/framework/react/routing/file-based-routing#flat-routes" - ] - } - ], - "expectedDocsFound": [ - "router:framework/react/routing/file-based-routing" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-navigate-search-params", - "question": "How do I navigate while preserving or modifying search params in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "search params navigation", - "resultsCount": 39, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/overview", - "https://tanstack.com/router/latest/docs/framework/solid/overview", - "https://tanstack.com/start/latest/docs/framework/react/comparison#-tanstack-router-comparison-vs-react-router--nextjs-", - "https://tanstack.com/router/latest/docs/framework/react/guide/route-masking", - "https://tanstack.com/router/latest/docs/framework/solid/guide/route-masking" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/search-params"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "router-redirect-beforeload", - "question": "How do I redirect users in TanStack Router before the route loads?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "redirect beforeLoad", - "resultsCount": 13, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/authenticated-routes#redirecting", - "https://tanstack.com/router/latest/docs/framework/solid/guide/authenticated-routes#redirecting", - "https://tanstack.com/router/latest/docs/framework/react/guide/authenticated-routes#authentication-using-react-contexthooks", - "https://tanstack.com/router/latest/docs/framework/solid/guide/authenticated-routes#authentication-using-react-contexthooks", - "https://tanstack.com/router/latest/docs/framework/react/api/router/redirectFunction" - ] - } - ], - "expectedDocsFound": [ - "router:framework/react/guide/authenticated-routes" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-route-masking", - "question": "How do I show a different URL in the browser than the actual route in TanStack Router?", - "difficulty": "hard", - "searchesPerformed": [ - { - "query": "route masking", - "resultsCount": 48, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/route-masking", - "https://tanstack.com/router/latest/docs/framework/react/guide/route-masking#how-does-route-masking-work", - "https://tanstack.com/router/latest/docs/framework/react/guide/route-masking#how-do-i-use-route-masking", - "https://tanstack.com/router/latest/docs/framework/react/guide/route-masking#unmasking-when-sharing-the-url", - "https://tanstack.com/router/latest/docs/framework/react/guide/route-masking#local-unmasking-defaults" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/route-masking"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-ssr-streaming", - "question": "How does SSR and streaming work in TanStack Router?", - "difficulty": "hard", - "searchesPerformed": [ - { - "query": "ssr router guide", - "resultsCount": 23, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#to-router-cache-or-not-to-router-cache", - "https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#to-router-cache-or-not-to-router-cache", - "https://tanstack.com/router/latest/docs/framework/react/guide/ssr", - "https://tanstack.com/router/latest/docs/framework/solid/guide/ssr", - "https://tanstack.com/router/latest/docs/framework/react/guide/external-data-loading" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/ssr"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-external-data-loading", - "question": "How do I use TanStack Router with an external data fetching library like TanStack Query?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "external data loading", - "resultsCount": 32, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/external-data-loading", - "https://tanstack.com/router/latest/docs/framework/react/guide/external-data-loading#to-store-or-to-coordinate", - "https://tanstack.com/router/latest/docs/framework/react/guide/external-data-loading#what-data-fetching-libraries-are-supported", - "https://tanstack.com/router/latest/docs/framework/react/guide/external-data-loading#using-loaders-to-ensure-data-is-loaded", - "https://tanstack.com/router/latest/docs/framework/react/guide/external-data-loading#a-more-realistic-example-using-tanstack-query" - ] - } - ], - "expectedDocsFound": [ - "router:framework/react/guide/external-data-loading" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-execution-model", - "question": "How do I understand where my code runs in TanStack Start (server vs client)?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "execution model", - "resultsCount": 71, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/execution-model", - "https://tanstack.com/start/latest/docs/framework/react/guide/execution-model#core-principle-isomorphic-by-default", - "https://tanstack.com/start/latest/docs/framework/react/guide/execution-model#the-execution-boundary", - "https://tanstack.com/start/latest/docs/framework/react/guide/execution-model#execution-control-apis", - "https://tanstack.com/start/latest/docs/framework/react/guide/execution-model#architectural-patterns" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/execution-model"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-server-only-code", - "question": "How do I ensure code only runs on the server in TanStack Start?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "server only code", - "resultsCount": 32, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/execution-model#bundle-analysis", - "https://tanstack.com/start/latest/docs/framework/solid/guide/execution-model#bundle-analysis", - "https://tanstack.com/start/latest/docs/framework/react/guide/code-execution-patterns#production-checklist", - "https://tanstack.com/start/latest/docs/framework/solid/guide/code-execution-patterns#production-checklist", - "https://tanstack.com/start/latest/docs/framework/react/guide/code-execution-patterns" - ] - } - ], - "expectedDocsFound": [ - "start:framework/react/guide/code-execution-patterns" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-authentication", - "question": "How do I implement authentication in TanStack Start?", - "difficulty": "hard", - "searchesPerformed": [ - { - "query": "authentication start", - "resultsCount": 133, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/how-to/setup-authentication#user-logged-out-on-page-refresh", - "https://tanstack.com/router/latest/docs/framework/react/how-to/setup-authentication#add-authentication-persistence", - "https://tanstack.com/router/latest/docs/framework/react/guide/authenticated-routes#authentication-using-react-contexthooks", - "https://tanstack.com/router/latest/docs/framework/solid/guide/authenticated-routes#authentication-using-react-contexthooks", - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/authentication"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "start-auth-overview", - "question": "What authentication options are available for TanStack Start?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "authentication overview", - "resultsCount": 16, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication", - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication#next-steps", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication#next-steps", - "https://tanstack.com/router/latest/docs/framework/react/overview#inherited-route-context" - ] - } - ], - "expectedDocsFound": [ - "start:framework/react/guide/authentication-overview" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "start-streaming-server-functions", - "question": "How do I stream data from a server function in TanStack Start?", - "difficulty": "hard", - "searchesPerformed": [ - { - "query": "streaming server function", - "resultsCount": 15, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/overview", - "https://tanstack.com/start/latest/docs/framework/solid/overview", - "https://tanstack.com/start/latest/docs/framework/react/guide/streaming-data-from-server-functions", - "https://tanstack.com/start/latest/docs/framework/react/guide/streaming-data-from-server-functions#typed-readable-streams", - "https://tanstack.com/start/latest/docs/framework/react/guide/streaming-data-from-server-functions#async-generators-in-server-functions" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/server-functions"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "start-tailwind", - "question": "How do I set up Tailwind CSS with TanStack Start?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "tailwind start", - "resultsCount": 28, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/tailwind-integration", - "https://tanstack.com/start/latest/docs/framework/solid/guide/tailwind-integration", - "https://tanstack.com/start/latest/docs/framework/react/quick-start#impatient", - "https://tanstack.com/router/latest/docs/framework/react/quick-start#impatient", - "https://tanstack.com/start/latest/docs/framework/solid/quick-start#impatient" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/tailwind-integration"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-database", - "question": "How do I connect to a database in TanStack Start?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "database start", - "resultsCount": 45, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/databases#what-should-i-use", - "https://tanstack.com/start/latest/docs/framework/solid/guide/databases#what-should-i-use", - "https://tanstack.com/start/latest/docs/framework/react/guide/databases#how-simple-is-it-to-use-a-database-with-tanstack-start", - "https://tanstack.com/start/latest/docs/framework/solid/guide/databases#how-simple-is-it-to-use-a-database-with-tanstack-start", - "https://tanstack.com/start/latest/docs/framework/react/guide/databases#documentation--apis" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/databases"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-migrate-nextjs", - "question": "How do I migrate from Next.js to TanStack Start?", - "difficulty": "hard", - "searchesPerformed": [ - { - "query": "migrate nextjs", - "resultsCount": 23, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/migrate-from-next-js", - "https://tanstack.com/start/latest/docs/framework/react/migrate-from-next-js#step-by-step-basics", - "https://tanstack.com/start/latest/docs/framework/react/migrate-from-next-js#next-steps-advanced", - "https://tanstack.com/start/latest/docs/framework/react/migrate-from-next-js#prerequisites", - "https://tanstack.com/start/latest/docs/framework/react/migrate-from-next-js#1-remove-nextjs" - ] - } - ], - "expectedDocsFound": ["start:framework/react/migrate-from-next-js"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-build-from-scratch", - "question": "How do I build a TanStack Start project from scratch without using a template?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "build from scratch", - "resultsCount": 24, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/build-from-scratch", - "https://tanstack.com/start/latest/docs/framework/react/build-from-scratch#typescript-configuration", - "https://tanstack.com/start/latest/docs/framework/react/build-from-scratch#install-dependencies", - "https://tanstack.com/start/latest/docs/framework/react/build-from-scratch#update-configuration-files", - "https://tanstack.com/start/latest/docs/framework/react/build-from-scratch#add-the-basic-templating" - ] - } - ], - "expectedDocsFound": ["start:framework/react/build-from-scratch"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-rendering-markdown", - "question": "How do I render markdown content in TanStack Start?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "render markdown", - "resultsCount": 2, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/rendering-markdown#method-2-dynamic-markdown-from-remote-sources", - "https://tanstack.com/start/latest/docs/framework/react/guide/rendering-markdown#creating-a-markdown-component" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/rendering-markdown"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-cloudflare-workers", - "question": "How do I deploy TanStack Start to Cloudflare Workers?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "cloudflare workers", - "resultsCount": 9, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#cloudflare-workers--official-partner", - "https://tanstack.com/start/latest/docs/framework/react/guide/isr#cloudflare-workers", - "https://tanstack.com/start/latest/docs/framework/solid/guide/hosting#cloudflare-workers--official-partner", - "https://tanstack.com/start/latest/docs/framework/solid/guide/hosting#cloudflare-workers", - "https://tanstack.com/start/latest/docs/framework/react/comparison#deployment-flexibility" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/hosting"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-vs-nextjs", - "question": "How does TanStack Start compare to Next.js?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "start vs nextjs", - "resultsCount": 22, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/comparison", - "https://tanstack.com/router/latest/docs/framework/react/comparison", - "https://tanstack.com/start/latest/docs/framework/react/comparison#key-philosophical-differences", - "https://tanstack.com/start/latest/docs/framework/react/comparison#when-to-choose-each-framework", - "https://tanstack.com/start/latest/docs/framework/react/comparison#feature-deep-dives" - ] - } - ], - "expectedDocsFound": ["start:framework/react/comparison"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-providers-location", - "question": "Where do I put providers like QueryClientProvider in TanStack Start?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "query integration setup", - "resultsCount": 6, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/integrations/query#setup", - "https://tanstack.com/router/latest/docs/integrations/query#works-with-tanstack-start", - "https://tanstack.com/query/latest/docs/framework/angular/guides/testing", - "https://tanstack.com/query/latest/docs/framework/react/guides/prefetching#router-integration", - "https://tanstack.com/query/latest/docs/framework/solid/guides/prefetching#router-integration" - ] - } - ], - "expectedDocsFound": ["router:integrations/query"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-routetree-gen-error", - "question": "I'm getting 'Cannot find module routeTree.gen' error. How do I fix it?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "routeTree.gen", - "resultsCount": 12, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/faq#should-i-commit-my-routetreegents-file-into-git", - "https://tanstack.com/router/latest/docs/framework/solid/faq#should-i-commit-my-routetreegents-file-into-git", - "https://tanstack.com/start/latest/docs/framework/react/guide/routing#route-tree-generation", - "https://tanstack.com/start/latest/docs/framework/solid/guide/routing#route-tree-generation", - "https://tanstack.com/router/latest/docs/framework/react/guide/creating-a-router#filesystem-route-tree" - ] - } - ], - "expectedDocsFound": ["router:framework/react/faq"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-exclude-layout", - "question": "How do I exclude specific routes from a parent layout in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "non-nested routes", - "resultsCount": 8, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/routing/routing-concepts#non-nested-routes", - "https://tanstack.com/router/latest/docs/framework/react/routing/code-based-routing#non-nested-routes", - "https://tanstack.com/router/latest/docs/framework/solid/routing/routing-concepts#non-nested-routes", - "https://tanstack.com/router/latest/docs/framework/solid/routing/code-based-routing#non-nested-routes", - "https://tanstack.com/router/latest/docs/framework/react/routing/code-based-routing#routing-concepts-for-code-based-routing" - ] - } - ], - "expectedDocsFound": ["router:framework/react/routing/routing-concepts"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-dynamic-nested-routes", - "question": "How do I create dynamic nested routes like /users/$userId/posts/$postId in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "dynamic route segments", - "resultsCount": 16, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/routing/routing-concepts#dynamic-route-segments", - "https://tanstack.com/router/latest/docs/framework/react/routing/code-based-routing#dynamic-route-segments", - "https://tanstack.com/router/latest/docs/framework/solid/routing/routing-concepts#dynamic-route-segments", - "https://tanstack.com/router/latest/docs/framework/solid/routing/code-based-routing#dynamic-route-segments", - "https://tanstack.com/router/latest/docs/framework/react/routing/code-based-routing#routing-concepts-for-code-based-routing" - ] - } - ], - "expectedDocsFound": ["router:framework/react/routing/routing-concepts"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-search-params-no-rerender", - "question": "How do I update search params without causing a full page re-render in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "search params shallow", - "resultsCount": 547, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/search-params", - "https://tanstack.com/router/latest/docs/framework/react/guide/custom-search-param-serialization", - "https://tanstack.com/router/latest/docs/framework/react/guide/search-params#why-not-just-use-urlsearchparams", - "https://tanstack.com/router/latest/docs/framework/react/guide/custom-search-param-serialization#using-base64", - "https://tanstack.com/router/latest/docs/framework/react/guide/search-params#search-params-the-og-state-manager" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/search-params"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-link-typesafe-wrapper", - "question": "How do I wrap TanStack Router's Link component while keeping type safety?", - "difficulty": "hard", - "searchesPerformed": [ - { - "query": "custom link", - "resultsCount": 23, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/guide/custom-link", - "https://tanstack.com/router/latest/docs/framework/react/guide/custom-link#createlink-for-cross-cutting-concerns", - "https://tanstack.com/router/latest/docs/framework/react/guide/custom-link#createlink-with-third-party-libraries", - "https://tanstack.com/router/latest/docs/framework/react/guide/custom-link#basic-example", - "https://tanstack.com/router/latest/docs/framework/react/guide/custom-link#react-aria-components-example" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/custom-link"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-error-boundary-disable", - "question": "How do I disable or customize the error boundary in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "error boundary router", - "resultsCount": 34, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#defaultoncatch-property", - "https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#handling-errors-with-routeoptionserrorcomponent", - "https://tanstack.com/router/latest/docs/framework/solid/guide/data-loading#handling-errors-with-routeoptionserrorcomponent", - "https://tanstack.com/router/latest/docs/framework/react/overview#why-tanstack-router", - "https://tanstack.com/router/latest/docs/framework/solid/overview#why-tanstack-router" - ] - } - ], - "expectedDocsFound": ["router:framework/react/guide/data-loading"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "router-generate-href", - "question": "How do I generate a URL/href string for a route without navigating in TanStack Router?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "buildLocation", - "resultsCount": 1, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/router/latest/docs/framework/react/api/router/RouterType#buildlocation-method" - ] - } - ], - "expectedDocsFound": ["router:framework/react/api/router/RouterType"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "start-server-fn-validation", - "question": "How do I validate input data in a TanStack Start server function?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "server function validation", - "resultsCount": 21, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication-overview#route-protection-architecture", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication-overview#route-protection-architecture", - "https://tanstack.com/start/latest/docs/framework/react/tutorial/reading-writing-file#form-submission-issues", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-functions#parameters--validation", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-functions#basic-parameters" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/server-functions"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "start-env-variables", - "question": "How do I use environment variables in TanStack Start?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "environment variables", - "resultsCount": 85, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/environment-variables", - "https://tanstack.com/start/latest/docs/framework/react/guide/environment-variables#quick-start", - "https://tanstack.com/start/latest/docs/framework/react/guide/environment-variables#environment-variable-contexts", - "https://tanstack.com/start/latest/docs/framework/react/guide/environment-variables#environment-file-setup", - "https://tanstack.com/start/latest/docs/framework/react/guide/environment-variables#common-patterns" - ] - } - ], - "expectedDocsFound": [ - "start:framework/react/guide/environment-variables" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "partner-database-recommendation", - "question": "What database should I use with TanStack Start?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "database start", - "resultsCount": 45, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/databases#what-should-i-use", - "https://tanstack.com/start/latest/docs/framework/solid/guide/databases#what-should-i-use", - "https://tanstack.com/start/latest/docs/framework/react/guide/databases#how-simple-is-it-to-use-a-database-with-tanstack-start", - "https://tanstack.com/start/latest/docs/framework/solid/guide/databases#how-simple-is-it-to-use-a-database-with-tanstack-start", - "https://tanstack.com/start/latest/docs/framework/react/guide/databases#documentation--apis" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/databases"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "partner-auth-recommendation", - "question": "What authentication solution should I use with TanStack Start?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "authentication overview", - "resultsCount": 16, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication", - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication#next-steps", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication#next-steps", - "https://tanstack.com/router/latest/docs/framework/react/overview#inherited-route-context" - ] - } - ], - "expectedDocsFound": [ - "start:framework/react/guide/authentication-overview" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "partner-hosting-recommendation", - "question": "Where should I deploy my TanStack Start application?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "hosting start", - "resultsCount": 44, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#what-should-i-use", - "https://tanstack.com/start/latest/docs/framework/solid/guide/hosting#what-should-i-use", - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#deployment", - "https://tanstack.com/start/latest/docs/framework/solid/guide/hosting#deployment", - "https://tanstack.com/start/latest/docs/framework/react/overview" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/hosting"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "partner-table-upgrade", - "question": "I need more advanced features than TanStack Table provides. What should I use?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "table ag grid", - "resultsCount": 9, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/table/latest/docs/enterprise/ag-grid#conclusion", - "https://tanstack.com/table/latest/docs/introduction#component-based-table-libraries", - "https://tanstack.com/table/latest/docs/enterprise/ag-grid", - "https://tanstack.com/table/latest/docs/enterprise/ag-grid#why-choose-ag-grid", - "https://tanstack.com/table/latest/docs/enterprise/ag-grid#comprehensive-feature-set" - ] - } - ], - "expectedDocsFound": ["table:introduction"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "partner-neon-setup", - "question": "How do I connect Neon database to my TanStack Start app?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "neon database", - "resultsCount": 4, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/databases#recommended-database-providers", - "https://tanstack.com/start/latest/docs/framework/solid/guide/databases#recommended-database-providers", - "https://tanstack.com/start/latest/docs/framework/react/guide/databases#what-is-neon", - "https://tanstack.com/start/latest/docs/framework/solid/guide/databases#what-is-neon" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/databases"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "partner-clerk-setup", - "question": "How do I add Clerk authentication to TanStack Start?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "clerk authentication", - "resultsCount": 25, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication-overview#clerk---complete-authentication-platform", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication-overview#clerk---complete-authentication-platform", - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication#authentication-approaches", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication#authentication-approaches", - "https://tanstack.com/router/latest/docs/framework/react/how-to/setup-auth-providers" - ] - } - ], - "expectedDocsFound": [ - "start:framework/react/guide/authentication-overview" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "partner-error-monitoring", - "question": "How do I set up error monitoring for my TanStack app?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "error monitoring", - "resultsCount": 13, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/observability#other-popular-tools", - "https://tanstack.com/start/latest/docs/framework/solid/guide/observability#other-popular-tools", - "https://tanstack.com/start/latest/docs/framework/react/guide/observability#partner-solution-sentry", - "https://tanstack.com/start/latest/docs/framework/solid/guide/observability#partner-solution-sentry", - "https://tanstack.com/pacer/latest/docs/framework/react/reference/functions/useAsyncBatcher" - ] - }, - { - "query": "sentry start", - "resultsCount": 42, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/observability#partner-solution-sentry", - "https://tanstack.com/start/latest/docs/framework/solid/guide/observability#partner-solution-sentry", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-routes#handling-server-route-requests", - "https://tanstack.com/start/latest/docs/framework/solid/guide/server-routes#handling-server-route-requests", - "https://tanstack.com/start/latest/docs/framework/react/guide/server-entry-point" - ] - } - ], - "expectedDocsFound": [], - "expectedDocsMissed": ["start:framework/react/guide/error-handling"], - "totalSearches": 2, - "passed": false, - "score": 65, - "notes": [] - }, - { - "testId": "partner-cms-recommendation", - "question": "What CMS should I use with TanStack Start for content management?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "cms start", - "resultsCount": 3160, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/store/latest/docs/framework/react/quick-start", - "https://tanstack.com/start/latest/docs/framework/react/quick-start", - "https://tanstack.com/start/latest/docs/framework/react/overview", - "https://tanstack.com/router/latest/docs/framework/react/quick-start", - "https://tanstack.com/query/latest/docs/framework/react/quick-start" - ] - }, - { - "query": "headless cms tanstack", - "resultsCount": 1778, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/form/latest/docs/framework/react/guides/react-native", - "https://tanstack.com/table/latest/docs/overview#headless", - "https://tanstack.com/form/latest/docs/framework/react/guides/ui-libraries#usage-of-tanstack-form-with-ui-libraries", - "https://tanstack.com/table/latest/docs/guide/tables#table-instance-guide", - "https://tanstack.com/virtual/latest/docs/introduction" - ] - } - ], - "expectedDocsFound": [], - "expectedDocsMissed": ["start:framework/react/guide/rendering-markdown"], - "totalSearches": 2, - "passed": false, - "score": 65, - "notes": [] - }, - { - "testId": "ecosystem-postgres-alias", - "question": "I need a postgres database for my TanStack Start app", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "databases guide", - "resultsCount": 4, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/databases#documentation--apis", - "https://tanstack.com/pacer/latest/docs/guides/async-batching#when-to-use-async-batching", - "https://tanstack.com/pacer/latest/docs/guides/batching#when-to-use-batching", - "https://tanstack.com/start/latest/docs/framework/solid/guide/databases#documentation--apis" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/databases"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "ecosystem-login-alias", - "question": "How do I add login functionality to my app?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "authentication overview", - "resultsCount": 16, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication", - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication#next-steps", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication#next-steps", - "https://tanstack.com/router/latest/docs/framework/react/overview#inherited-route-context" - ] - } - ], - "expectedDocsFound": [ - "start:framework/react/guide/authentication-overview" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "ecosystem-serverless-alias", - "question": "What serverless hosting options work with TanStack Start?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "hosting guide", - "resultsCount": 7, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/build-from-scratch#writing-your-first-route", - "https://tanstack.com/start/latest/docs/framework/solid/build-from-scratch#writing-your-first-route", - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#deployment", - "https://tanstack.com/start/latest/docs/framework/solid/guide/hosting#deployment", - "https://tanstack.com/start/latest/docs/framework/react/guide/hosting#bun" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/hosting"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "ecosystem-error-tracking-alias", - "question": "I need error tracking for production", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "observability", - "resultsCount": 50, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/observability", - "https://tanstack.com/start/latest/docs/framework/react/guide/observability#partner-solution-sentry", - "https://tanstack.com/start/latest/docs/framework/react/guide/observability#built-in-observability-patterns", - "https://tanstack.com/start/latest/docs/framework/react/guide/observability#external-observability-tools", - "https://tanstack.com/start/latest/docs/framework/react/guide/observability#best-practices" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/observability"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "ecosystem-library-filter", - "question": "What ecosystem integrations are available for TanStack Table?", - "difficulty": "easy", - "searchesPerformed": [ - { - "query": "table introduction", - "resultsCount": 12, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/query/latest/docs/framework/react/guides/request-waterfalls#single-component-waterfalls--serial-queries", - "https://tanstack.com/query/latest/docs/framework/solid/guides/request-waterfalls#single-component-waterfalls--serial-queries", - "https://tanstack.com/query/latest/docs/framework/react/guides/dependent-queries#a-note-about-performance", - "https://tanstack.com/query/latest/docs/framework/vue/guides/dependent-queries#a-note-about-performance", - "https://tanstack.com/query/latest/docs/framework/solid/guides/dependent-queries#a-note-about-performance" - ] - } - ], - "expectedDocsFound": ["table:introduction"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "ecosystem-sso-enterprise", - "question": "I need SSO and enterprise authentication features", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "authentication overview", - "resultsCount": 16, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication", - "https://tanstack.com/start/latest/docs/framework/react/guide/authentication#next-steps", - "https://tanstack.com/start/latest/docs/framework/solid/guide/authentication#next-steps", - "https://tanstack.com/router/latest/docs/framework/react/overview#inherited-route-context" - ] - } - ], - "expectedDocsFound": [ - "start:framework/react/guide/authentication-overview" - ], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 80, - "notes": [] - }, - { - "testId": "ecosystem-realtime-database", - "question": "I need a real-time database with live queries", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "databases guide", - "resultsCount": 4, - "foundExpectedDoc": true, - "topResults": [ - "https://tanstack.com/start/latest/docs/framework/react/guide/databases#documentation--apis", - "https://tanstack.com/pacer/latest/docs/guides/async-batching#when-to-use-async-batching", - "https://tanstack.com/pacer/latest/docs/guides/batching#when-to-use-batching", - "https://tanstack.com/start/latest/docs/framework/solid/guide/databases#documentation--apis" - ] - } - ], - "expectedDocsFound": ["start:framework/react/guide/databases"], - "expectedDocsMissed": [], - "totalSearches": 1, - "passed": true, - "score": 100, - "notes": [] - }, - { - "testId": "ecosystem-rate-limiting", - "question": "How do I add rate limiting to my API?", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "rate limiting", - "resultsCount": 87, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/pacer/latest/docs/guides/rate-limiting", - "https://tanstack.com/pacer/latest/docs/guides/async-rate-limiting", - "https://tanstack.com/pacer/latest/docs/guides/rate-limiting#rate-limiting-concept", - "https://tanstack.com/pacer/latest/docs/guides/async-rate-limiting#when-to-use-async-rate-limiting", - "https://tanstack.com/pacer/latest/docs/guides/async-rate-limiting#async-rate-limiting-in-tanstack-pacer" - ] - }, - { - "query": "pacer", - "resultsCount": 2176, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/pacer/latest/docs/guides/which-pacer-utility-should-i-choose", - "https://tanstack.com/pacer/latest/docs/guides/which-pacer-utility-should-i-choose#synchronous-vs-asynchronous", - "https://tanstack.com/pacer/latest/docs/guides/which-pacer-utility-should-i-choose#pacer-lite-vs-pacer", - "https://tanstack.com/pacer/latest/docs/guides/which-pacer-utility-should-i-choose#which-hook-variation-should-i-use", - "https://tanstack.com/pacer/latest/docs/guides/which-pacer-utility-should-i-choose#when-to-use-the-asynchronous-version" - ] - } - ], - "expectedDocsFound": [], - "expectedDocsMissed": ["pacer:overview"], - "totalSearches": 2, - "passed": false, - "score": 65, - "notes": [] - }, - { - "testId": "ecosystem-offline-sync", - "question": "I need offline-first sync capabilities for my app", - "difficulty": "medium", - "searchesPerformed": [ - { - "query": "tanstack db", - "resultsCount": 363, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/db/latest/docs/framework/react/overview", - "https://tanstack.com/db/latest/docs/framework/react/overview#installation", - "https://tanstack.com/db/latest/docs/framework/react/overview#react-hooks", - "https://tanstack.com/db/latest/docs/framework/react/overview#basic-usage", - "https://tanstack.com/db/latest/docs/framework/react/overview#uselivequery" - ] - }, - { - "query": "sync", - "resultsCount": 857, - "foundExpectedDoc": false, - "topResults": [ - "https://tanstack.com/db/latest/docs/reference/interfaces/SyncConfig#sync", - "https://tanstack.com/db/latest/docs/reference/interfaces/SyncConfig#parameters", - "https://tanstack.com/db/latest/docs/reference/interfaces/SyncConfig#returns-1", - "https://tanstack.com/db/latest/docs/reference/interfaces/SyncConfig#params", - "https://tanstack.com/db/latest/docs/reference/interfaces/SyncConfig#begin" - ] - } - ], - "expectedDocsFound": [], - "expectedDocsMissed": ["db:overview"], - "totalSearches": 2, - "passed": true, - "score": 85, - "notes": [] - } - ] -} diff --git a/scripts/mcp-eval/run-eval.ts b/scripts/mcp-eval/run-eval.ts deleted file mode 100644 index f81b5cf81..000000000 --- a/scripts/mcp-eval/run-eval.ts +++ /dev/null @@ -1,351 +0,0 @@ -/** - * MCP Documentation Discoverability Evaluation Runner - * - * This script tests how well the TanStack MCP server helps AI assistants - * find the right documentation to answer questions. - * - * Usage: - * npx tsx scripts/mcp-eval/run-eval.ts - * npx tsx scripts/mcp-eval/run-eval.ts --test router-query-ssr-integration - * npx tsx scripts/mcp-eval/run-eval.ts --tag start - */ - -import testCases from './test-cases.json' - -const MCP_URL = process.env.MCP_URL || 'http://localhost:3001/api/mcp' -const MCP_API_KEY = process.env.MCP_API_KEY - -interface SearchResult { - title: string - url: string - library: string - breadcrumb: string[] -} - -interface McpResponse { - result?: { - content: Array<{ type: string; text: string }> - } - error?: { - code: number - message: string - } -} - -interface TestResult { - testId: string - question: string - difficulty: string - searchesPerformed: Array<{ - query: string - resultsCount: number - foundExpectedDoc: boolean - topResults: string[] - }> - expectedDocsFound: string[] - expectedDocsMissed: string[] - totalSearches: number - passed: boolean - score: number - notes: string[] -} - -async function callMcp(method: string, params: object): Promise { - const headers: Record = { - 'Content-Type': 'application/json', - Accept: 'application/json, text/event-stream', - } - - if (MCP_API_KEY) { - headers['Authorization'] = `Bearer ${MCP_API_KEY}` - } - - // First initialize - await fetch(MCP_URL, { - method: 'POST', - headers, - body: JSON.stringify({ - jsonrpc: '2.0', - id: 0, - method: 'initialize', - params: { - protocolVersion: '2024-11-05', - capabilities: {}, - clientInfo: { name: 'mcp-eval', version: '1.0.0' }, - }, - }), - }) - - // Then call the tool - const response = await fetch(MCP_URL, { - method: 'POST', - headers, - body: JSON.stringify({ - jsonrpc: '2.0', - id: 1, - method: 'tools/call', - params: { - name: method, - arguments: params, - }, - }), - }) - - return response.json() -} - -async function searchDocs( - query: string, - library?: string, -): Promise<{ results: SearchResult[]; totalHits: number }> { - const response = await callMcp('search_docs', { - query, - library, - limit: 10, - }) - - if (response.error) { - throw new Error(response.error.message) - } - - const text = response.result?.content[0]?.text || '{}' - return JSON.parse(text) -} - -async function getDoc( - library: string, - path: string, -): Promise<{ title: string; content: string } | null> { - try { - const response = await callMcp('get_doc', { library, path }) - if (response.error) return null - - const metaText = response.result?.content[0]?.text || '{}' - const contentText = response.result?.content[1]?.text || '' - - return { - ...JSON.parse(metaText), - content: contentText, - } - } catch { - return null - } -} - -function extractPathFromUrl(url: string): string { - // Extract path from URL like https://tanstack.com/router/latest/docs/integrations/query - // Also handle anchors like #some-section - const match = url.match(/\/docs\/([^#]+)/) - return match ? match[1] : '' -} - -async function runTestCase( - testCase: (typeof testCases.testCases)[0], -): Promise { - const result: TestResult = { - testId: testCase.id, - question: testCase.question, - difficulty: testCase.difficulty, - searchesPerformed: [], - expectedDocsFound: [], - expectedDocsMissed: [], - totalSearches: 0, - passed: false, - score: 0, - notes: [], - } - - const expectedPaths = new Set( - testCase.expectedDocs.map((d) => `${d.library}:${d.path}`), - ) - const foundPaths = new Set() - - // Try ideal search queries first - for (const query of testCase.idealSearchQueries || []) { - result.totalSearches++ - - try { - const searchResult = await searchDocs(query) - const topResults = searchResult.results.slice(0, 5).map((r) => r.url) - - let foundExpected = false - for (const r of searchResult.results) { - const path = extractPathFromUrl(r.url) - const key = `${r.library}:${path}` - - if (expectedPaths.has(key)) { - foundPaths.add(key) - foundExpected = true - } - } - - result.searchesPerformed.push({ - query, - resultsCount: searchResult.totalHits, - foundExpectedDoc: foundExpected, - topResults, - }) - - // If we found all expected docs, stop searching - if (foundPaths.size === expectedPaths.size) { - break - } - } catch (error) { - result.notes.push(`Search failed for "${query}": ${error}`) - } - } - - // Record which docs were found vs missed - for (const doc of testCase.expectedDocs) { - const key = `${doc.library}:${doc.path}` - if (foundPaths.has(key)) { - result.expectedDocsFound.push(key) - } else { - result.expectedDocsMissed.push(key) - } - } - - // Calculate score - const requiredDocs = testCase.expectedDocs.filter((d) => d.required) - const requiredFound = requiredDocs.filter((d) => - foundPaths.has(`${d.library}:${d.path}`), - ) - - // Score breakdown: - // - 50% for finding required docs - // - 30% for finding them in fewer searches - // - 20% for finding them in top results - - const requiredScore = - requiredDocs.length > 0 ? requiredFound.length / requiredDocs.length : 1 - - const searchEfficiency = Math.max( - 0, - 1 - (result.totalSearches - 1) / (testCase.idealSearchQueries?.length || 3), - ) - - // Check if expected doc appeared in top 3 results - const topResultScore = result.searchesPerformed.some((s) => { - return testCase.expectedDocs.some((doc) => - s.topResults - .slice(0, 3) - .some((url) => url.includes(doc.path.replace(/\//g, '/'))), - ) - }) - ? 1 - : 0 - - result.score = Math.round( - (requiredScore * 0.5 + searchEfficiency * 0.3 + topResultScore * 0.2) * 100, - ) - - result.passed = - requiredFound.length === requiredDocs.length && result.score >= 70 - - return result -} - -async function main() { - const args = process.argv.slice(2) - let testFilter: string | undefined - let tagFilter: string | undefined - - for (let i = 0; i < args.length; i++) { - if (args[i] === '--test' && args[i + 1]) { - testFilter = args[i + 1] - } - if (args[i] === '--tag' && args[i + 1]) { - tagFilter = args[i + 1] - } - } - - let cases = testCases.testCases - - if (testFilter) { - cases = cases.filter((c) => c.id === testFilter) - } - - if (tagFilter) { - cases = cases.filter((c) => c.tags.includes(tagFilter)) - } - - console.log(`\n🧪 Running ${cases.length} MCP evaluation test(s)...\n`) - console.log('='.repeat(60)) - - const results: TestResult[] = [] - - for (const testCase of cases) { - console.log(`\n📋 Test: ${testCase.id}`) - console.log(` Question: ${testCase.question.slice(0, 60)}...`) - - try { - const result = await runTestCase(testCase) - results.push(result) - - const status = result.passed ? '✅ PASS' : '❌ FAIL' - console.log(` ${status} (Score: ${result.score}/100)`) - console.log(` Searches: ${result.totalSearches}`) - - if (result.expectedDocsMissed.length > 0) { - console.log(` ⚠️ Missed: ${result.expectedDocsMissed.join(', ')}`) - } - - if (result.notes.length > 0) { - result.notes.forEach((n) => console.log(` 📝 ${n}`)) - } - } catch (error) { - console.log(` ❌ ERROR: ${error}`) - } - } - - console.log('\n' + '='.repeat(60)) - console.log('\n📊 Summary\n') - - const passed = results.filter((r) => r.passed).length - const total = results.length - const avgScore = Math.round( - results.reduce((sum, r) => sum + r.score, 0) / total, - ) - - console.log(` Passed: ${passed}/${total}`) - console.log(` Average Score: ${avgScore}/100`) - - // Group by difficulty - const byDifficulty = { - easy: results.filter((r) => r.difficulty === 'easy'), - medium: results.filter((r) => r.difficulty === 'medium'), - hard: results.filter((r) => r.difficulty === 'hard'), - } - - for (const [diff, tests] of Object.entries(byDifficulty)) { - if (tests.length > 0) { - const p = tests.filter((t) => t.passed).length - const avg = Math.round( - tests.reduce((s, t) => s + t.score, 0) / tests.length, - ) - console.log(` ${diff}: ${p}/${tests.length} passed (avg: ${avg})`) - } - } - - // Output detailed results as JSON - const outputPath = './scripts/mcp-eval/results.json' - const fs = await import('fs') - fs.writeFileSync( - outputPath, - JSON.stringify( - { - timestamp: new Date().toISOString(), - summary: { passed, total, avgScore }, - results, - }, - null, - 2, - ), - ) - console.log(`\n Detailed results: ${outputPath}`) - - // Exit with error if any tests failed - process.exit(passed === total ? 0 : 1) -} - -main().catch(console.error) diff --git a/scripts/mcp-eval/test-cases.json b/scripts/mcp-eval/test-cases.json deleted file mode 100644 index 52b91ad52..000000000 --- a/scripts/mcp-eval/test-cases.json +++ /dev/null @@ -1,1957 +0,0 @@ -{ - "$schema": "./test-cases.schema.json", - "version": "1.0.0", - "description": "MCP documentation discoverability test cases", - "testCases": [ - { - "id": "router-query-ssr-integration", - "question": "In TanStack Start, how do I prefetch data for a route that uses both a loader and TanStack Query, ensuring the data is dehydrated to the client without double-fetching?", - "difficulty": "hard", - "tags": ["start", "router", "query", "ssr", "integration"], - "expectedDocs": [ - { - "library": "router", - "path": "integrations/query", - "required": true, - "reason": "This is THE official integration guide" - } - ], - "idealSearchQueries": [ - "query integration", - "router query ssr", - "react-router-ssr-query" - ], - "badSearchQueries": [ - "prefetch dehydrate SSR", - "loader prefetch dehydrate" - ], - "correctAnswerMustInclude": [ - "@tanstack/react-router-ssr-query", - "setupRouterSsrQueryIntegration" - ], - "notes": "The integration package handles all dehydration/hydration automatically. Manual setup is possible but not recommended." - }, - { - "id": "createfileroute-basic", - "question": "How do I create a file-based route in TanStack Router?", - "difficulty": "easy", - "tags": ["router", "basics"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/api/router/createFileRouteFunction", - "required": true, - "reason": "Primary API reference" - } - ], - "idealSearchQueries": ["createFileRoute"], - "correctAnswerMustInclude": ["createFileRoute", "export const Route"] - }, - { - "id": "query-usequery-basic", - "question": "How do I fetch data with TanStack Query in React?", - "difficulty": "easy", - "tags": ["query", "basics", "react"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/queries", - "required": true, - "reason": "Primary guide for queries" - } - ], - "idealSearchQueries": ["queries guide", "query basics"], - "badSearchQueries": ["useQuery"], - "correctAnswerMustInclude": ["useQuery", "queryKey", "queryFn"], - "notes": "Searching 'useQuery' returns the API reference, not the guide. Search for 'queries guide' instead." - }, - { - "id": "start-server-functions", - "question": "How do I create a server function in TanStack Start that can be called from the client?", - "difficulty": "medium", - "tags": ["start", "server-functions"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/server-functions", - "required": true, - "reason": "Primary server functions guide" - } - ], - "idealSearchQueries": ["server function", "createServerFn"], - "correctAnswerMustInclude": ["createServerFn"] - }, - { - "id": "router-search-params-validation", - "question": "How do I validate and type search params in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "search-params", "validation", "typescript"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/search-params", - "required": true, - "reason": "Primary search params guide" - } - ], - "idealSearchQueries": ["search params validation", "validateSearch"], - "correctAnswerMustInclude": ["validateSearch"] - }, - { - "id": "table-column-definitions", - "question": "How do I define columns for TanStack Table?", - "difficulty": "easy", - "tags": ["table", "basics"], - "expectedDocs": [ - { - "library": "table", - "path": "guide/column-defs", - "required": true, - "reason": "Primary column definitions guide" - } - ], - "idealSearchQueries": ["column definitions", "createColumnHelper"], - "correctAnswerMustInclude": ["columnHelper", "accessorKey"] - }, - { - "id": "form-validation-zod", - "question": "How do I use Zod validation with TanStack Form?", - "difficulty": "medium", - "tags": ["form", "validation", "zod"], - "expectedDocs": [ - { - "library": "form", - "path": "framework/react/guides/validation", - "required": true, - "reason": "Validation guide covering Zod" - } - ], - "idealSearchQueries": ["form zod validation", "form validation"], - "correctAnswerMustInclude": ["zod", "validators"] - }, - { - "id": "virtual-dynamic-row-heights", - "question": "How do I handle dynamic/variable row heights in TanStack Virtual?", - "difficulty": "medium", - "tags": ["virtual", "dynamic-sizing"], - "expectedDocs": [ - { - "library": "virtual", - "path": "api/virtualizer", - "required": true, - "reason": "API docs for measureElement and estimateSize" - }, - { - "library": "virtual", - "path": "framework/react/examples/dynamic", - "required": false, - "reason": "Example showing dynamic sizing" - } - ], - "idealSearchQueries": ["dynamic size virtualizer", "measureElement"], - "correctAnswerMustInclude": ["estimateSize", "measureElement"] - }, - { - "id": "query-mutations", - "question": "How do I update data on the server with TanStack Query?", - "difficulty": "easy", - "tags": ["query", "mutations"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/mutations", - "required": true, - "reason": "Primary mutations guide" - } - ], - "idealSearchQueries": ["mutation", "useMutation"], - "correctAnswerMustInclude": ["useMutation", "mutate"] - }, - { - "id": "router-loaderDeps", - "question": "How do I make a TanStack Router loader depend on search params so it reloads when they change?", - "difficulty": "medium", - "tags": ["router", "loaders", "search-params"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/data-loading", - "required": true, - "reason": "Data loading guide covers loaderDeps" - } - ], - "idealSearchQueries": ["loaderDeps", "loader search params"], - "correctAnswerMustInclude": ["loaderDeps"] - }, - - { - "id": "query-optimistic-updates", - "question": "How do I implement optimistic updates with TanStack Query so the UI updates immediately before the server responds?", - "difficulty": "medium", - "tags": ["query", "mutations", "optimistic"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/optimistic-updates", - "required": true, - "reason": "Dedicated optimistic updates guide" - } - ], - "idealSearchQueries": ["optimistic updates", "optimistic mutation"], - "correctAnswerMustInclude": ["onMutate", "onError", "onSettled"] - }, - { - "id": "query-infinite-scroll", - "question": "How do I implement infinite scrolling with TanStack Query?", - "difficulty": "medium", - "tags": ["query", "pagination", "infinite"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/infinite-queries", - "required": true, - "reason": "Infinite queries guide" - } - ], - "idealSearchQueries": ["infinite query", "useInfiniteQuery"], - "correctAnswerMustInclude": [ - "useInfiniteQuery", - "getNextPageParam", - "fetchNextPage" - ] - }, - { - "id": "query-cache-invalidation", - "question": "How do I invalidate and refetch queries after a mutation in TanStack Query?", - "difficulty": "easy", - "tags": ["query", "cache", "invalidation"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/invalidations-from-mutations", - "required": true, - "reason": "Guide on invalidating queries from mutations" - } - ], - "idealSearchQueries": [ - "invalidate queries", - "invalidateQueries mutation" - ], - "correctAnswerMustInclude": ["invalidateQueries", "queryClient"] - }, - { - "id": "query-dependent-queries", - "question": "How do I make one query depend on the result of another query in TanStack Query?", - "difficulty": "medium", - "tags": ["query", "dependent", "serial"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/dependent-queries", - "required": true, - "reason": "Dependent queries guide" - } - ], - "idealSearchQueries": ["dependent queries", "enabled option"], - "correctAnswerMustInclude": ["enabled"] - }, - { - "id": "query-prefetching", - "question": "How do I prefetch data before a user navigates to a page with TanStack Query?", - "difficulty": "medium", - "tags": ["query", "prefetch", "performance"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/prefetching", - "required": true, - "reason": "Prefetching guide" - } - ], - "idealSearchQueries": ["prefetch query", "prefetchQuery"], - "correctAnswerMustInclude": ["prefetchQuery"] - }, - { - "id": "query-suspense", - "question": "How do I use TanStack Query with React Suspense?", - "difficulty": "medium", - "tags": ["query", "suspense", "react"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/suspense", - "required": true, - "reason": "Suspense guide" - } - ], - "idealSearchQueries": ["suspense guide", "suspense query guide"], - "badSearchQueries": ["useSuspenseQuery"], - "correctAnswerMustInclude": ["useSuspenseQuery"], - "notes": "Searching 'useSuspenseQuery' returns API reference first. Once Algolia pageRank fix is deployed, guide should rank higher." - }, - { - "id": "query-devtools", - "question": "How do I set up TanStack Query DevTools to debug my queries?", - "difficulty": "easy", - "tags": ["query", "devtools", "debugging"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/devtools", - "required": true, - "reason": "DevTools setup guide" - } - ], - "idealSearchQueries": ["query devtools", "ReactQueryDevtools"], - "correctAnswerMustInclude": ["ReactQueryDevtools"] - }, - - { - "id": "router-code-splitting", - "question": "How do I implement code splitting and lazy loading routes in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "code-splitting", "lazy", "performance"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/code-splitting", - "required": true, - "reason": "Code splitting guide" - } - ], - "idealSearchQueries": ["code splitting", "lazy route"], - "correctAnswerMustInclude": ["lazyRouteComponent", "lazy"] - }, - { - "id": "router-navigation-blocking", - "question": "How do I prevent navigation when a form has unsaved changes in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "navigation", "blocking", "forms"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/navigation-blocking", - "required": true, - "reason": "Navigation blocking guide" - } - ], - "idealSearchQueries": ["navigation blocking", "useBlocker"], - "correctAnswerMustInclude": ["useBlocker"] - }, - { - "id": "router-authenticated-routes", - "question": "How do I protect routes that require authentication in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "auth", "protected-routes"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/authenticated-routes", - "required": true, - "reason": "Authenticated routes guide" - } - ], - "idealSearchQueries": [ - "authenticated routes", - "protected routes", - "auth redirect" - ], - "correctAnswerMustInclude": ["beforeLoad", "redirect"] - }, - { - "id": "router-not-found", - "question": "How do I handle 404 not found pages in TanStack Router?", - "difficulty": "easy", - "tags": ["router", "404", "not-found"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/not-found-errors", - "required": true, - "reason": "Not found errors guide" - } - ], - "idealSearchQueries": ["not found", "404", "notFoundComponent"], - "correctAnswerMustInclude": ["notFoundComponent"] - }, - { - "id": "router-path-params", - "question": "How do I access dynamic path parameters like /posts/$postId in TanStack Router?", - "difficulty": "easy", - "tags": ["router", "params", "dynamic-routes"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/path-params", - "required": true, - "reason": "Path params guide" - } - ], - "idealSearchQueries": ["path params", "useParams", "route params"], - "correctAnswerMustInclude": ["useParams", "$"] - }, - { - "id": "router-preloading", - "question": "How do I preload route data on hover in TanStack Router?", - "difficulty": "easy", - "tags": ["router", "preload", "performance"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/preloading", - "required": true, - "reason": "Preloading guide" - } - ], - "idealSearchQueries": ["preload route", "preloading"], - "correctAnswerMustInclude": ["preload"] - }, - { - "id": "router-devtools", - "question": "How do I set up TanStack Router DevTools?", - "difficulty": "easy", - "tags": ["router", "devtools", "debugging"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/devtools", - "required": true, - "reason": "DevTools guide" - } - ], - "idealSearchQueries": ["router devtools", "TanStackRouterDevtools"], - "correctAnswerMustInclude": ["TanStackRouterDevtools"] - }, - - { - "id": "table-sorting", - "question": "How do I implement column sorting in TanStack Table?", - "difficulty": "easy", - "tags": ["table", "sorting"], - "expectedDocs": [ - { - "library": "table", - "path": "guide/sorting", - "required": true, - "reason": "Sorting guide" - } - ], - "idealSearchQueries": ["table sorting", "getSortedRowModel"], - "correctAnswerMustInclude": ["getSortedRowModel", "sorting"] - }, - { - "id": "table-filtering", - "question": "How do I add filtering to TanStack Table?", - "difficulty": "medium", - "tags": ["table", "filtering"], - "expectedDocs": [ - { - "library": "table", - "path": "guide/column-filtering", - "required": true, - "reason": "Column filtering guide" - } - ], - "idealSearchQueries": ["table filtering", "getFilteredRowModel"], - "correctAnswerMustInclude": ["getFilteredRowModel", "columnFilters"] - }, - { - "id": "table-pagination", - "question": "How do I implement pagination in TanStack Table?", - "difficulty": "easy", - "tags": ["table", "pagination"], - "expectedDocs": [ - { - "library": "table", - "path": "guide/pagination", - "required": true, - "reason": "Pagination guide" - } - ], - "idealSearchQueries": ["table pagination", "getPaginationRowModel"], - "correctAnswerMustInclude": [ - "getPaginationRowModel", - "pageIndex", - "pageSize" - ] - }, - { - "id": "table-row-selection", - "question": "How do I enable row selection with checkboxes in TanStack Table?", - "difficulty": "medium", - "tags": ["table", "selection"], - "expectedDocs": [ - { - "library": "table", - "path": "guide/row-selection", - "required": true, - "reason": "Row selection guide" - } - ], - "idealSearchQueries": ["row selection", "table checkbox"], - "correctAnswerMustInclude": ["rowSelection", "enableRowSelection"] - }, - { - "id": "table-virtualization", - "question": "How do I virtualize a large table with TanStack Table and TanStack Virtual?", - "difficulty": "hard", - "tags": ["table", "virtual", "performance"], - "expectedDocs": [ - { - "library": "table", - "path": "framework/react/examples/virtualized-rows", - "required": true, - "reason": "Virtualized rows example" - } - ], - "idealSearchQueries": ["table virtualization", "virtualized rows"], - "correctAnswerMustInclude": ["useVirtualizer", "virtualRows"] - }, - { - "id": "table-server-side", - "question": "How do I implement server-side pagination and sorting with TanStack Table?", - "difficulty": "hard", - "tags": ["table", "server-side", "pagination"], - "expectedDocs": [ - { - "library": "table", - "path": "guide/pagination", - "required": true, - "reason": "Pagination guide covers manual mode" - } - ], - "idealSearchQueries": ["server side table", "manual pagination"], - "correctAnswerMustInclude": ["manualPagination", "pageCount"] - }, - - { - "id": "form-field-arrays", - "question": "How do I handle dynamic arrays of fields in TanStack Form?", - "difficulty": "medium", - "tags": ["form", "arrays", "dynamic"], - "expectedDocs": [ - { - "library": "form", - "path": "framework/react/guides/arrays", - "required": true, - "reason": "Array fields guide" - } - ], - "idealSearchQueries": ["form arrays", "field array"], - "correctAnswerMustInclude": ["pushValue", "removeValue"] - }, - { - "id": "form-async-validation", - "question": "How do I implement async validation that checks the server in TanStack Form?", - "difficulty": "medium", - "tags": ["form", "validation", "async"], - "expectedDocs": [ - { - "library": "form", - "path": "framework/react/guides/dynamic-validation", - "required": true, - "reason": "Dynamic validation guide covers async validation" - } - ], - "idealSearchQueries": ["async validation", "async form validation"], - "correctAnswerMustInclude": ["async"] - }, - { - "id": "form-submission", - "question": "How do I handle form submission with TanStack Form?", - "difficulty": "easy", - "tags": ["form", "submit"], - "expectedDocs": [ - { - "library": "form", - "path": "framework/react/guides/basic-concepts", - "required": true, - "reason": "Basic concepts covers submission" - } - ], - "idealSearchQueries": ["form submit", "handleSubmit form"], - "correctAnswerMustInclude": ["onSubmit", "handleSubmit"] - }, - - { - "id": "virtual-horizontal-scroll", - "question": "How do I create a horizontal virtualized list with TanStack Virtual?", - "difficulty": "easy", - "tags": ["virtual", "horizontal"], - "expectedDocs": [ - { - "library": "virtual", - "path": "api/virtualizer", - "required": true, - "reason": "API docs cover horizontal option" - } - ], - "idealSearchQueries": ["horizontal virtual", "horizontal virtualizer"], - "correctAnswerMustInclude": ["horizontal"] - }, - { - "id": "virtual-window-scroll", - "question": "How do I virtualize a list that uses window scrolling instead of a container?", - "difficulty": "medium", - "tags": ["virtual", "window-scroll"], - "expectedDocs": [ - { - "library": "virtual", - "path": "framework/react/react-virtual", - "required": true, - "reason": "React Virtual docs cover useWindowVirtualizer" - } - ], - "idealSearchQueries": ["useWindowVirtualizer", "window virtualizer"], - "correctAnswerMustInclude": ["useWindowVirtualizer"] - }, - { - "id": "virtual-grid", - "question": "How do I create a virtualized grid with TanStack Virtual?", - "difficulty": "medium", - "tags": ["virtual", "grid"], - "expectedDocs": [ - { - "library": "virtual", - "path": "api/virtualizer", - "required": true, - "reason": "Virtualizer API covers grid setup" - } - ], - "idealSearchQueries": ["virtualizer grid", "virtual rows columns"], - "correctAnswerMustInclude": ["virtualizer"] - }, - - { - "id": "start-deployment-vercel", - "question": "How do I deploy a TanStack Start app to Vercel?", - "difficulty": "easy", - "tags": ["start", "deployment", "vercel"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/hosting", - "required": true, - "reason": "Hosting guide contains Vercel section" - } - ], - "idealSearchQueries": ["hosting vercel", "deploy start"], - "correctAnswerMustInclude": ["vercel"] - }, - { - "id": "start-deployment-netlify", - "question": "How do I deploy a TanStack Start app to Netlify?", - "difficulty": "easy", - "tags": ["start", "deployment", "netlify"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/hosting", - "required": true, - "reason": "Hosting guide contains Netlify section" - } - ], - "idealSearchQueries": ["hosting netlify", "deploy start"], - "correctAnswerMustInclude": ["netlify"] - }, - { - "id": "start-middleware", - "question": "How do I add middleware to TanStack Start for things like authentication?", - "difficulty": "medium", - "tags": ["start", "middleware", "auth"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/middleware", - "required": true, - "reason": "Middleware guide" - } - ], - "idealSearchQueries": ["start middleware", "createMiddleware"], - "correctAnswerMustInclude": ["middleware"] - }, - { - "id": "start-api-routes", - "question": "How do I create API routes in TanStack Start?", - "difficulty": "medium", - "tags": ["start", "api", "routes"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/server-routes", - "required": true, - "reason": "Server routes guide covers API routes" - } - ], - "idealSearchQueries": ["server routes", "api routes"], - "correctAnswerMustInclude": ["server", "routes"] - }, - { - "id": "start-static-prerendering", - "question": "How do I statically prerender pages at build time in TanStack Start?", - "difficulty": "medium", - "tags": ["start", "static", "prerender", "ssg"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/static-prerendering", - "required": true, - "reason": "Static prerendering guide" - } - ], - "idealSearchQueries": ["static prerender", "prerender start"], - "correctAnswerMustInclude": ["prerender"] - }, - - { - "id": "store-basics", - "question": "How do I create and use a store with TanStack Store?", - "difficulty": "easy", - "tags": ["store", "basics"], - "expectedDocs": [ - { - "library": "store", - "path": "framework/react/quick-start", - "required": true, - "reason": "Quick start guide" - } - ], - "idealSearchQueries": ["store quick start", "useStore"], - "correctAnswerMustInclude": ["Store", "useStore"] - }, - { - "id": "store-derived", - "question": "How do I create derived state from a TanStack Store?", - "difficulty": "medium", - "tags": ["store", "derived", "computed"], - "expectedDocs": [ - { - "library": "store", - "path": "reference/classes/Derived", - "required": true, - "reason": "Derived class reference" - } - ], - "idealSearchQueries": ["derived", "Derived store"], - "correctAnswerMustInclude": ["Derived"] - }, - - { - "id": "query-vue-basics", - "question": "How do I use TanStack Query with Vue?", - "difficulty": "easy", - "tags": ["query", "vue", "basics"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/vue/overview", - "required": true, - "reason": "Vue overview" - } - ], - "idealSearchQueries": ["vue query", "tanstack query vue"], - "correctAnswerMustInclude": ["useQuery", "VueQueryPlugin"] - }, - { - "id": "query-solid-basics", - "question": "How do I use TanStack Query with SolidJS?", - "difficulty": "easy", - "tags": ["query", "solid", "basics"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/solid/overview", - "required": true, - "reason": "Solid overview" - } - ], - "idealSearchQueries": ["solid query", "tanstack query solid"], - "correctAnswerMustInclude": ["createQuery", "QueryClientProvider"] - }, - { - "id": "router-vue-basics", - "question": "How do I use TanStack Router with Vue?", - "difficulty": "easy", - "tags": ["router", "vue", "basics"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/overview", - "required": true, - "reason": "Router overview (Vue support is experimental)" - } - ], - "idealSearchQueries": ["router overview", "tanstack router"], - "correctAnswerMustInclude": ["router"], - "notes": "Vue support for Router is experimental and docs may be limited" - }, - - { - "id": "query-testing", - "question": "How do I test components that use TanStack Query?", - "difficulty": "medium", - "tags": ["query", "testing"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/testing", - "required": true, - "reason": "Testing guide" - } - ], - "idealSearchQueries": ["testing query", "test useQuery"], - "correctAnswerMustInclude": ["QueryClientProvider", "test"] - }, - { - "id": "query-typescript", - "question": "How do I properly type TanStack Query hooks with TypeScript?", - "difficulty": "medium", - "tags": ["query", "typescript"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/typescript", - "required": true, - "reason": "TypeScript guide" - } - ], - "idealSearchQueries": ["query typescript", "type useQuery"], - "correctAnswerMustInclude": ["TypeScript", "TData", "TError"] - }, - - { - "id": "router-scroll-restoration", - "question": "How do I handle scroll position restoration in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "scroll"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/scroll-restoration", - "required": true, - "reason": "Scroll restoration guide" - } - ], - "idealSearchQueries": ["scroll restoration", "ScrollRestoration"], - "correctAnswerMustInclude": ["ScrollRestoration", "scroll"] - }, - { - "id": "router-error-handling", - "question": "How do I handle route errors and show error boundaries in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "errors"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/data-loading", - "required": true, - "reason": "Data loading covers error handling" - } - ], - "idealSearchQueries": ["router error boundary", "errorComponent"], - "correctAnswerMustInclude": ["errorComponent", "onError"] - }, - { - "id": "router-pending-ui", - "question": "How do I show loading states during navigation in TanStack Router?", - "difficulty": "easy", - "tags": ["router", "loading", "pending"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/data-loading", - "required": true, - "reason": "Data loading covers pending states" - } - ], - "idealSearchQueries": ["pending component", "loading navigation"], - "correctAnswerMustInclude": ["pendingComponent"] - }, - - { - "id": "start-forms", - "question": "How do I handle form submissions with server actions in TanStack Start?", - "difficulty": "medium", - "tags": ["start", "forms", "server-actions"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/server-functions", - "required": true, - "reason": "Server functions cover form handling" - } - ], - "idealSearchQueries": ["server functions", "createServerFn"], - "correctAnswerMustInclude": ["createServerFn"] - }, - { - "id": "start-head-meta", - "question": "How do I set page titles and meta tags in TanStack Start?", - "difficulty": "easy", - "tags": ["start", "meta", "seo"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/document-head-management", - "required": true, - "reason": "Document head management guide" - } - ], - "idealSearchQueries": ["document head", "meta title"], - "correctAnswerMustInclude": ["head"] - }, - - { - "id": "query-enabled-button-click", - "question": "How do I trigger a query only when a button is clicked instead of on component mount?", - "difficulty": "medium", - "tags": ["query", "enabled", "manual-fetch"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/disabling-queries", - "required": true, - "reason": "Disabling queries guide covers enabled option and refetch" - } - ], - "idealSearchQueries": ["disable query", "enabled false", "manual query"], - "correctAnswerMustInclude": ["enabled", "refetch"], - "notes": "Mined from Stack Overflow - score 227. Very common question about lazy/on-demand queries." - }, - { - "id": "query-stale-cache-time", - "question": "What is the difference between staleTime and gcTime (cacheTime) in TanStack Query?", - "difficulty": "medium", - "tags": ["query", "cache", "stale"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/caching", - "required": true, - "reason": "Caching guide explains staleTime and gcTime" - } - ], - "idealSearchQueries": ["staleTime gcTime", "caching query", "cache time"], - "correctAnswerMustInclude": ["staleTime", "gcTime"], - "notes": "Mined from Stack Overflow - score 71. Common confusion about cache timing options." - }, - { - "id": "query-conditional-enabled", - "question": "How do I conditionally run a query based on some state or prop in TanStack Query?", - "difficulty": "easy", - "tags": ["query", "enabled", "conditional"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/dependent-queries", - "required": true, - "reason": "Dependent queries guide covers enabled option" - } - ], - "idealSearchQueries": [ - "dependent queries", - "enabled query", - "conditional query" - ], - "correctAnswerMustInclude": ["enabled"], - "notes": "Mined from Stack Overflow - score 68. Very common pattern for conditional fetching." - }, - { - "id": "query-callbacks-deprecated", - "question": "The onSuccess, onError, and onSettled callbacks are deprecated in TanStack Query. What should I use instead?", - "difficulty": "medium", - "tags": ["query", "callbacks", "migration"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/migrating-to-v5", - "required": true, - "reason": "Migration guide covers callback changes" - } - ], - "idealSearchQueries": [ - "migrate v5", - "onSuccess deprecated", - "query callbacks" - ], - "correctAnswerMustInclude": ["useEffect"], - "notes": "Mined from Stack Overflow - score 54. Important migration question for v5 users." - }, - { - "id": "query-provider-error", - "question": "I'm getting 'No QueryClient set, use QueryClientProvider to set one'. How do I fix this?", - "difficulty": "easy", - "tags": ["query", "setup", "error"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/quick-start", - "required": true, - "reason": "Quick start shows proper QueryClientProvider setup" - } - ], - "idealSearchQueries": ["QueryClientProvider", "quick start query"], - "correctAnswerMustInclude": ["QueryClientProvider", "QueryClient"], - "notes": "Mined from Stack Overflow - score 113. Common setup error for new users." - }, - { - "id": "table-default-sorting", - "question": "How do I set a default/initial sort order when the table first loads in TanStack Table?", - "difficulty": "easy", - "tags": ["table", "sorting", "initial-state"], - "expectedDocs": [ - { - "library": "table", - "path": "guide/sorting", - "required": true, - "reason": "Sorting guide covers initial sorting state" - } - ], - "idealSearchQueries": ["initial sorting", "default sort table"], - "correctAnswerMustInclude": ["sorting", "initialState"], - "notes": "Mined from Stack Overflow - score 50. Common question about initial table state." - }, - { - "id": "table-column-visibility", - "question": "How do I hide or show columns dynamically in TanStack Table?", - "difficulty": "easy", - "tags": ["table", "columns", "visibility"], - "expectedDocs": [ - { - "library": "table", - "path": "guide/column-visibility", - "required": true, - "reason": "Column visibility guide" - } - ], - "idealSearchQueries": ["column visibility", "hide column table"], - "correctAnswerMustInclude": ["columnVisibility"], - "notes": "Mined from GitHub - score 54. Users often confused about show/hide columns." - }, - { - "id": "table-row-click-handler", - "question": "How do I handle row click events and select a row when clicked in TanStack Table?", - "difficulty": "medium", - "tags": ["table", "selection", "events"], - "expectedDocs": [ - { - "library": "table", - "path": "guide/row-selection", - "required": true, - "reason": "Row selection guide" - } - ], - "idealSearchQueries": ["row selection", "row click table"], - "correctAnswerMustInclude": ["rowSelection", "onClick"], - "notes": "Mined from Stack Overflow - score 65. Common interaction pattern." - }, - { - "id": "virtual-scroll-to-index", - "question": "How do I programmatically scroll to a specific item/index in TanStack Virtual?", - "difficulty": "medium", - "tags": ["virtual", "scroll", "navigation"], - "expectedDocs": [ - { - "library": "virtual", - "path": "api/virtualizer", - "required": true, - "reason": "Virtualizer API covers scrollToIndex" - } - ], - "idealSearchQueries": ["scrollToIndex", "scroll to item virtual"], - "correctAnswerMustInclude": ["scrollToIndex"], - "notes": "Common need for navigating virtualized lists programmatically." - }, - { - "id": "query-parallel-queries", - "question": "How do I run multiple queries in parallel with TanStack Query?", - "difficulty": "medium", - "tags": ["query", "parallel", "multiple"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/parallel-queries", - "required": true, - "reason": "Parallel queries guide" - } - ], - "idealSearchQueries": ["parallel queries", "useQueries"], - "correctAnswerMustInclude": ["useQueries"], - "notes": "Common pattern for fetching multiple resources at once." - }, - { - "id": "query-placeholder-data", - "question": "How do I show placeholder or initial data while my query is loading in TanStack Query?", - "difficulty": "medium", - "tags": ["query", "placeholder", "loading"], - "expectedDocs": [ - { - "library": "query", - "path": "framework/react/guides/placeholder-query-data", - "required": true, - "reason": "Placeholder query data guide" - } - ], - "idealSearchQueries": ["placeholder data", "initialData query"], - "correctAnswerMustInclude": ["placeholderData"], - "notes": "Important UX pattern for perceived performance." - }, - { - "id": "router-link-active-state", - "question": "How do I style the active link differently when on that route in TanStack Router?", - "difficulty": "easy", - "tags": ["router", "link", "active", "styling"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/api/router/ActiveLinkOptionsType", - "required": true, - "reason": "ActiveLinkOptionsType API covers activeProps and inactiveProps" - } - ], - "idealSearchQueries": ["Link active", "activeProps router"], - "correctAnswerMustInclude": ["activeProps", "Link"], - "notes": "Common navigation styling pattern." - }, - - { - "id": "router-layout-routes", - "question": "How do I create layout routes that wrap child routes with shared UI in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "layout", "nested"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/routing/routing-concepts", - "required": true, - "reason": "Routing concepts covers layout routes and Outlet" - } - ], - "idealSearchQueries": ["layout routes", "Outlet router"], - "correctAnswerMustInclude": ["Outlet", "layout"] - }, - { - "id": "router-pathless-layout", - "question": "How do I create a pathless layout route that groups routes without adding to the URL path?", - "difficulty": "medium", - "tags": ["router", "layout", "pathless"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/routing/routing-concepts", - "required": true, - "reason": "Routing concepts covers pathless layout routes with underscore prefix" - } - ], - "idealSearchQueries": ["pathless layout", "route grouping"], - "correctAnswerMustInclude": ["_"] - }, - { - "id": "router-route-context", - "question": "How do I pass data through route context to child routes in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "context", "data"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/api/router/createRootRouteWithContextFunction", - "required": true, - "reason": "createRootRouteWithContext for typed context" - } - ], - "idealSearchQueries": ["route context", "createRootRouteWithContext"], - "correctAnswerMustInclude": ["context"] - }, - { - "id": "router-use-navigate", - "question": "How do I programmatically navigate to a route in TanStack Router?", - "difficulty": "easy", - "tags": ["router", "navigation", "programmatic"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/api/router/useNavigateHook", - "required": true, - "reason": "useNavigate hook API" - } - ], - "idealSearchQueries": ["useNavigate", "programmatic navigation"], - "correctAnswerMustInclude": ["useNavigate"] - }, - { - "id": "router-catch-all-splat", - "question": "How do I create a catch-all or splat route that matches any path in TanStack Router?", - "difficulty": "easy", - "tags": ["router", "splat", "catch-all"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/routing/routing-concepts", - "required": true, - "reason": "Routing concepts covers splat routes" - } - ], - "idealSearchQueries": ["splat route", "catch all route"], - "correctAnswerMustInclude": ["$"] - }, - { - "id": "router-file-based-routing", - "question": "How does file-based routing work in TanStack Router?", - "difficulty": "easy", - "tags": ["router", "file-based", "basics"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/routing/file-based-routing", - "required": true, - "reason": "File-based routing guide" - } - ], - "idealSearchQueries": ["file based routing", "route file"], - "correctAnswerMustInclude": ["routes", "file"] - }, - { - "id": "router-navigate-search-params", - "question": "How do I navigate while preserving or modifying search params in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "navigation", "search-params"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/search-params", - "required": true, - "reason": "Search params guide covers navigation with search" - } - ], - "idealSearchQueries": ["search params navigation", "navigate search"], - "correctAnswerMustInclude": ["search"] - }, - { - "id": "router-redirect-beforeload", - "question": "How do I redirect users in TanStack Router before the route loads?", - "difficulty": "medium", - "tags": ["router", "redirect", "beforeLoad"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/authenticated-routes", - "required": true, - "reason": "Authenticated routes guide shows redirect pattern" - } - ], - "idealSearchQueries": ["redirect beforeLoad", "redirect router"], - "correctAnswerMustInclude": ["redirect", "beforeLoad"] - }, - { - "id": "router-route-masking", - "question": "How do I show a different URL in the browser than the actual route in TanStack Router?", - "difficulty": "hard", - "tags": ["router", "masking", "url"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/route-masking", - "required": true, - "reason": "Route masking guide" - } - ], - "idealSearchQueries": ["route masking", "mask url"], - "correctAnswerMustInclude": ["mask"] - }, - { - "id": "router-ssr-streaming", - "question": "How does SSR and streaming work in TanStack Router?", - "difficulty": "hard", - "tags": ["router", "ssr", "streaming"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/ssr", - "required": true, - "reason": "SSR guide covers streaming" - } - ], - "idealSearchQueries": ["ssr router guide", "server side rendering"], - "correctAnswerMustInclude": ["SSR", "streaming"] - }, - { - "id": "router-external-data-loading", - "question": "How do I use TanStack Router with an external data fetching library like TanStack Query?", - "difficulty": "medium", - "tags": ["router", "query", "integration", "data"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/external-data-loading", - "required": true, - "reason": "External data loading guide" - } - ], - "idealSearchQueries": [ - "external data loading", - "router query integration" - ], - "correctAnswerMustInclude": ["external", "data"] - }, - - { - "id": "start-execution-model", - "question": "How do I understand where my code runs in TanStack Start (server vs client)?", - "difficulty": "medium", - "tags": ["start", "ssr", "execution"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/execution-model", - "required": true, - "reason": "Execution model guide explains server/client code" - } - ], - "idealSearchQueries": ["execution model", "server client start"], - "correctAnswerMustInclude": ["server", "client"] - }, - { - "id": "start-server-only-code", - "question": "How do I ensure code only runs on the server in TanStack Start?", - "difficulty": "medium", - "tags": ["start", "server", "code-patterns"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/code-execution-patterns", - "required": true, - "reason": "Code execution patterns guide" - } - ], - "idealSearchQueries": ["server only code", "code execution patterns"], - "correctAnswerMustInclude": ["server"] - }, - { - "id": "start-authentication", - "question": "How do I implement authentication in TanStack Start?", - "difficulty": "hard", - "tags": ["start", "auth", "security"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/authentication", - "required": true, - "reason": "Authentication guide" - } - ], - "idealSearchQueries": ["authentication start", "auth tanstack start"], - "correctAnswerMustInclude": ["auth"] - }, - { - "id": "start-auth-overview", - "question": "What authentication options are available for TanStack Start?", - "difficulty": "easy", - "tags": ["start", "auth", "overview"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/authentication-overview", - "required": true, - "reason": "Authentication overview with partner solutions" - } - ], - "idealSearchQueries": ["authentication overview", "clerk workos start"], - "correctAnswerMustInclude": ["Clerk", "WorkOS"] - }, - { - "id": "start-streaming-server-functions", - "question": "How do I stream data from a server function in TanStack Start?", - "difficulty": "hard", - "tags": ["start", "streaming", "server-functions"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/server-functions", - "required": true, - "reason": "Server functions guide covers streaming" - } - ], - "idealSearchQueries": ["streaming server function", "stream data start"], - "correctAnswerMustInclude": ["stream"] - }, - { - "id": "start-tailwind", - "question": "How do I set up Tailwind CSS with TanStack Start?", - "difficulty": "easy", - "tags": ["start", "tailwind", "css"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/tailwind-integration", - "required": true, - "reason": "Tailwind CSS integration guide" - } - ], - "idealSearchQueries": ["tailwind start", "css tailwind tanstack"], - "correctAnswerMustInclude": ["tailwind"] - }, - { - "id": "start-database", - "question": "How do I connect to a database in TanStack Start?", - "difficulty": "medium", - "tags": ["start", "database", "data"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/databases", - "required": true, - "reason": "Databases guide" - } - ], - "idealSearchQueries": ["database start", "drizzle prisma start"], - "correctAnswerMustInclude": ["database"] - }, - { - "id": "start-migrate-nextjs", - "question": "How do I migrate from Next.js to TanStack Start?", - "difficulty": "hard", - "tags": ["start", "migration", "nextjs"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/migrate-from-next-js", - "required": true, - "reason": "Next.js migration guide" - } - ], - "idealSearchQueries": ["migrate nextjs", "next.js to start"], - "correctAnswerMustInclude": ["migrate", "Next"] - }, - { - "id": "start-build-from-scratch", - "question": "How do I build a TanStack Start project from scratch without using a template?", - "difficulty": "medium", - "tags": ["start", "setup", "manual"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/build-from-scratch", - "required": true, - "reason": "Build from scratch guide" - } - ], - "idealSearchQueries": ["build from scratch", "manual setup start"], - "correctAnswerMustInclude": ["scratch"] - }, - { - "id": "start-rendering-markdown", - "question": "How do I render markdown content in TanStack Start?", - "difficulty": "medium", - "tags": ["start", "markdown", "content"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/rendering-markdown", - "required": true, - "reason": "Rendering markdown guide" - } - ], - "idealSearchQueries": ["render markdown", "markdown start"], - "correctAnswerMustInclude": ["markdown"] - }, - { - "id": "start-cloudflare-workers", - "question": "How do I deploy TanStack Start to Cloudflare Workers?", - "difficulty": "medium", - "tags": ["start", "deployment", "cloudflare"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/hosting", - "required": true, - "reason": "Hosting guide covers Cloudflare Workers" - } - ], - "idealSearchQueries": ["cloudflare workers", "deploy cloudflare start"], - "correctAnswerMustInclude": ["cloudflare"] - }, - { - "id": "start-vs-nextjs", - "question": "How does TanStack Start compare to Next.js?", - "difficulty": "easy", - "tags": ["start", "comparison", "nextjs"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/comparison", - "required": true, - "reason": "Comparison guide" - } - ], - "idealSearchQueries": ["start vs nextjs", "comparison next"], - "correctAnswerMustInclude": ["Next"] - }, - { - "id": "router-providers-location", - "question": "Where do I put providers like QueryClientProvider in TanStack Start?", - "difficulty": "medium", - "tags": ["start", "router", "providers", "setup"], - "expectedDocs": [ - { - "library": "router", - "path": "integrations/query", - "required": true, - "reason": "Query integration guide shows provider setup" - } - ], - "idealSearchQueries": [ - "query integration setup", - "QueryClientProvider router" - ], - "correctAnswerMustInclude": ["provider"], - "notes": "Mined from Stack Overflow. Common setup question." - }, - { - "id": "router-routetree-gen-error", - "question": "I'm getting 'Cannot find module routeTree.gen' error. How do I fix it?", - "difficulty": "easy", - "tags": ["router", "setup", "error"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/faq", - "required": true, - "reason": "FAQ covers routeTree.gen questions" - } - ], - "idealSearchQueries": ["routeTree.gen", "route tree faq"], - "correctAnswerMustInclude": ["routeTree"], - "notes": "Mined from Stack Overflow. Common setup error." - }, - { - "id": "router-exclude-layout", - "question": "How do I exclude specific routes from a parent layout in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "layout", "nested"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/routing/routing-concepts", - "required": true, - "reason": "Routing concepts covers non-nested routes" - } - ], - "idealSearchQueries": ["non-nested routes", "exclude layout"], - "correctAnswerMustInclude": ["_"], - "notes": "Mined from Stack Overflow. Users want to break out of layouts." - }, - { - "id": "router-dynamic-nested-routes", - "question": "How do I create dynamic nested routes like /users/$userId/posts/$postId in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "dynamic", "nested", "params"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/routing/routing-concepts", - "required": true, - "reason": "Routing concepts covers dynamic route segments" - } - ], - "idealSearchQueries": ["dynamic route segments", "routing concepts"], - "correctAnswerMustInclude": ["$"] - }, - { - "id": "router-search-params-no-rerender", - "question": "How do I update search params without causing a full page re-render in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "search-params", "performance"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/search-params", - "required": true, - "reason": "Search params guide covers shallow navigation" - } - ], - "idealSearchQueries": [ - "search params shallow", - "update search no rerender" - ], - "correctAnswerMustInclude": ["search"], - "notes": "Mined from Stack Overflow. Common performance concern." - }, - { - "id": "router-link-typesafe-wrapper", - "question": "How do I wrap TanStack Router's Link component while keeping type safety?", - "difficulty": "hard", - "tags": ["router", "typescript", "link"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/custom-link", - "required": true, - "reason": "Custom link guide covers createLink" - } - ], - "idealSearchQueries": ["custom link", "createLink wrapper"], - "correctAnswerMustInclude": ["createLink"], - "notes": "Mined from Stack Overflow. TypeScript users want custom Link components." - }, - { - "id": "router-error-boundary-disable", - "question": "How do I disable or customize the error boundary in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "errors", "error-boundary"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/guide/data-loading", - "required": true, - "reason": "Data loading covers error handling" - } - ], - "idealSearchQueries": ["error boundary router", "errorComponent"], - "correctAnswerMustInclude": ["errorComponent"], - "notes": "Mined from Stack Overflow. Users want custom error handling." - }, - { - "id": "router-generate-href", - "question": "How do I generate a URL/href string for a route without navigating in TanStack Router?", - "difficulty": "medium", - "tags": ["router", "url", "href"], - "expectedDocs": [ - { - "library": "router", - "path": "framework/react/api/router/RouterType", - "required": true, - "reason": "Router API covers buildLocation" - } - ], - "idealSearchQueries": ["buildLocation", "generate href router"], - "correctAnswerMustInclude": ["buildLocation"], - "notes": "Mined from Stack Overflow. Need URLs for sharing/copying." - }, - { - "id": "start-server-fn-validation", - "question": "How do I validate input data in a TanStack Start server function?", - "difficulty": "medium", - "tags": ["start", "server-functions", "validation"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/server-functions", - "required": true, - "reason": "Server functions guide covers validation" - } - ], - "idealSearchQueries": [ - "server function validation", - "validate server fn" - ], - "correctAnswerMustInclude": ["validator", "zod"] - }, - { - "id": "start-env-variables", - "question": "How do I use environment variables in TanStack Start?", - "difficulty": "easy", - "tags": ["start", "env", "config"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/environment-variables", - "required": true, - "reason": "Environment variables guide" - } - ], - "idealSearchQueries": ["environment variables", "env tanstack start"], - "correctAnswerMustInclude": ["env", "VITE"] - }, - - { - "id": "partner-database-recommendation", - "question": "What database should I use with TanStack Start?", - "difficulty": "easy", - "tags": ["start", "database", "partner", "ecosystem"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/databases", - "required": true, - "reason": "Databases guide with partner recommendations" - } - ], - "idealSearchQueries": ["database start", "databases guide"], - "correctAnswerMustInclude": ["Neon", "Convex"], - "notes": "Partner discovery test. Should surface recommended database partners." - }, - { - "id": "partner-auth-recommendation", - "question": "What authentication solution should I use with TanStack Start?", - "difficulty": "easy", - "tags": ["start", "auth", "partner", "ecosystem"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/authentication-overview", - "required": true, - "reason": "Authentication overview with partner solutions" - } - ], - "idealSearchQueries": ["authentication overview", "auth start"], - "correctAnswerMustInclude": ["Clerk", "WorkOS"], - "notes": "Partner discovery test. Should surface recommended auth partners." - }, - { - "id": "partner-hosting-recommendation", - "question": "Where should I deploy my TanStack Start application?", - "difficulty": "easy", - "tags": ["start", "hosting", "deployment", "partner", "ecosystem"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/hosting", - "required": true, - "reason": "Hosting guide with deployment partners" - } - ], - "idealSearchQueries": ["hosting start", "deploy start"], - "correctAnswerMustInclude": ["Cloudflare", "Netlify"], - "notes": "Partner discovery test. Should surface recommended hosting partners." - }, - { - "id": "partner-table-upgrade", - "question": "I need more advanced features than TanStack Table provides. What should I use?", - "difficulty": "medium", - "tags": ["table", "partner", "ecosystem", "data-grid"], - "expectedDocs": [ - { - "library": "table", - "path": "introduction", - "required": true, - "reason": "Table introduction mentions AG Grid partnership" - } - ], - "idealSearchQueries": ["table ag grid", "enterprise data grid"], - "correctAnswerMustInclude": ["AG Grid"], - "notes": "Partner discovery test. AG Grid is the enterprise upgrade path for Table users." - }, - { - "id": "partner-neon-setup", - "question": "How do I connect Neon database to my TanStack Start app?", - "difficulty": "medium", - "tags": ["start", "database", "neon", "partner"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/databases", - "required": true, - "reason": "Databases guide covers Neon setup" - } - ], - "idealSearchQueries": ["neon database", "neon start"], - "correctAnswerMustInclude": ["Neon", "PostgreSQL"], - "notes": "Partner-specific test. Users searching for specific partner integration." - }, - { - "id": "partner-clerk-setup", - "question": "How do I add Clerk authentication to TanStack Start?", - "difficulty": "medium", - "tags": ["start", "auth", "clerk", "partner"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/authentication-overview", - "required": true, - "reason": "Auth overview links to Clerk integration" - } - ], - "idealSearchQueries": ["clerk authentication", "clerk start"], - "correctAnswerMustInclude": ["Clerk"], - "notes": "Partner-specific test. Users searching for specific partner integration." - }, - { - "id": "partner-error-monitoring", - "question": "How do I set up error monitoring for my TanStack app?", - "difficulty": "medium", - "tags": ["start", "monitoring", "sentry", "partner", "ecosystem"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/error-handling", - "required": false, - "reason": "Error handling may mention monitoring solutions" - } - ], - "idealSearchQueries": ["error monitoring", "sentry start"], - "correctAnswerMustInclude": ["Sentry"], - "notes": "Partner discovery test. Sentry is the error monitoring partner." - }, - { - "id": "partner-cms-recommendation", - "question": "What CMS should I use with TanStack Start for content management?", - "difficulty": "medium", - "tags": ["start", "cms", "strapi", "partner", "ecosystem"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/rendering-markdown", - "required": false, - "reason": "Content/markdown guide may reference CMS options" - } - ], - "idealSearchQueries": ["cms start", "headless cms tanstack"], - "correctAnswerMustInclude": ["Strapi"], - "notes": "Partner discovery test. Strapi is the CMS partner." - }, - - { - "id": "ecosystem-postgres-alias", - "question": "I need a postgres database for my TanStack Start app", - "difficulty": "easy", - "tags": ["start", "database", "ecosystem", "mcp-tool"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/databases", - "required": true, - "reason": "Databases guide" - } - ], - "idealSearchQueries": ["databases guide"], - "correctAnswerMustInclude": ["Neon"], - "notes": "Tests category alias resolution. 'postgres' should resolve to 'database' category. MCP tool: get_ecosystem_recommendations({ category: 'postgres' })" - }, - { - "id": "ecosystem-login-alias", - "question": "How do I add login functionality to my app?", - "difficulty": "easy", - "tags": ["start", "auth", "ecosystem", "mcp-tool"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/authentication-overview", - "required": true, - "reason": "Auth overview" - } - ], - "idealSearchQueries": ["authentication overview"], - "correctAnswerMustInclude": ["Clerk", "WorkOS"], - "notes": "Tests category alias resolution. 'login' should resolve to 'auth' category. MCP tool: get_ecosystem_recommendations({ category: 'login' })" - }, - { - "id": "ecosystem-serverless-alias", - "question": "What serverless hosting options work with TanStack Start?", - "difficulty": "easy", - "tags": ["start", "deployment", "ecosystem", "mcp-tool"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/hosting", - "required": true, - "reason": "Hosting guide" - } - ], - "idealSearchQueries": ["hosting guide"], - "correctAnswerMustInclude": ["Cloudflare", "Netlify"], - "notes": "Tests category alias resolution. 'serverless' should resolve to 'deployment' category. MCP tool: get_ecosystem_recommendations({ category: 'serverless' })" - }, - { - "id": "ecosystem-error-tracking-alias", - "question": "I need error tracking for production", - "difficulty": "easy", - "tags": ["start", "monitoring", "ecosystem", "mcp-tool"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/observability", - "required": false, - "reason": "Observability guide" - } - ], - "idealSearchQueries": ["observability", "error monitoring"], - "correctAnswerMustInclude": ["Sentry"], - "notes": "Tests category alias resolution. 'error tracking' should resolve to 'monitoring' category. MCP tool: get_ecosystem_recommendations({ category: 'error-tracking' })" - }, - { - "id": "ecosystem-library-filter", - "question": "What ecosystem integrations are available for TanStack Table?", - "difficulty": "easy", - "tags": ["table", "ecosystem", "mcp-tool"], - "expectedDocs": [ - { - "library": "table", - "path": "introduction", - "required": true, - "reason": "Table introduction" - } - ], - "idealSearchQueries": ["table introduction"], - "correctAnswerMustInclude": ["AG Grid"], - "notes": "Tests library filter. MCP tool: get_ecosystem_recommendations({ library: 'table' })" - }, - { - "id": "ecosystem-sso-enterprise", - "question": "I need SSO and enterprise authentication features", - "difficulty": "medium", - "tags": ["start", "auth", "enterprise", "ecosystem", "mcp-tool"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/authentication-overview", - "required": true, - "reason": "Auth overview with WorkOS for enterprise" - } - ], - "idealSearchQueries": ["authentication overview", "workos sso"], - "correctAnswerMustInclude": ["WorkOS"], - "notes": "Tests SSO/enterprise auth. 'sso' alias should resolve to 'auth'. WorkOS specifically handles enterprise features." - }, - { - "id": "ecosystem-realtime-database", - "question": "I need a real-time database with live queries", - "difficulty": "medium", - "tags": ["start", "database", "realtime", "ecosystem", "mcp-tool"], - "expectedDocs": [ - { - "library": "start", - "path": "framework/react/guide/databases", - "required": true, - "reason": "Databases guide" - } - ], - "idealSearchQueries": ["databases guide", "convex realtime"], - "correctAnswerMustInclude": ["Convex"], - "notes": "Tests real-time database needs. Convex specifically offers real-time features." - }, - { - "id": "ecosystem-rate-limiting", - "question": "How do I add rate limiting to my API?", - "difficulty": "medium", - "tags": ["api", "rate-limiting", "ecosystem", "mcp-tool"], - "expectedDocs": [ - { - "library": "pacer", - "path": "overview", - "required": false, - "reason": "Pacer overview for rate limiting" - } - ], - "idealSearchQueries": ["rate limiting", "pacer"], - "correctAnswerMustInclude": ["Unkey"], - "notes": "Tests API/rate-limiting category. Unkey is the API management partner." - }, - { - "id": "ecosystem-offline-sync", - "question": "I need offline-first sync capabilities for my app", - "difficulty": "medium", - "tags": ["db", "database", "sync", "ecosystem", "mcp-tool"], - "expectedDocs": [ - { - "library": "db", - "path": "overview", - "required": false, - "reason": "TanStack DB overview" - } - ], - "idealSearchQueries": ["tanstack db", "sync"], - "correctAnswerMustInclude": ["Electric", "PowerSync"], - "notes": "Tests sync/offline capabilities. Electric and PowerSync are TanStack DB partners." - } - ] -} diff --git a/scripts/register-discord-commands.ts b/scripts/register-discord-commands.ts deleted file mode 100644 index 6ce9d0d22..000000000 --- a/scripts/register-discord-commands.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Register Discord slash commands with the Discord API. - * - * Run this script after adding new commands or modifying existing ones: - * pnpm tsx scripts/register-discord-commands.ts - * - * Required environment variables: - * DISCORD_APPLICATION_ID - Your Discord application ID - * DISCORD_BOT_TOKEN - Your Discord bot token - */ - -const DISCORD_APPLICATION_ID = process.env.DISCORD_APPLICATION_ID -const DISCORD_BOT_TOKEN = process.env.DISCORD_BOT_TOKEN - -if (!DISCORD_APPLICATION_ID || !DISCORD_BOT_TOKEN) { - console.error('Missing required environment variables:') - if (!DISCORD_APPLICATION_ID) console.error(' - DISCORD_APPLICATION_ID') - if (!DISCORD_BOT_TOKEN) console.error(' - DISCORD_BOT_TOKEN') - process.exit(1) -} - -const commands = [ - { - name: 'tanstack', - description: 'Check TanStack Bot status', - type: 1, // CHAT_INPUT - }, -] - -async function registerCommands() { - const url = `https://discord.com/api/v10/applications/${DISCORD_APPLICATION_ID}/commands` - - console.log('Registering commands with Discord API...') - console.log(`Application ID: ${DISCORD_APPLICATION_ID}`) - console.log(`Commands to register: ${commands.map((c) => c.name).join(', ')}`) - - const response = await fetch(url, { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bot ${DISCORD_BOT_TOKEN}`, - }, - body: JSON.stringify(commands), - }) - - if (!response.ok) { - const error = await response.text() - console.error(`Failed to register commands: ${response.status}`) - console.error(error) - process.exit(1) - } - - const registered = await response.json() - console.log('\nSuccessfully registered commands:') - for (const cmd of registered) { - console.log(` - /${cmd.name} (ID: ${cmd.id})`) - } -} - -registerCommands().catch((error) => { - console.error('Failed to register commands:', error) - process.exit(1) -}) diff --git a/scripts/test-chunk-consistency.ts b/scripts/test-chunk-consistency.ts deleted file mode 100644 index 723458fa6..000000000 --- a/scripts/test-chunk-consistency.ts +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Test that chunk boundaries are consistent across multiple runs - * Verifies that the same package will always generate the same chunk keys - */ - -function generateNormalizedChunks( - startDate: string, - endDate: string, -): Array<{ from: string; to: string }> { - const CHUNK_DAYS = 500 - const chunks: Array<{ from: string; to: string }> = [] - - let currentFrom = new Date(startDate) - const finalDate = new Date(endDate) - - while (currentFrom <= finalDate) { - const from = currentFrom.toISOString().substring(0, 10) - - const potentialTo = new Date(currentFrom) - potentialTo.setDate(potentialTo.getDate() + CHUNK_DAYS - 1) - - const to = - potentialTo > finalDate - ? finalDate.toISOString().substring(0, 10) - : potentialTo.toISOString().substring(0, 10) - - chunks.push({ from, to }) - - currentFrom = new Date(to) - currentFrom.setDate(currentFrom.getDate() + 1) - - if (to === endDate) break - } - - return chunks -} - -console.log('\n' + '='.repeat(80)) -console.log('🧪 Testing Chunk Boundary Consistency') -console.log('='.repeat(80) + '\n') - -// Simulate @tanstack/react-query (created Oct 25, 2019) -const packageName = '@tanstack/react-query' -const createdDate = '2019-10-25' - -console.log(`Package: ${packageName}`) -console.log(`Created: ${createdDate}`) -console.log('') - -// Simulate running on different days -const testDates = ['2025-12-06', '2025-12-07', '2025-12-08'] - -console.log('Testing chunk consistency across different "today" dates:\n') - -const allChunks: Record> = {} - -for (const today of testDates) { - const chunks = generateNormalizedChunks(createdDate, today) - allChunks[today] = chunks - - console.log(`📅 If run on ${today}:`) - console.log(` Total chunks: ${chunks.length}`) - console.log(` Last 3 chunks:`) - chunks.slice(-3).forEach((chunk, idx) => { - const chunkNum = chunks.length - 3 + idx + 1 - console.log(` ${chunkNum}. ${chunk.from} → ${chunk.to}`) - }) - console.log('') -} - -// Check consistency -console.log('='.repeat(80)) -console.log('🔍 Consistency Analysis') -console.log('='.repeat(80) + '\n') - -const dates = Object.keys(allChunks) -const firstRun = allChunks[dates[0]] -const secondRun = allChunks[dates[1]] -const thirdRun = allChunks[dates[2]] - -// Historical chunks should be identical -const historicalChunksToCompare = Math.min( - firstRun.length - 1, - secondRun.length - 1, - thirdRun.length - 1, -) - -let allHistoricalMatch = true -for (let i = 0; i < historicalChunksToCompare; i++) { - if ( - firstRun[i].from !== secondRun[i].from || - firstRun[i].to !== secondRun[i].to || - firstRun[i].from !== thirdRun[i].from || - firstRun[i].to !== thirdRun[i].to - ) { - console.log(`❌ Chunk ${i + 1} differs between runs`) - console.log(` Run 1: ${firstRun[i].from} → ${firstRun[i].to}`) - console.log(` Run 2: ${secondRun[i].from} → ${secondRun[i].to}`) - console.log(` Run 3: ${thirdRun[i].from} → ${thirdRun[i].to}`) - allHistoricalMatch = false - } -} - -if (allHistoricalMatch) { - console.log( - `✅ Historical chunks (${historicalChunksToCompare} chunks) are consistent across all runs`, - ) - console.log( - ` All historical chunks will have identical cache keys regardless of when fetched`, - ) -} - -// Current chunk should differ (expected behavior) -console.log('') -console.log('Current (last) chunk analysis:') -const lastChunks = dates.map((date) => { - const chunks = allChunks[date] - return chunks[chunks.length - 1] -}) - -console.log( - ` Run 1 (${dates[0]}): ${lastChunks[0].from} → ${lastChunks[0].to}`, -) -console.log( - ` Run 2 (${dates[1]}): ${lastChunks[1].from} → ${lastChunks[1].to}`, -) -console.log( - ` Run 3 (${dates[2]}): ${lastChunks[2].from} → ${lastChunks[2].to}`, -) - -const currentChunksDiffer = lastChunks[0].to !== lastChunks[1].to -console.log('') -if (currentChunksDiffer) { - console.log( - '✅ Current chunks differ (expected - they track "today" and will be marked mutable)', - ) - console.log( - ' These chunks expire in 6 hours and get refreshed with updated data', - ) -} else { - console.log('⚠️ Current chunks are identical (might be same day)') -} - -// Cache key example -console.log('\n' + '='.repeat(80)) -console.log('📦 Example Cache Keys') -console.log('='.repeat(80) + '\n') - -const exampleChunks = firstRun.slice(0, 3) -exampleChunks.forEach((chunk, idx) => { - const cacheKey = `${packageName}|${chunk.from}|${chunk.to}|daily` - const isHistorical = chunk.to < dates[0] - console.log(`Chunk ${idx + 1}: ${cacheKey}`) - console.log( - ` ${isHistorical ? '🔒 Immutable (cached forever)' : '⏱️ Mutable (6-hour TTL)'}`, - ) -}) - -console.log('\n' + '='.repeat(80)) -console.log( - '✅ Chunk consistency verified - cache deduplication will work correctly', -) -console.log('='.repeat(80) + '\n') diff --git a/scripts/test-npm-cache.ts b/scripts/test-npm-cache.ts deleted file mode 100644 index 7184d13f3..000000000 --- a/scripts/test-npm-cache.ts +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Test script for NPM download chunk caching - * Tests that chunks are properly cached and retrieved - */ - -import { - getCachedNpmDownloadChunk, - setCachedNpmDownloadChunk, -} from '~/utils/stats-db.server' - -async function testCache() { - console.log('\n' + '='.repeat(80)) - console.log('🧪 Testing NPM Download Chunk Cache') - console.log('='.repeat(80) + '\n') - - const testPackage = '@tanstack/react-query' - const testDateFrom = '2024-01-01' - const testDateTo = '2024-06-30' - - // Test 1: Cache miss - console.log('Test 1: Cache miss (should return null)') - const miss = await getCachedNpmDownloadChunk( - testPackage, - testDateFrom, - testDateTo, - ) - console.log( - ` Result: ${miss === null ? '✅ NULL (as expected)' : '❌ Got data (unexpected)'}`, - ) - - // Test 2: Write to cache - console.log('\nTest 2: Write to cache') - await setCachedNpmDownloadChunk({ - packageName: testPackage, - dateFrom: testDateFrom, - dateTo: testDateTo, - binSize: 'daily', - totalDownloads: 100000, - dailyData: [ - { day: '2024-01-01', downloads: 1000 }, - { day: '2024-01-02', downloads: 1100 }, - ], - isImmutable: false, // Will be calculated - }) - console.log(' ✅ Write completed') - - // Test 3: Cache hit - console.log('\nTest 3: Cache hit (should return data)') - const hit = await getCachedNpmDownloadChunk( - testPackage, - testDateFrom, - testDateTo, - ) - if (hit) { - console.log(` ✅ Got cached data:`) - console.log(` Package: ${hit.packageName}`) - console.log(` Range: ${hit.dateFrom} to ${hit.dateTo}`) - console.log(` Total downloads: ${hit.totalDownloads.toLocaleString()}`) - console.log(` Daily data points: ${hit.dailyData.length}`) - console.log(` Is immutable: ${hit.isImmutable}`) - } else { - console.log(' ❌ Cache miss (unexpected)') - } - - // Test 4: Historical chunk (should be immutable) - console.log('\nTest 4: Historical chunk (should be marked immutable)') - const historicalDateFrom = '2023-01-01' - const historicalDateTo = '2023-06-30' - await setCachedNpmDownloadChunk({ - packageName: testPackage, - dateFrom: historicalDateFrom, - dateTo: historicalDateTo, - binSize: 'daily', - totalDownloads: 50000, - dailyData: [ - { day: '2023-01-01', downloads: 500 }, - { day: '2023-01-02', downloads: 550 }, - ], - isImmutable: false, // Will be calculated based on dateTo - }) - - const historical = await getCachedNpmDownloadChunk( - testPackage, - historicalDateFrom, - historicalDateTo, - ) - if (historical) { - console.log( - ` Is immutable: ${historical.isImmutable ? '✅ YES (as expected)' : '❌ NO (unexpected)'}`, - ) - } else { - console.log(' ❌ Failed to retrieve historical chunk') - } - - console.log('\n' + '='.repeat(80)) - console.log('✅ Cache tests completed') - console.log('='.repeat(80) + '\n') - - process.exit(0) -} - -testCache().catch((error) => { - console.error('❌ Test failed:', error) - process.exit(1) -}) diff --git a/src/auth/auth.server.ts b/src/auth/auth.server.ts deleted file mode 100644 index 112b85e4b..000000000 --- a/src/auth/auth.server.ts +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Auth Service - * - * Main authentication service that coordinates session validation - * and user retrieval. Uses inversion of control for all dependencies. - */ - -import type { - AuthUser, - Capability, - DbUser, - IAuthService, - ICapabilitiesRepository, - ISessionService, - IUserRepository, - SessionCookieData, -} from './types' -import { AuthError } from './types' - -// ============================================================================ -// Auth Service Implementation -// ============================================================================ - -export class AuthService implements IAuthService { - constructor( - private sessionService: ISessionService, - private userRepository: IUserRepository, - private capabilitiesRepository: ICapabilitiesRepository, - ) {} - - /** - * Get current user from request - * Returns null if not authenticated - */ - async getCurrentUser(request: Request): Promise { - const signedCookie = this.sessionService.getSessionCookie(request) - - if (!signedCookie) { - return null - } - - try { - const cookieData = await this.sessionService.verifyCookie(signedCookie) - - if (!cookieData) { - console.error( - '[AuthService] Session cookie verification failed - invalid signature or expired', - ) - return null - } - - const result = await this.validateSession(cookieData) - if (!result) { - return null - } - - return this.mapDbUserToAuthUser(result.user, result.capabilities) - } catch (error) { - console.error('[AuthService] Failed to get user from session:', { - error: error instanceof Error ? error.message : 'Unknown error', - stack: error instanceof Error ? error.stack : undefined, - }) - return null - } - } - - /** - * Validate session data against the database - */ - async validateSession( - sessionData: SessionCookieData, - ): Promise<{ user: DbUser; capabilities: Capability[] } | null> { - const user = await this.userRepository.findById(sessionData.userId) - - if (!user) { - console.error( - `[AuthService] Session cookie references non-existent user ${sessionData.userId}`, - ) - return null - } - - // Verify session version matches (for session revocation) - if (user.sessionVersion !== sessionData.version) { - console.error( - `[AuthService] Session version mismatch for user ${user.id} - expected ${user.sessionVersion}, got ${sessionData.version}`, - ) - return null - } - - // Get effective capabilities - const capabilities = - await this.capabilitiesRepository.getEffectiveCapabilities(user.id) - - return { user, capabilities } - } - - /** - * Map database user to AuthUser type - */ - private mapDbUserToAuthUser( - user: DbUser, - capabilities: Capability[], - ): AuthUser { - return { - userId: user.id, - email: user.email, - name: user.name, - image: user.image, - oauthImage: user.oauthImage, - displayUsername: user.displayUsername, - capabilities, - adsDisabled: user.adsDisabled, - interestedInHidingAds: user.interestedInHidingAds, - lastUsedFramework: user.lastUsedFramework, - } - } -} - -// ============================================================================ -// Auth Guard Functions -// ============================================================================ - -/** - * Require authentication - throws if not authenticated - */ -export async function requireAuthentication( - authService: IAuthService, - request: Request, -): Promise { - const user = await authService.getCurrentUser(request) - if (!user) { - throw new AuthError('Not authenticated', 'NOT_AUTHENTICATED') - } - return user -} - -/** - * Require specific capability - throws if not authorized - */ -export async function requireCapability( - authService: IAuthService, - request: Request, - capability: Capability, -): Promise { - const user = await requireAuthentication(authService, request) - - const hasAccess = - user.capabilities.includes('admin') || - user.capabilities.includes(capability) - - if (!hasAccess) { - throw new AuthError( - `Missing required capability: ${capability}`, - 'MISSING_CAPABILITY', - ) - } - - return user -} - -/** - * Require admin capability - throws if not admin - */ -export async function requireAdmin( - authService: IAuthService, - request: Request, -): Promise { - return requireCapability(authService, request, 'admin') -} diff --git a/src/auth/capabilities.server.ts b/src/auth/capabilities.server.ts deleted file mode 100644 index 47c2c5fbe..000000000 --- a/src/auth/capabilities.server.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Capabilities Service - * - * Handles authorization via capability-based access control. - * Uses inversion of control for data access. - */ - -import type { ICapabilitiesRepository, AuthUser } from './types' -import { - type Capability, - hasCapability, - hasAllCapabilities, - hasAnyCapability, - isAdmin, -} from '~/db/types' - -// Re-export capability utilities from shared types for backwards compatibility -export { hasCapability, hasAllCapabilities, hasAnyCapability, isAdmin } - -// ============================================================================ -// Capabilities Service -// ============================================================================ - -export class CapabilitiesService { - constructor(private repository: ICapabilitiesRepository) {} - - /** - * Get effective capabilities for a user (direct + role-based) - */ - async getEffectiveCapabilities(userId: string): Promise { - return this.repository.getEffectiveCapabilities(userId) - } - - /** - * Get effective capabilities for multiple users efficiently - */ - async getBulkEffectiveCapabilities( - userIds: string[], - ): Promise> { - return this.repository.getBulkEffectiveCapabilities(userIds) - } -} - -// ============================================================================ -// AuthUser-specific Capability Utilities -// ============================================================================ - -/** - * Check if AuthUser has a specific capability - */ -export function userHasCapability( - user: AuthUser | null | undefined, - capability: Capability, -): boolean { - if (!user) return false - return hasCapability(user.capabilities, capability) -} - -/** - * Check if AuthUser is admin - */ -export function userIsAdmin(user: AuthUser | null | undefined): boolean { - if (!user) return false - return isAdmin(user.capabilities) -} diff --git a/src/auth/cli-tickets.server.ts b/src/auth/cli-tickets.server.ts deleted file mode 100644 index ee33bc8c8..000000000 --- a/src/auth/cli-tickets.server.ts +++ /dev/null @@ -1,75 +0,0 @@ -/** - * CLI Auth Ticket Store - * - * In-memory store for short-lived CLI authentication tickets. - * Tickets are created by the CLI, then authorized in the browser after - * the user completes OAuth. The CLI polls for the token. - * - * TTL: 5 minutes. Single-use (consumed on exchange). - */ - -const TICKET_TTL_MS = 5 * 60 * 1000 - -interface CliTicket { - userId: string | null - sessionToken: string | null - expiresAt: number - authorized: boolean -} - -const tickets = new Map() - -// Periodic cleanup of expired tickets -setInterval( - () => { - const now = Date.now() - for (const [id, ticket] of tickets) { - if (ticket.expiresAt < now) { - tickets.delete(id) - } - } - }, - 60 * 1000, // every minute -) - -export function createCliTicket(): string { - const id = crypto.randomUUID() - tickets.set(id, { - userId: null, - sessionToken: null, - expiresAt: Date.now() + TICKET_TTL_MS, - authorized: false, - }) - return id -} - -export function getCliTicket(id: string): CliTicket | null { - const ticket = tickets.get(id) - if (!ticket) return null - if (ticket.expiresAt < Date.now()) { - tickets.delete(id) - return null - } - return ticket -} - -export function authorizeCliTicket( - id: string, - userId: string, - sessionToken: string, -): boolean { - const ticket = getCliTicket(id) - if (!ticket) return false - ticket.userId = userId - ticket.sessionToken = sessionToken - ticket.authorized = true - return true -} - -export function consumeCliTicket(id: string): string | null { - const ticket = getCliTicket(id) - if (!ticket || !ticket.authorized || !ticket.sessionToken) return null - const { sessionToken } = ticket - tickets.delete(id) - return sessionToken -} diff --git a/src/auth/client.ts b/src/auth/client.ts deleted file mode 100644 index 8c8a24943..000000000 --- a/src/auth/client.ts +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Auth Client Module - * - * Client-side authentication utilities and navigation helpers. - * This module is safe to import in browser code. - */ - -import type { OAuthProvider } from './types' - -// ============================================================================ -// Auth Client -// ============================================================================ - -/** - * Client-side auth utilities for OAuth flows - */ -export const authClient = { - signIn: { - /** - * Initiate OAuth sign-in with a social provider (full page redirect) - */ - social: ({ - provider, - returnTo, - }: { - provider: OAuthProvider - returnTo?: string - }) => { - const url = returnTo - ? `/auth/${provider}/start?returnTo=${encodeURIComponent(returnTo)}` - : `/auth/${provider}/start` - window.location.href = url - }, - - /** - * Initiate OAuth sign-in in a popup window (for modal-based login) - */ - socialPopup: ({ provider }: { provider: OAuthProvider }) => { - const width = 500 - const height = 600 - const left = window.screenX + (window.outerWidth - width) / 2 - const top = window.screenY + (window.outerHeight - height) / 2 - window.open( - `/auth/${provider}/start?popup=true`, - 'tanstack-oauth', - `width=${width},height=${height},left=${left},top=${top},popup=yes`, - ) - }, - }, - - /** - * Sign out the current user - */ - signOut: async () => { - window.location.href = '/auth/signout' - }, -} - -// ============================================================================ -// Navigation Helpers -// ============================================================================ - -/** - * Navigate to sign-in page - */ -export function navigateToSignIn( - provider?: OAuthProvider, - returnTo?: string, -): void { - if (provider) { - const url = returnTo - ? `/auth/${provider}/start?returnTo=${encodeURIComponent(returnTo)}` - : `/auth/${provider}/start` - window.location.href = url - } else { - const url = returnTo - ? `/login?returnTo=${encodeURIComponent(returnTo)}` - : '/login' - window.location.href = url - } -} - -/** - * Navigate to sign-out - */ -export function navigateToSignOut(): void { - window.location.href = '/auth/signout' -} - -/** - * Get current URL path for return-to parameter - */ -export function getCurrentPath(): string { - return window.location.pathname + window.location.search -} diff --git a/src/auth/context.server.ts b/src/auth/context.server.ts deleted file mode 100644 index 23d26db36..000000000 --- a/src/auth/context.server.ts +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Auth Context Setup - * - * Creates and configures the auth services with their dependencies. - * This is the composition root for the auth module in this application. - */ - -import { AuthService } from './auth.server' -import { CapabilitiesService } from './capabilities.server' -import { OAuthService } from './oauth.server' -import { SessionService } from './session.server' -import { createAuthGuards } from './guards.server' -import { - DrizzleUserRepository, - DrizzleOAuthAccountRepository, - DrizzleCapabilitiesRepository, -} from './repositories.server' - -// ============================================================================ -// Environment Configuration -// ============================================================================ - -function getSessionSecret(): string { - const secret = process.env.SESSION_SECRET - if (!secret) { - if (process.env.NODE_ENV === 'production') { - throw new Error( - 'SESSION_SECRET environment variable is required in production', - ) - } - // In development, require explicit opt-in to use insecure default - if (process.env.ALLOW_INSECURE_SESSION_SECRET !== 'true') { - throw new Error( - 'SESSION_SECRET environment variable is required. ' + - 'Set ALLOW_INSECURE_SESSION_SECRET=true to use insecure default in development.', - ) - } - console.warn( - '[Auth] WARNING: Using insecure session secret for development. Do NOT use in production.', - ) - return 'dev-secret-key-change-in-production' - } - return secret -} - -function isProduction(): boolean { - return process.env.NODE_ENV === 'production' -} - -// ============================================================================ -// Service Instances (Singleton pattern) -// ============================================================================ - -// Repositories -let _userRepository: DrizzleUserRepository | null = null -let _oauthAccountRepository: DrizzleOAuthAccountRepository | null = null -let _capabilitiesRepository: DrizzleCapabilitiesRepository | null = null - -// Services -let _sessionService: SessionService | null = null -let _authService: AuthService | null = null -let _capabilitiesService: CapabilitiesService | null = null -let _oauthService: OAuthService | null = null - -// ============================================================================ -// Repository Getters -// ============================================================================ - -export function getUserRepository(): DrizzleUserRepository { - if (!_userRepository) { - _userRepository = new DrizzleUserRepository() - } - return _userRepository -} - -export function getOAuthAccountRepository(): DrizzleOAuthAccountRepository { - if (!_oauthAccountRepository) { - _oauthAccountRepository = new DrizzleOAuthAccountRepository() - } - return _oauthAccountRepository -} - -export function getCapabilitiesRepository(): DrizzleCapabilitiesRepository { - if (!_capabilitiesRepository) { - _capabilitiesRepository = new DrizzleCapabilitiesRepository() - } - return _capabilitiesRepository -} - -// ============================================================================ -// Service Getters -// ============================================================================ - -export function getSessionService(): SessionService { - if (!_sessionService) { - _sessionService = new SessionService(getSessionSecret(), isProduction()) - } - return _sessionService -} - -export function getAuthService(): AuthService { - if (!_authService) { - _authService = new AuthService( - getSessionService(), - getUserRepository(), - getCapabilitiesRepository(), - ) - } - return _authService -} - -export function getCapabilitiesService(): CapabilitiesService { - if (!_capabilitiesService) { - _capabilitiesService = new CapabilitiesService(getCapabilitiesRepository()) - } - return _capabilitiesService -} - -export function getOAuthService(): OAuthService { - if (!_oauthService) { - _oauthService = new OAuthService( - getOAuthAccountRepository(), - getUserRepository(), - ) - } - return _oauthService -} - -// ============================================================================ -// Auth Guards (bound to auth service) -// ============================================================================ - -let _authGuards: ReturnType | null = null - -export function getAuthGuards() { - if (!_authGuards) { - _authGuards = createAuthGuards(getAuthService()) - } - return _authGuards -} - -// ============================================================================ -// Convenience Exports -// ============================================================================ - -/** - * Get all auth services configured for this application - */ -export function getAuthContext() { - return { - sessionService: getSessionService(), - authService: getAuthService(), - capabilitiesService: getCapabilitiesService(), - oauthService: getOAuthService(), - guards: getAuthGuards(), - repositories: { - user: getUserRepository(), - oauthAccount: getOAuthAccountRepository(), - capabilities: getCapabilitiesRepository(), - }, - } -} diff --git a/src/auth/github.server.ts b/src/auth/github.server.ts deleted file mode 100644 index 58712cb99..000000000 --- a/src/auth/github.server.ts +++ /dev/null @@ -1,111 +0,0 @@ -/** - * GitHub Auth Utilities - * - * Helper functions for checking GitHub OAuth scopes and tokens. - */ - -import { env } from '~/utils/env' -import { - buildGitHubAuthUrl, - generateOAuthState, - getOAuthAccountRepository, -} from './index.server' - -const REPO_SCOPE = 'public_repo' - -function hasRepoScopeInString(tokenScope: string | null): boolean { - if (!tokenScope) return false - const scopes = tokenScope.split(/[,\s]+/) - return scopes.includes(REPO_SCOPE) || scopes.includes('repo') -} - -/** - * Check if a user has the public_repo scope for GitHub - */ -export async function hasGitHubRepoScope(userId: string): Promise { - const repo = getOAuthAccountRepository() - const account = await repo.findByUserId(userId, 'github') - return hasRepoScopeInString(account?.tokenScope ?? null) -} - -/** - * Get a user's GitHub access token - */ -export async function getGitHubToken(userId: string): Promise { - const repo = getOAuthAccountRepository() - const account = await repo.findByUserId(userId, 'github') - return account?.accessToken ?? null -} - -/** - * Get a user's GitHub username from their access token - */ -export async function getGitHubUsername( - accessToken: string, -): Promise { - const response = await fetch('https://api.github.com/user', { - headers: { - Authorization: `Bearer ${accessToken}`, - Accept: 'application/vnd.github.v3+json', - }, - }) - - if (!response.ok) return null - - const profile = await response.json() - return profile.login ?? null -} - -export interface GitHubAuthState { - hasGitHubAccount: boolean - hasRepoScope: boolean - accessToken: string | null -} - -/** - * Get complete GitHub auth state for a user - */ -export async function getGitHubAuthState( - userId: string, -): Promise { - const repo = getOAuthAccountRepository() - const account = await repo.findByUserId(userId, 'github') - - if (!account) { - return { - hasGitHubAccount: false, - hasRepoScope: false, - accessToken: null, - } - } - - return { - hasGitHubAccount: true, - hasRepoScope: hasRepoScopeInString(account.tokenScope), - accessToken: account.accessToken, - } -} - -/** - * Build a GitHub re-auth URL with additional scopes - */ -export function buildGitHubReAuthUrl( - returnTo: string, - additionalScopes: Array, -): string { - const clientId = env.GITHUB_OAUTH_CLIENT_ID - if (!clientId) { - throw new Error('GITHUB_OAUTH_CLIENT_ID is not configured') - } - - const origin = env.SITE_URL - if (!origin) { - throw new Error('SITE_URL is not configured') - } - - const redirectUri = `${origin}/api/auth/callback/github` - const state = generateOAuthState() - - // Build auth URL with additional scopes - return buildGitHubAuthUrl(clientId, redirectUri, state, additionalScopes) -} diff --git a/src/auth/guards.server.ts b/src/auth/guards.server.ts deleted file mode 100644 index 1824c8b55..000000000 --- a/src/auth/guards.server.ts +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Auth Guards Module - * - * Provides guard functions for protecting routes and server functions. - * These are convenience wrappers around the auth service. - */ - -import type { AuthUser, Capability, IAuthService } from './types' -import { AuthError } from './types' - -// ============================================================================ -// Guard Factory -// ============================================================================ - -/** - * Create guard functions bound to an auth service instance - */ -export function createAuthGuards(authService: IAuthService) { - return { - /** - * Get current user (non-blocking, returns null if not authenticated) - */ - async getCurrentUser(request: Request): Promise { - try { - return await authService.getCurrentUser(request) - } catch { - return null - } - }, - - /** - * Require authentication (throws if not authenticated) - */ - async requireAuth(request: Request): Promise { - const user = await authService.getCurrentUser(request) - if (!user) { - throw new AuthError('Not authenticated', 'NOT_AUTHENTICATED') - } - return user - }, - - /** - * Require specific capability (throws if not authorized) - */ - async requireCapability( - request: Request, - capability: Capability, - ): Promise { - const user = await authService.getCurrentUser(request) - if (!user) { - throw new AuthError('Not authenticated', 'NOT_AUTHENTICATED') - } - - const hasAccess = - user.capabilities.includes('admin') || - user.capabilities.includes(capability) - - if (!hasAccess) { - throw new AuthError( - `Missing required capability: ${capability}`, - 'MISSING_CAPABILITY', - ) - } - - return user - }, - - /** - * Require admin access - */ - async requireAdmin(request: Request): Promise { - return this.requireCapability(request, 'admin') - }, - - /** - * Check if user has capability (non-throwing) - */ - async hasCapability( - request: Request, - capability: Capability, - ): Promise { - try { - await this.requireCapability(request, capability) - return true - } catch { - return false - } - }, - - /** - * Check if user is authenticated (non-throwing) - */ - async isAuthenticated(request: Request): Promise { - const user = await this.getCurrentUser(request) - return user !== null - }, - - /** - * Check if user is admin (non-throwing) - */ - async isAdmin(request: Request): Promise { - return this.hasCapability(request, 'admin') - }, - } -} - -// ============================================================================ -// Guard Types -// ============================================================================ - -export type AuthGuards = ReturnType - -// ============================================================================ -// Capability Guard Decorator Pattern (for server functions) -// ============================================================================ - -/** - * Create a guard that wraps a handler with capability check - */ -export function withCapability( - guards: AuthGuards, - capability: Capability, - getRequest: () => Request, - handler: (user: AuthUser, ...args: TArgs) => TReturn, -) { - return async (...args: TArgs): Promise> => { - const request = getRequest() - const user = await guards.requireCapability(request, capability) - return (await handler(user, ...args)) as Awaited - } -} - -/** - * Create a guard that wraps a handler with auth check - */ -export function withAuth( - guards: AuthGuards, - getRequest: () => Request, - handler: (user: AuthUser, ...args: TArgs) => TReturn, -) { - return async (...args: TArgs): Promise> => { - const request = getRequest() - const user = await guards.requireAuth(request) - return (await handler(user, ...args)) as Awaited - } -} diff --git a/src/auth/index.server.ts b/src/auth/index.server.ts deleted file mode 100644 index 9f51be1da..000000000 --- a/src/auth/index.server.ts +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Auth Module - Server Entry Point - * - * This is the main entry point for server-side auth functionality. - * Import from '~/auth/index.server' for server-side code. - * - * Example usage: - * - * ```ts - * import { getAuthService, getAuthGuards } from '~/auth/index.server' - * - * // In a server function or loader - * const authService = getAuthService() - * const user = await authService.getCurrentUser(request) - * - * // Or use guards - * const guards = getAuthGuards() - * const user = await guards.requireAuth(request) - * ``` - */ - -// ============================================================================ -// Types (re-exported from types module) -// ============================================================================ - -export type { - // Core types - Capability, - OAuthProvider, - OAuthProfile, - OAuthResult, - SessionCookieData, - AuthUser, - DbUser, - // Interfaces for IoC - IUserRepository, - IOAuthAccountRepository, - ICapabilitiesRepository, - ISessionService, - IAuthService, - IOAuthService, - AuthContext, - // Error types - AuthErrorCode, -} from './types' - -export { VALID_CAPABILITIES, AuthError } from './types' - -// ============================================================================ -// Services -// ============================================================================ - -export { AuthService } from './auth.server' -export { SessionService } from './session.server' -export { CapabilitiesService } from './capabilities.server' -export { OAuthService } from './oauth.server' - -// ============================================================================ -// Session Utilities -// ============================================================================ - -export { - generateOAuthState, - createOAuthStateCookie, - clearOAuthStateCookie, - getOAuthStateCookie, - createOAuthPopupCookie, - clearOAuthPopupCookie, - isOAuthPopupMode, - createOAuthReturnToCookie, - clearOAuthReturnToCookie, - getOAuthReturnTo, - SESSION_DURATION_MS, - SESSION_MAX_AGE_SECONDS, -} from './session.server' - -// ============================================================================ -// Capability Utilities -// ============================================================================ - -export { - hasCapability, - hasAllCapabilities, - hasAnyCapability, - isAdmin, - userHasCapability, - userIsAdmin, -} from './capabilities.server' - -// ============================================================================ -// OAuth Utilities -// ============================================================================ - -export { - buildGitHubAuthUrl, - buildGoogleAuthUrl, - exchangeGitHubCode, - exchangeGoogleCode, - fetchGitHubProfile, - fetchGoogleProfile, -} from './oauth.server' - -// ============================================================================ -// Guards -// ============================================================================ - -export { createAuthGuards, withCapability, withAuth } from './guards.server' -export type { AuthGuards } from './guards.server' - -// ============================================================================ -// Repositories (for custom implementations) -// ============================================================================ - -export { - DrizzleUserRepository, - DrizzleOAuthAccountRepository, - DrizzleCapabilitiesRepository, - createRepositories, -} from './repositories.server' - -// ============================================================================ -// Context & Service Accessors (Application-specific) -// ============================================================================ - -export { - getAuthContext, - getAuthService, - getSessionService, - getCapabilitiesService, - getOAuthService, - getAuthGuards, - getUserRepository, - getOAuthAccountRepository, - getCapabilitiesRepository, -} from './context.server' diff --git a/src/auth/index.ts b/src/auth/index.ts deleted file mode 100644 index 9191a2460..000000000 --- a/src/auth/index.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Auth Module - Client Entry Point - * - * This is the main entry point for client-side auth functionality. - * Import from '~/auth' for client-side code. - * - * For server-side code, import from '~/auth/index.server' instead. - * - * Example usage: - * - * ```tsx - * import { authClient, navigateToSignIn } from '~/auth' - * - * // Sign in with GitHub - * authClient.signIn.social({ provider: 'github' }) - * - * // Sign out - * authClient.signOut() - * ``` - */ - -// ============================================================================ -// Types (client-safe types only) -// ============================================================================ - -export type { - Capability, - OAuthProvider, - AuthUser, - AuthErrorCode, -} from './types' - -export { VALID_CAPABILITIES, AuthError } from './types' - -// ============================================================================ -// Client Auth -// ============================================================================ - -export { - authClient, - navigateToSignIn, - navigateToSignOut, - getCurrentPath, -} from './client' - -// ============================================================================ -// Capability Utilities (client-safe) -// ============================================================================ - -export { - hasCapability, - hasAllCapabilities, - hasAnyCapability, - isAdmin, - userHasCapability, - userIsAdmin, -} from './capabilities.server' diff --git a/src/auth/oauth.server.ts b/src/auth/oauth.server.ts deleted file mode 100644 index 53d2405b2..000000000 --- a/src/auth/oauth.server.ts +++ /dev/null @@ -1,410 +0,0 @@ -/** - * OAuth Service - * - * Handles OAuth account management and user creation/linking. - * Uses inversion of control for database access. - */ - -import type { - IOAuthService, - IOAuthAccountRepository, - IUserRepository, - OAuthProfile, - OAuthProvider, - OAuthResult, -} from './types' -import { AuthError } from './types' - -// ============================================================================ -// OAuth Service Implementation -// ============================================================================ - -export class OAuthService implements IOAuthService { - constructor( - private oauthAccountRepository: IOAuthAccountRepository, - private userRepository: IUserRepository, - ) {} - - /** - * Upsert OAuth account and associated user - * - If OAuth account exists, updates user info and returns existing user - * - If user with email exists, links OAuth account to existing user - * - Otherwise, creates new user and OAuth account - */ - async upsertOAuthAccount( - provider: OAuthProvider, - profile: OAuthProfile, - tokenInfo?: { accessToken: string; scope: string }, - ): Promise { - try { - // Check if OAuth account already exists - const existingAccount = - await this.oauthAccountRepository.findByProviderAndAccountId( - provider, - profile.id, - ) - - if (existingAccount) { - // Account exists, update user info if needed - const user = await this.userRepository.findById(existingAccount.userId) - - if (!user) { - console.error( - `[OAuthService] OAuth account exists for ${provider}:${profile.id} but user ${existingAccount.userId} not found`, - ) - throw new AuthError( - 'User not found for existing OAuth account', - 'USER_NOT_FOUND', - ) - } - - const updates: { - email?: string - name?: string - oauthImage?: string - updatedAt?: Date - } = {} - - if (profile.email && user.email !== profile.email) { - updates.email = profile.email - } - if (profile.name && user.name !== profile.name) { - updates.name = profile.name - } - // Always update oauthImage from provider (it may have changed) - if (profile.image && user.oauthImage !== profile.image) { - updates.oauthImage = profile.image - } - - if (Object.keys(updates).length > 0) { - updates.updatedAt = new Date() - await this.userRepository.update(existingAccount.userId, updates) - } - - // Update token if provided - if (tokenInfo) { - await this.oauthAccountRepository.updateToken( - existingAccount.userId, - provider, - tokenInfo.accessToken, - tokenInfo.scope, - ) - } - - return { - userId: existingAccount.userId, - isNewUser: false, - } - } - - // Find user by email (for linking multiple OAuth providers) - const existingUser = await this.userRepository.findByEmail(profile.email) - - let userId: string - - if (existingUser) { - // Link OAuth account to existing user - console.log( - `[OAuthService] Linking ${provider} account to existing user ${existingUser.id} (${profile.email})`, - ) - userId = existingUser.id - - // Update user info if provided and not already set - const updates: { - name?: string - image?: string - oauthImage?: string - updatedAt?: Date - } = {} - - if (profile.name && !existingUser.name) { - updates.name = profile.name - } - if (profile.image && !existingUser.image) { - updates.image = profile.image - } - // Always update oauthImage from provider - if (profile.image && existingUser.oauthImage !== profile.image) { - updates.oauthImage = profile.image - } - - if (Object.keys(updates).length > 0) { - updates.updatedAt = new Date() - await this.userRepository.update(userId, updates) - } - } else { - // Create new user - console.log( - `[OAuthService] Creating new user for ${provider} login: ${profile.email}`, - ) - const newUser = await this.userRepository.create({ - email: profile.email, - name: profile.name, - image: profile.image, - oauthImage: profile.image, - displayUsername: profile.name, - capabilities: [], - }) - - userId = newUser.id - } - - // Create OAuth account link with token if provided - await this.oauthAccountRepository.create({ - userId, - provider, - providerAccountId: profile.id, - email: profile.email, - accessToken: tokenInfo?.accessToken, - tokenScope: tokenInfo?.scope, - }) - - return { - userId, - isNewUser: !existingUser, - } - } catch (error) { - if (error instanceof AuthError) { - throw error - } - - console.error( - `[OAuthService] Failed to upsert OAuth account for ${provider}:${profile.id} (${profile.email}):`, - { - error: error instanceof Error ? error.message : 'Unknown error', - stack: error instanceof Error ? error.stack : undefined, - }, - ) - throw new AuthError( - `OAuth account creation failed: ${error instanceof Error ? error.message : 'Unknown error'}`, - 'OAUTH_ERROR', - ) - } - } -} - -// ============================================================================ -// OAuth Provider Utilities -// ============================================================================ - -/** - * Build GitHub OAuth authorization URL - */ -export function buildGitHubAuthUrl( - clientId: string, - redirectUri: string, - state: string, - additionalScopes?: Array, -): string { - const scopes = ['user:email', ...(additionalScopes ?? [])].join(' ') - return `https://github.com/login/oauth/authorize?client_id=${encodeURIComponent( - clientId, - )}&redirect_uri=${encodeURIComponent( - redirectUri, - )}&scope=${encodeURIComponent(scopes)}&state=${encodeURIComponent(state)}` -} - -/** - * Build Google OAuth authorization URL - */ -export function buildGoogleAuthUrl( - clientId: string, - redirectUri: string, - state: string, -): string { - return `https://accounts.google.com/o/oauth2/v2/auth?client_id=${encodeURIComponent( - clientId, - )}&redirect_uri=${encodeURIComponent( - redirectUri, - )}&response_type=code&scope=openid email profile&state=${encodeURIComponent(state)}` -} - -export interface GitHubTokenResult { - accessToken: string - scope: string -} - -/** - * Exchange GitHub authorization code for access token - */ -export async function exchangeGitHubCode( - code: string, - clientId: string, - clientSecret: string, - redirectUri: string, -): Promise { - const tokenResponse = await fetch( - 'https://github.com/login/oauth/access_token', - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - body: JSON.stringify({ - client_id: clientId, - client_secret: clientSecret, - code, - redirect_uri: redirectUri, - }), - }, - ) - - const tokenData = await tokenResponse.json() - if (tokenData.error) { - console.error( - `[OAuth] GitHub token exchange failed: ${tokenData.error}, description: ${tokenData.error_description || 'none'}`, - ) - throw new AuthError(`GitHub OAuth error: ${tokenData.error}`, 'OAUTH_ERROR') - } - - if (!tokenData.access_token) { - console.error( - '[OAuth] GitHub token exchange succeeded but no access_token returned', - ) - throw new AuthError('No access token received from GitHub', 'OAUTH_ERROR') - } - - return { - accessToken: tokenData.access_token, - scope: tokenData.scope ?? '', - } -} - -/** - * Fetch GitHub user profile - */ -export async function fetchGitHubProfile( - accessToken: string, -): Promise { - const profileResponse = await fetch('https://api.github.com/user', { - headers: { - Authorization: `Bearer ${accessToken}`, - Accept: 'application/vnd.github.v3+json', - }, - }) - - const profile = await profileResponse.json() - - // Fetch email (may require separate call) - let email = profile.email - if (!email) { - const emailResponse = await fetch('https://api.github.com/user/emails', { - headers: { - Authorization: `Bearer ${accessToken}`, - Accept: 'application/vnd.github.v3+json', - }, - }) - const emails = await emailResponse.json() - - if (!Array.isArray(emails)) { - console.error( - `[OAuth] GitHub emails API returned non-array response:`, - emails, - ) - throw new AuthError( - emails?.message || 'Failed to fetch GitHub emails', - 'OAUTH_ERROR', - ) - } - - const primaryEmail = emails.find( - (e: { primary: boolean; verified: boolean; email: string }) => - e.primary && e.verified, - ) - const verifiedEmail = emails.find( - (e: { verified: boolean; email: string }) => e.verified, - ) - email = primaryEmail?.email || verifiedEmail?.email - } - - if (!email) { - console.error( - `[OAuth] No verified email found for GitHub user ${profile.id} (${profile.login})`, - ) - throw new AuthError( - 'No verified email found for GitHub account', - 'OAUTH_ERROR', - ) - } - - return { - id: String(profile.id), - email, - name: profile.name || profile.login, - image: profile.avatar_url, - } -} - -/** - * Exchange Google authorization code for access token - */ -export async function exchangeGoogleCode( - code: string, - clientId: string, - clientSecret: string, - redirectUri: string, -): Promise { - const tokenResponse = await fetch('https://oauth2.googleapis.com/token', { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - body: new URLSearchParams({ - client_id: clientId, - client_secret: clientSecret, - code, - redirect_uri: redirectUri, - grant_type: 'authorization_code', - }), - }) - - const tokenData = await tokenResponse.json() - if (tokenData.error) { - console.error( - `[OAuth] Google token exchange failed: ${tokenData.error}, description: ${tokenData.error_description || 'none'}`, - ) - throw new AuthError(`Google OAuth error: ${tokenData.error}`, 'OAUTH_ERROR') - } - - if (!tokenData.access_token) { - console.error( - '[OAuth] Google token exchange succeeded but no access_token returned', - ) - throw new AuthError('No access token received from Google', 'OAUTH_ERROR') - } - - return tokenData.access_token -} - -/** - * Fetch Google user profile - */ -export async function fetchGoogleProfile( - accessToken: string, -): Promise { - const profileResponse = await fetch( - 'https://www.googleapis.com/oauth2/v2/userinfo', - { - headers: { - Authorization: `Bearer ${accessToken}`, - }, - }, - ) - - const profile = await profileResponse.json() - - if (!profile.verified_email) { - console.error( - `[OAuth] Google email not verified for user ${profile.id} (${profile.email})`, - ) - throw new AuthError('Google email not verified', 'OAUTH_ERROR') - } - - return { - id: profile.id, - email: profile.email, - name: profile.name, - image: profile.picture, - } -} diff --git a/src/auth/oauthClient.server.ts b/src/auth/oauthClient.server.ts deleted file mode 100644 index 3bda8bd1c..000000000 --- a/src/auth/oauthClient.server.ts +++ /dev/null @@ -1,442 +0,0 @@ -import { db } from '~/db/client' -import { - oauthAuthorizationCodes, - oauthAccessTokens, - oauthRefreshTokens, -} from '~/db/schema' -import { eq, and, sql, lt } from 'drizzle-orm' -import { sha256Hex } from '~/utils/hash' - -// Token TTLs -const AUTH_CODE_TTL_MS = 10 * 60 * 1000 // 10 minutes -const ACCESS_TOKEN_TTL_MS = 60 * 60 * 1000 // 1 hour -const REFRESH_TOKEN_TTL_MS = 30 * 24 * 60 * 60 * 1000 // 30 days - -// Token prefixes (new generic prefixes) -const ACCESS_TOKEN_PREFIX = 'oa_' -const REFRESH_TOKEN_PREFIX = 'oar_' - -// Legacy prefixes for backwards compatibility -const LEGACY_ACCESS_TOKEN_PREFIX = 'mcp_' -const LEGACY_REFRESH_TOKEN_PREFIX = 'mcpr_' - -export type OAuthValidationResult = - | { - success: true - tokenId: string - userId: string - clientId: string - } - | { - success: false - error: string - status: number - } - -/** - * Generate a secure random token with prefix - */ -export function generateToken(prefix: string): string { - const bytes = new Uint8Array(32) - crypto.getRandomValues(bytes) - const hex = Array.from(bytes) - .map((b) => b.toString(16).padStart(2, '0')) - .join('') - return prefix + hex -} - -/** - * Hash a token using SHA-256 - */ -export const hashToken = sha256Hex - -/** - * Validate redirect URI - must be localhost or HTTPS - */ -export function validateRedirectUri(uri: string): boolean { - try { - const url = new URL(uri) - - // Allow localhost (any port) - if ( - url.hostname === 'localhost' || - url.hostname === '127.0.0.1' || - url.hostname === '[::1]' - ) { - return true - } - - // Allow HTTPS URLs - if (url.protocol === 'https:') { - return true - } - - return false - } catch { - return false - } -} - -/** - * Verify PKCE code challenge - * code_challenge = BASE64URL(SHA256(code_verifier)) - */ -export async function verifyCodeChallenge( - codeVerifier: string, - codeChallenge: string, -): Promise { - const encoder = new TextEncoder() - const data = encoder.encode(codeVerifier) - const hashBuffer = await crypto.subtle.digest('SHA-256', data) - const hashArray = new Uint8Array(hashBuffer) - - // Base64URL encode - const base64 = btoa(String.fromCharCode(...hashArray)) - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/=/g, '') - - return base64 === codeChallenge -} - -/** - * Check if a token is an OAuth client token (new or legacy format) - */ -export function isOAuthClientToken(token: string): boolean { - return ( - token.startsWith(ACCESS_TOKEN_PREFIX) || - token.startsWith(LEGACY_ACCESS_TOKEN_PREFIX) - ) -} - -/** - * Check if a token is an OAuth refresh token (new or legacy format) - */ -export function isOAuthRefreshToken(token: string): boolean { - return ( - token.startsWith(REFRESH_TOKEN_PREFIX) || - token.startsWith(LEGACY_REFRESH_TOKEN_PREFIX) - ) -} - -/** - * Create an authorization code - */ -export async function createAuthorizationCode(params: { - userId: string - clientId: string - redirectUri: string - codeChallenge: string - codeChallengeMethod?: string - scope?: string -}): Promise { - const code = generateToken('') - const codeHash = await hashToken(code) - const expiresAt = new Date(Date.now() + AUTH_CODE_TTL_MS) - - await db.insert(oauthAuthorizationCodes).values({ - codeHash, - userId: params.userId, - clientId: params.clientId, - redirectUri: params.redirectUri, - codeChallenge: params.codeChallenge, - codeChallengeMethod: params.codeChallengeMethod || 'S256', - scope: params.scope || 'api', - expiresAt, - }) - - return code -} - -/** - * Exchange authorization code for tokens - */ -export async function exchangeAuthorizationCode(params: { - code: string - codeVerifier: string - redirectUri: string -}): Promise< - | { - success: true - accessToken: string - refreshToken: string - expiresIn: number - scope: string - } - | { success: false; error: string } -> { - const codeHash = await hashToken(params.code) - - // Find and validate auth code - const authCodes = await db - .select() - .from(oauthAuthorizationCodes) - .where(eq(oauthAuthorizationCodes.codeHash, codeHash)) - .limit(1) - - const authCode = authCodes[0] - - if (!authCode) { - return { success: false, error: 'invalid_grant' } - } - - // Check expiration - if (authCode.expiresAt < new Date()) { - await db - .delete(oauthAuthorizationCodes) - .where(eq(oauthAuthorizationCodes.id, authCode.id)) - return { success: false, error: 'invalid_grant' } - } - - // Validate redirect URI matches - if (authCode.redirectUri !== params.redirectUri) { - return { success: false, error: 'invalid_grant' } - } - - // Verify PKCE - const pkceValid = await verifyCodeChallenge( - params.codeVerifier, - authCode.codeChallenge, - ) - if (!pkceValid) { - return { success: false, error: 'invalid_grant' } - } - - // Delete auth code (one-time use) - await db - .delete(oauthAuthorizationCodes) - .where(eq(oauthAuthorizationCodes.id, authCode.id)) - - // Generate tokens (using new prefixes) - const accessToken = generateToken(ACCESS_TOKEN_PREFIX) - const refreshToken = generateToken(REFRESH_TOKEN_PREFIX) - const accessTokenHash = await hashToken(accessToken) - const refreshTokenHash = await hashToken(refreshToken) - - const accessExpiresAt = new Date(Date.now() + ACCESS_TOKEN_TTL_MS) - const refreshExpiresAt = new Date(Date.now() + REFRESH_TOKEN_TTL_MS) - - // Insert access token - const accessTokenResult = await db - .insert(oauthAccessTokens) - .values({ - tokenHash: accessTokenHash, - userId: authCode.userId, - clientId: authCode.clientId, - scope: authCode.scope, - expiresAt: accessExpiresAt, - }) - .returning({ id: oauthAccessTokens.id }) - - // Insert refresh token - await db.insert(oauthRefreshTokens).values({ - tokenHash: refreshTokenHash, - userId: authCode.userId, - clientId: authCode.clientId, - accessTokenId: accessTokenResult[0].id, - expiresAt: refreshExpiresAt, - }) - - return { - success: true, - accessToken, - refreshToken, - expiresIn: Math.floor(ACCESS_TOKEN_TTL_MS / 1000), - scope: authCode.scope, - } -} - -/** - * Refresh an access token - */ -export async function refreshAccessToken(refreshToken: string): Promise< - | { - success: true - accessToken: string - expiresIn: number - scope: string - } - | { success: false; error: string } -> { - const tokenHash = await hashToken(refreshToken) - - // Find refresh token - const refreshTokens = await db - .select() - .from(oauthRefreshTokens) - .where(eq(oauthRefreshTokens.tokenHash, tokenHash)) - .limit(1) - - const token = refreshTokens[0] - - if (!token) { - return { success: false, error: 'invalid_grant' } - } - - // Check expiration - if (token.expiresAt < new Date()) { - await db - .delete(oauthRefreshTokens) - .where(eq(oauthRefreshTokens.id, token.id)) - return { success: false, error: 'invalid_grant' } - } - - // Generate new access token (using new prefix) - const accessToken = generateToken(ACCESS_TOKEN_PREFIX) - const accessTokenHash = await hashToken(accessToken) - const accessExpiresAt = new Date(Date.now() + ACCESS_TOKEN_TTL_MS) - - // Insert new access token - const accessTokenResult = await db - .insert(oauthAccessTokens) - .values({ - tokenHash: accessTokenHash, - userId: token.userId, - clientId: token.clientId, - scope: 'api', - expiresAt: accessExpiresAt, - }) - .returning({ id: oauthAccessTokens.id }) - - // Update refresh token to point to new access token - await db - .update(oauthRefreshTokens) - .set({ accessTokenId: accessTokenResult[0].id }) - .where(eq(oauthRefreshTokens.id, token.id)) - - return { - success: true, - accessToken, - expiresIn: Math.floor(ACCESS_TOKEN_TTL_MS / 1000), - scope: 'api', - } -} - -/** - * Validate an OAuth access token - * Supports both new (oa_) and legacy (mcp_) token prefixes - */ -export async function validateOAuthToken( - token: string, -): Promise { - const tokenHash = await hashToken(token) - - const result = await db - .select({ - id: oauthAccessTokens.id, - userId: oauthAccessTokens.userId, - clientId: oauthAccessTokens.clientId, - expiresAt: oauthAccessTokens.expiresAt, - }) - .from(oauthAccessTokens) - .where(eq(oauthAccessTokens.tokenHash, tokenHash)) - .limit(1) - - const accessToken = result[0] - - if (!accessToken) { - return { - success: false, - error: 'Invalid access token', - status: 401, - } - } - - // Check expiration - if (accessToken.expiresAt < new Date()) { - return { - success: false, - error: 'Access token has expired', - status: 401, - } - } - - // Update last used (fire and forget) - db.update(oauthAccessTokens) - .set({ lastUsedAt: new Date() }) - .where(eq(oauthAccessTokens.id, accessToken.id)) - .catch(() => {}) - - return { - success: true, - tokenId: accessToken.id, - userId: accessToken.userId, - clientId: accessToken.clientId, - } -} - -/** - * List connected OAuth apps for a user - * Uses refresh tokens since they persist longer than access tokens - */ -export async function listConnectedApps(userId: string): Promise< - Array<{ - clientId: string - createdAt: string - lastUsedAt: string | null - }> -> { - // Get unique clients from refresh tokens (more persistent than access tokens) - const result = await db - .select({ - clientId: oauthRefreshTokens.clientId, - createdAt: sql`MIN(${oauthRefreshTokens.createdAt})::text`, - }) - .from(oauthRefreshTokens) - .where(eq(oauthRefreshTokens.userId, userId)) - .groupBy(oauthRefreshTokens.clientId) - - return result.map((r) => ({ - clientId: r.clientId, - createdAt: r.createdAt, - lastUsedAt: null, - })) -} - -/** - * Revoke all tokens for a specific client - */ -export async function revokeTokensForClient( - userId: string, - clientId: string, -): Promise { - // Delete refresh tokens first (they reference access tokens) - await db - .delete(oauthRefreshTokens) - .where( - and( - eq(oauthRefreshTokens.userId, userId), - eq(oauthRefreshTokens.clientId, clientId), - ), - ) - - // Delete access tokens - await db - .delete(oauthAccessTokens) - .where( - and( - eq(oauthAccessTokens.userId, userId), - eq(oauthAccessTokens.clientId, clientId), - ), - ) -} - -/** - * Clean up expired tokens - */ -export async function cleanupExpiredTokens(): Promise { - const now = new Date() - - // Delete expired auth codes - await db - .delete(oauthAuthorizationCodes) - .where(lt(oauthAuthorizationCodes.expiresAt, now)) - - // Delete expired refresh tokens - await db - .delete(oauthRefreshTokens) - .where(lt(oauthRefreshTokens.expiresAt, now)) - - // Delete expired access tokens - await db.delete(oauthAccessTokens).where(lt(oauthAccessTokens.expiresAt, now)) -} diff --git a/src/auth/repositories.server.ts b/src/auth/repositories.server.ts deleted file mode 100644 index 6723aba31..000000000 --- a/src/auth/repositories.server.ts +++ /dev/null @@ -1,336 +0,0 @@ -/** - * Auth Repositories - * - * Implementation of repository interfaces using the application's database. - * This is the bridge between the auth module and the actual data layer. - * - * Note: This file imports from the application's database, making it - * application-specific. The auth module itself (types, services) remains - * database-agnostic through the repository interfaces. - */ - -import { db } from '~/db/client' -import { users, oauthAccounts, roles, roleAssignments } from '~/db/schema' -import { eq, and, inArray } from 'drizzle-orm' -import type { - Capability, - DbUser, - ICapabilitiesRepository, - IOAuthAccountRepository, - IUserRepository, - OAuthProvider, -} from './types' -import { encryptToken, decryptStoredToken } from '~/utils/crypto.server' - -// ============================================================================ -// User Repository Implementation -// ============================================================================ - -export class DrizzleUserRepository implements IUserRepository { - async findById(userId: string): Promise { - const user = await db.query.users.findFirst({ - where: eq(users.id, userId), - }) - - if (!user) return null - - return this.mapToDbUser(user) - } - - async findByEmail(email: string): Promise { - const user = await db.query.users.findFirst({ - where: eq(users.email, email), - }) - - if (!user) return null - - return this.mapToDbUser(user) - } - - async create(data: { - email: string - name?: string - image?: string - oauthImage?: string - displayUsername?: string - capabilities?: Capability[] - }): Promise { - const [newUser] = await db - .insert(users) - .values({ - email: data.email, - name: data.name, - image: data.image, - oauthImage: data.oauthImage, - displayUsername: data.displayUsername, - capabilities: data.capabilities || [], - }) - .returning() - - if (!newUser) { - throw new Error('Failed to create user') - } - - return this.mapToDbUser(newUser) - } - - async update( - userId: string, - data: Partial<{ - email: string - name: string - image: string | null - oauthImage: string - displayUsername: string - capabilities: Capability[] - adsDisabled: boolean - interestedInHidingAds: boolean - sessionVersion: number - updatedAt: Date - }>, - ): Promise { - await db - .update(users) - .set({ ...data, updatedAt: data.updatedAt || new Date() }) - .where(eq(users.id, userId)) - } - - async incrementSessionVersion(userId: string): Promise { - // Get current version first - const user = await this.findById(userId) - if (user) { - await db - .update(users) - .set({ - sessionVersion: user.sessionVersion + 1, - updatedAt: new Date(), - }) - .where(eq(users.id, userId)) - } - } - - private mapToDbUser(user: typeof users.$inferSelect): DbUser { - return { - id: user.id, - email: user.email, - name: user.name, - image: user.image, - oauthImage: user.oauthImage, - displayUsername: user.displayUsername, - capabilities: user.capabilities as Capability[], - adsDisabled: user.adsDisabled, - interestedInHidingAds: user.interestedInHidingAds, - lastUsedFramework: user.lastUsedFramework, - sessionVersion: user.sessionVersion, - createdAt: user.createdAt, - updatedAt: user.updatedAt, - } - } -} - -// ============================================================================ -// OAuth Account Repository Implementation -// ============================================================================ - -export class DrizzleOAuthAccountRepository implements IOAuthAccountRepository { - async findByProviderAndAccountId( - provider: OAuthProvider, - providerAccountId: string, - ): Promise<{ - userId: string - accessToken: string | null - tokenScope: string | null - } | null> { - const account = await db.query.oauthAccounts.findFirst({ - where: and( - eq(oauthAccounts.provider, provider), - eq(oauthAccounts.providerAccountId, providerAccountId), - ), - }) - - if (!account) return null - - return { - userId: account.userId, - accessToken: decryptStoredToken(account.accessToken), - tokenScope: account.tokenScope, - } - } - - async findByUserId( - userId: string, - provider: OAuthProvider, - ): Promise<{ accessToken: string | null; tokenScope: string | null } | null> { - const account = await db.query.oauthAccounts.findFirst({ - where: and( - eq(oauthAccounts.userId, userId), - eq(oauthAccounts.provider, provider), - ), - }) - - if (!account) return null - - return { - accessToken: decryptStoredToken(account.accessToken), - tokenScope: account.tokenScope, - } - } - - async create(data: { - userId: string - provider: OAuthProvider - providerAccountId: string - email: string - accessToken?: string - tokenScope?: string - }): Promise { - await db.insert(oauthAccounts).values({ - userId: data.userId, - provider: data.provider, - providerAccountId: data.providerAccountId, - email: data.email, - accessToken: data.accessToken - ? encryptToken(data.accessToken) - : undefined, - tokenScope: data.tokenScope, - }) - } - - async updateToken( - userId: string, - provider: OAuthProvider, - accessToken: string, - tokenScope: string, - ): Promise { - await db - .update(oauthAccounts) - .set({ - accessToken: encryptToken(accessToken), - tokenScope, - }) - .where( - and( - eq(oauthAccounts.userId, userId), - eq(oauthAccounts.provider, provider), - ), - ) - } -} - -// ============================================================================ -// Capabilities Repository Implementation -// ============================================================================ - -export class DrizzleCapabilitiesRepository implements ICapabilitiesRepository { - async getEffectiveCapabilities(userId: string): Promise { - // Single query to get both user capabilities and role capabilities - const result = await db - .select({ - userCapabilities: users.capabilities, - roleCapabilities: roles.capabilities, - }) - .from(users) - .leftJoin(roleAssignments, eq(roleAssignments.userId, users.id)) - .leftJoin(roles, eq(roles.id, roleAssignments.roleId)) - .where(eq(users.id, userId)) - - if (result.length === 0) { - return [] - } - - // Extract user capabilities (same for all rows) - const directCapabilities = (result[0]?.userCapabilities || - []) as Capability[] - - // Collect all role capabilities from all rows - const roleCapabilities = result - .map((r) => r.roleCapabilities) - .filter( - (caps): caps is Capability[] => caps !== null && Array.isArray(caps), - ) - .flat() as Capability[] - - // Union of direct capabilities and role capabilities - const effectiveCapabilities = Array.from( - new Set([...directCapabilities, ...roleCapabilities]), - ) - - return effectiveCapabilities - } - - async getBulkEffectiveCapabilities( - userIds: string[], - ): Promise> { - if (userIds.length === 0) { - return {} - } - - // Single query to get all user capabilities and role capabilities for all users - const result = await db - .select({ - userId: users.id, - userCapabilities: users.capabilities, - roleCapabilities: roles.capabilities, - }) - .from(users) - .leftJoin(roleAssignments, eq(roleAssignments.userId, users.id)) - .leftJoin(roles, eq(roles.id, roleAssignments.roleId)) - .where(inArray(users.id, userIds)) - - // Group results by userId - const userCapabilitiesMap: Record = {} - const userRoleCapabilitiesMap: Record = {} - - for (const row of result) { - const userId = row.userId - - // Store direct capabilities (same for all rows of the same user) - if (!userCapabilitiesMap[userId]) { - userCapabilitiesMap[userId] = (row.userCapabilities || - []) as Capability[] - } - - // Collect role capabilities - if (row.roleCapabilities && Array.isArray(row.roleCapabilities)) { - if (!userRoleCapabilitiesMap[userId]) { - userRoleCapabilitiesMap[userId] = [] - } - userRoleCapabilitiesMap[userId].push( - ...(row.roleCapabilities as Capability[]), - ) - } - } - - // Compute effective capabilities for each user - const effectiveCapabilitiesMap: Record = {} - - for (const userId of userIds) { - const directCapabilities = userCapabilitiesMap[userId] || [] - const roleCapabilities = userRoleCapabilitiesMap[userId] || [] - - // Union of direct capabilities and role capabilities - const effectiveCapabilities = Array.from( - new Set([...directCapabilities, ...roleCapabilities]), - ) - - effectiveCapabilitiesMap[userId] = effectiveCapabilities - } - - return effectiveCapabilitiesMap - } -} - -// ============================================================================ -// Repository Factory -// ============================================================================ - -/** - * Create all repository instances - */ -export function createRepositories() { - return { - userRepository: new DrizzleUserRepository(), - oauthAccountRepository: new DrizzleOAuthAccountRepository(), - capabilitiesRepository: new DrizzleCapabilitiesRepository(), - } -} diff --git a/src/auth/session.server.ts b/src/auth/session.server.ts deleted file mode 100644 index 3e72e0530..000000000 --- a/src/auth/session.server.ts +++ /dev/null @@ -1,311 +0,0 @@ -/** - * Session Management Module - * - * Handles cookie-based session management with HMAC-SHA256 signing. - * This module is framework-agnostic and uses Web Crypto API. - */ - -import type { SessionCookieData, ISessionService } from './types' - -// ============================================================================ -// Base64URL Utilities -// ============================================================================ - -function base64UrlEncode(str: string): string { - if (typeof btoa !== 'undefined') { - return btoa(str).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '') - } - - const encoder = new TextEncoder() - const bytes = encoder.encode(str) - const base64 = bytesToBase64(bytes) - return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '') -} - -function base64UrlDecode(str: string): string { - const normalized = str.replace(/-/g, '+').replace(/_/g, '/') - - if (typeof atob !== 'undefined') { - return atob(normalized) - } - - const bytes = base64ToBytes(normalized) - const decoder = new TextDecoder() - return decoder.decode(bytes) -} - -function bytesToBase64(bytes: Uint8Array): string { - const chars = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - let result = '' - let i = 0 - - while (i < bytes.length) { - const a = bytes[i++] - const b = i < bytes.length ? bytes[i++] : 0 - const c = i < bytes.length ? bytes[i++] : 0 - - const bitmap = (a << 16) | (b << 8) | c - - result += chars.charAt((bitmap >> 18) & 63) - result += chars.charAt((bitmap >> 12) & 63) - result += i - 2 < bytes.length ? chars.charAt((bitmap >> 6) & 63) : '=' - result += i - 1 < bytes.length ? chars.charAt(bitmap & 63) : '=' - } - - return result -} - -function base64ToBytes(base64: string): Uint8Array { - const chars = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - const lookup = new Map() - for (let i = 0; i < chars.length; i++) { - lookup.set(chars[i], i) - } - - base64 = base64.replace(/=+$/, '') - const bytes: number[] = [] - - for (let i = 0; i < base64.length; i += 4) { - const enc1 = lookup.get(base64[i]) ?? 0 - const enc2 = lookup.get(base64[i + 1]) ?? 0 - const enc3 = lookup.get(base64[i + 2]) ?? 0 - const enc4 = lookup.get(base64[i + 3]) ?? 0 - - const bitmap = (enc1 << 18) | (enc2 << 12) | (enc3 << 6) | enc4 - - bytes.push((bitmap >> 16) & 255) - if (enc3 !== 64) bytes.push((bitmap >> 8) & 255) - if (enc4 !== 64) bytes.push(bitmap & 255) - } - - return new Uint8Array(bytes) -} - -// ============================================================================ -// Session Service Implementation -// ============================================================================ - -export class SessionService implements ISessionService { - private secret: string - private isProduction: boolean - - constructor(secret: string, isProduction: boolean = false) { - if (isProduction && secret === 'dev-secret-key-change-in-production') { - throw new Error('SESSION_SECRET must be set in production') - } - this.secret = secret - this.isProduction = isProduction - } - - /** - * Sign cookie data using HMAC-SHA256 - */ - async signCookie(data: SessionCookieData): Promise { - const payload = `${data.userId}:${data.expiresAt}:${data.version}` - const payloadBase64 = base64UrlEncode(payload) - - const encoder = new TextEncoder() - const keyData = encoder.encode(this.secret) - const messageData = encoder.encode(payloadBase64) - - const key = await crypto.subtle.importKey( - 'raw', - keyData, - { name: 'HMAC', hash: 'SHA-256' }, - false, - ['sign'], - ) - - const signature = await crypto.subtle.sign('HMAC', key, messageData) - const signatureArray = new Uint8Array(signature) - - let signatureStr = '' - for (let i = 0; i < signatureArray.length; i++) { - signatureStr += String.fromCharCode(signatureArray[i]) - } - const signatureBase64 = base64UrlEncode(signatureStr) - - return `${payloadBase64}.${signatureBase64}` - } - - /** - * Verify and parse signed cookie - */ - async verifyCookie(signedCookie: string): Promise { - try { - const [payloadBase64, signatureBase64] = signedCookie.split('.') - - if (!payloadBase64 || !signatureBase64) { - return null - } - - const encoder = new TextEncoder() - const keyData = encoder.encode(this.secret) - const messageData = encoder.encode(payloadBase64) - - const key = await crypto.subtle.importKey( - 'raw', - keyData, - { name: 'HMAC', hash: 'SHA-256' }, - false, - ['verify'], - ) - - const signatureStr = base64UrlDecode(signatureBase64) - const signature = Uint8Array.from(signatureStr, (c) => c.charCodeAt(0)) - - const isValid = await crypto.subtle.verify( - 'HMAC', - key, - signature, - messageData, - ) - - if (!isValid) { - return null - } - - const payload = base64UrlDecode(payloadBase64) - const [userId, expiresAtStr, versionStr] = payload.split(':') - - if (!userId || !expiresAtStr || !versionStr) { - return null - } - - const expiresAt = parseInt(expiresAtStr, 10) - const version = parseInt(versionStr, 10) - - // Check expiration - if (Date.now() > expiresAt) { - return null - } - - return { - userId, - expiresAt, - version, - } - } catch (error) { - console.error( - '[SessionService] Error verifying cookie:', - error instanceof Error ? error.message : 'Unknown error', - ) - return null - } - } - - /** - * Read session cookie from request - */ - getSessionCookie(request: Request): string | null { - const cookies = request.headers.get('cookie') || '' - const sessionCookie = cookies - .split(';') - .find((c) => c.trim().startsWith('session_token=')) - - if (!sessionCookie) { - return null - } - - const tokenValue = sessionCookie.split('=').slice(1).join('=').trim() - const sessionToken = decodeURIComponent(tokenValue) - return sessionToken || null - } - - /** - * Create session cookie header value - */ - createSessionCookieHeader(signedCookie: string, maxAge: number): string { - return `session_token=${encodeURIComponent(signedCookie)}; HttpOnly; Path=/; Max-Age=${maxAge}; SameSite=Lax${this.isProduction ? '; Secure' : ''}` - } - - /** - * Create clear session cookie header value - */ - createClearSessionCookieHeader(): string { - return `session_token=; HttpOnly; Path=/; Max-Age=0; SameSite=Lax${this.isProduction ? '; Secure' : ''}` - } -} - -// ============================================================================ -// OAuth State Cookie Utilities -// ============================================================================ - -export function generateOAuthState(): string { - const stateBytes = new Uint8Array(16) - crypto.getRandomValues(stateBytes) - const base64 = btoa(String.fromCharCode(...stateBytes)) - return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '') -} - -export function createOAuthStateCookie( - state: string, - isProduction: boolean, -): string { - // Use SameSite=Lax to allow the cookie to be sent on OAuth redirects back from providers - // Strict would block the cookie since the redirect comes from an external domain (GitHub/Google) - return `oauth_state=${encodeURIComponent(state)}; HttpOnly; Path=/; Max-Age=${10 * 60}; SameSite=Lax${isProduction ? '; Secure' : ''}` -} - -export function clearOAuthStateCookie(isProduction: boolean): string { - return `oauth_state=; HttpOnly; Path=/; Max-Age=0; SameSite=Lax${isProduction ? '; Secure' : ''}` -} - -export function getOAuthStateCookie(request: Request): string | null { - const cookies = request.headers.get('cookie') || '' - const stateCookie = cookies - .split(';') - .find((c) => c.trim().startsWith('oauth_state=')) - - if (!stateCookie) { - return null - } - - return decodeURIComponent(stateCookie.split('=').slice(1).join('=').trim()) -} - -export function createOAuthPopupCookie(isProduction: boolean): string { - return `oauth_popup=1; HttpOnly; Path=/; Max-Age=${10 * 60}; SameSite=Lax${isProduction ? '; Secure' : ''}` -} - -export function clearOAuthPopupCookie(isProduction: boolean): string { - return `oauth_popup=; HttpOnly; Path=/; Max-Age=0; SameSite=Lax${isProduction ? '; Secure' : ''}` -} - -export function isOAuthPopupMode(request: Request): boolean { - const cookies = request.headers.get('cookie') || '' - return cookies.split(';').some((c) => c.trim().startsWith('oauth_popup=1')) -} - -export function createOAuthReturnToCookie( - returnTo: string, - isProduction: boolean, -): string { - return `oauth_return_to=${encodeURIComponent(returnTo)}; HttpOnly; Path=/; Max-Age=${10 * 60}; SameSite=Lax${isProduction ? '; Secure' : ''}` -} - -export function clearOAuthReturnToCookie(isProduction: boolean): string { - return `oauth_return_to=; HttpOnly; Path=/; Max-Age=0; SameSite=Lax${isProduction ? '; Secure' : ''}` -} - -export function getOAuthReturnTo(request: Request): string | null { - const cookies = request.headers.get('cookie') || '' - const returnToCookie = cookies - .split(';') - .find((c) => c.trim().startsWith('oauth_return_to=')) - - if (!returnToCookie) { - return null - } - - return decodeURIComponent(returnToCookie.split('=').slice(1).join('=').trim()) -} - -// ============================================================================ -// Session Constants -// ============================================================================ - -export const SESSION_DURATION_MS = 30 * 24 * 60 * 60 * 1000 // 30 days -export const SESSION_MAX_AGE_SECONDS = 30 * 24 * 60 * 60 // 30 days diff --git a/src/auth/types.ts b/src/auth/types.ts deleted file mode 100644 index 0d4d32e36..000000000 --- a/src/auth/types.ts +++ /dev/null @@ -1,229 +0,0 @@ -/** - * Auth Module Types - * - * This file defines the core types and interfaces for the authentication module. - * These types are designed to be framework-agnostic and can be used by both - * server and client code. - */ - -// Re-export shared types from db/types.ts (single source of truth) -export type { Capability, OAuthProvider } from '~/db/types' -export { CAPABILITIES as VALID_CAPABILITIES } from '~/db/types' - -import type { Capability, OAuthProvider } from '~/db/types' - -export interface OAuthProfile { - id: string - email: string - name?: string - image?: string -} - -export interface OAuthResult { - userId: string - isNewUser: boolean -} - -// ============================================================================ -// Session Types -// ============================================================================ - -export interface SessionCookieData { - userId: string - expiresAt: number // Unix timestamp in milliseconds - version: number // sessionVersion from users table for revocation -} - -// ============================================================================ -// User Types -// ============================================================================ - -/** - * Authenticated user data returned from session validation - */ -export interface AuthUser { - userId: string - email: string - name: string | null - image: string | null - oauthImage: string | null - displayUsername: string | null - capabilities: Capability[] - adsDisabled: boolean | null - interestedInHidingAds: boolean | null - lastUsedFramework: string | null -} - -/** - * Database user record (used by data access layer) - */ -export interface DbUser { - id: string - email: string - name: string | null - image: string | null - oauthImage: string | null - displayUsername: string | null - capabilities: Capability[] - adsDisabled: boolean | null - interestedInHidingAds: boolean | null - lastUsedFramework: string | null - sessionVersion: number - createdAt: Date - updatedAt: Date -} - -// ============================================================================ -// Data Access Interfaces (for Inversion of Control) -// ============================================================================ - -/** - * User repository interface for database operations - * Implement this interface to inject database access into the auth module - */ -export interface IUserRepository { - findById(userId: string): Promise - findByEmail(email: string): Promise - create(data: { - email: string - name?: string - image?: string - oauthImage?: string - displayUsername?: string - capabilities?: Capability[] - }): Promise - update( - userId: string, - data: Partial<{ - email: string - name: string - image: string | null - oauthImage: string - displayUsername: string - capabilities: Capability[] - adsDisabled: boolean - interestedInHidingAds: boolean - lastUsedFramework: string - sessionVersion: number - updatedAt: Date - }>, - ): Promise - incrementSessionVersion(userId: string): Promise -} - -/** - * OAuth account repository interface - */ -export interface IOAuthAccountRepository { - findByProviderAndAccountId( - provider: OAuthProvider, - providerAccountId: string, - ): Promise<{ - userId: string - accessToken: string | null - tokenScope: string | null - } | null> - findByUserId( - userId: string, - provider: OAuthProvider, - ): Promise<{ accessToken: string | null; tokenScope: string | null } | null> - create(data: { - userId: string - provider: OAuthProvider - providerAccountId: string - email: string - accessToken?: string - tokenScope?: string - }): Promise - updateToken( - userId: string, - provider: OAuthProvider, - accessToken: string, - tokenScope: string, - ): Promise -} - -/** - * Capabilities repository interface - */ -export interface ICapabilitiesRepository { - getEffectiveCapabilities(userId: string): Promise - getBulkEffectiveCapabilities( - userIds: string[], - ): Promise> -} - -// ============================================================================ -// Service Interfaces -// ============================================================================ - -/** - * Session service interface for cookie-based session management - */ -export interface ISessionService { - signCookie(data: SessionCookieData): Promise - verifyCookie(signedCookie: string): Promise - getSessionCookie(request: Request): string | null - createSessionCookieHeader(signedCookie: string, maxAge: number): string - createClearSessionCookieHeader(): string -} - -/** - * Auth service interface for user authentication - */ -export interface IAuthService { - getCurrentUser(request: Request): Promise - validateSession( - sessionData: SessionCookieData, - ): Promise<{ user: DbUser; capabilities: Capability[] } | null> -} - -/** - * OAuth service interface for OAuth operations - */ -export interface IOAuthService { - upsertOAuthAccount( - provider: OAuthProvider, - profile: OAuthProfile, - tokenInfo?: { accessToken: string; scope: string }, - ): Promise -} - -// ============================================================================ -// Auth Context (Dependency Injection Container) -// ============================================================================ - -/** - * Auth context contains all dependencies required by the auth module - * Use this to inject implementations at runtime - */ -export interface AuthContext { - userRepository: IUserRepository - oauthAccountRepository: IOAuthAccountRepository - capabilitiesRepository: ICapabilitiesRepository - sessionSecret: string - isProduction: boolean -} - -// ============================================================================ -// Error Types -// ============================================================================ - -export class AuthError extends Error { - constructor( - message: string, - public code: AuthErrorCode, - ) { - super(message) - this.name = 'AuthError' - } -} - -export type AuthErrorCode = - | 'NOT_AUTHENTICATED' - | 'MISSING_CAPABILITY' - | 'INVALID_SESSION' - | 'SESSION_EXPIRED' - | 'SESSION_REVOKED' - | 'USER_NOT_FOUND' - | 'OAUTH_ERROR' diff --git a/src/blog/announcing-tanstack-form-v1.md b/src/blog/announcing-tanstack-form-v1.md index 9e89d163d..e55750ffa 100644 --- a/src/blog/announcing-tanstack-form-v1.md +++ b/src/blog/announcing-tanstack-form-v1.md @@ -75,8 +75,8 @@ We even support type-checking what errors are returned in ``: children={(field) => ( <> - // TypeScript will correctly tell you that `errorMap.onChange` // is an - object, not a string + // TypeScript will correctly tell you that `errorMap.onChange` // is an object, + not a string

{field.state.meta.errorMap.onChange}

)} @@ -154,7 +154,7 @@ const serverValidate = createServerValidate({ export const getFormDataFromServer = createServerFn({ method: 'GET' }).handler( async () => { return getFormData() - }, + } ) ``` diff --git a/src/blog/announcing-tanstack-start-v1.md b/src/blog/announcing-tanstack-start-v1.md index a9adb7d9c..66f4973df 100644 --- a/src/blog/announcing-tanstack-start-v1.md +++ b/src/blog/announcing-tanstack-start-v1.md @@ -37,7 +37,7 @@ That page will stay current with the exact commands for the RC and the final 1.0 ## Path to 1.0 stable -We plan to cut 1.0 shortly after collecting RC feedback. Expect a few small RC iterations; any breaking changes will be clearly documented. As we approach stable, only light polish remains. No major API shifts. +We plan to cut 1.0 shortly after collecting RC feedback. Expect a few small RC iterations; any breaking changes will be clearly documented. As we approach stable, only light polish remains—no major API shifts. > **Note:** React Server Components support is in active development and will land as a non-breaking v1.x addition. @@ -67,6 +67,6 @@ Their collaboration is a pivotal force driving the open web forward. Explore the ## Your feedback counts -This is the moment when your feedback matters most. Try the RC in a new or existing project and tell us what you think via the docs feedback links. If you hit an issue, the migration notes and examples in the docs will help. And we’ll be quick to respond. +This is the moment when your feedback matters most. Try the RC in a new or existing project and tell us what you think via the docs feedback links. If you hit an issue, the migration notes and examples in the docs will help—and we’ll be quick to respond. Thanks for building with us. Let’s ship 1.0, together. diff --git a/src/blog/directives-and-the-platform-boundary.md b/src/blog/directives-and-the-platform-boundary.md deleted file mode 100644 index 0170be024..000000000 --- a/src/blog/directives-and-the-platform-boundary.md +++ /dev/null @@ -1,297 +0,0 @@ ---- -title: Directives and the Platform Boundary -published: 2025-10-24 -authors: - - Tanner Linsley -description: A constructive look at framework directives, portability, and keeping a clear boundary between platform and library spaces. ---- - -![Header Image](/blog-assets/directives-and-the-platform-boundary/header.png) - -## A Quiet Trend in the JavaScript Ecosystem - -For years, JavaScript has had exactly one meaningful directive, `"use strict"`. It is standardized, enforced by runtimes, and behaves the same in every environment. It represents a clear contract between the language, the engines, and developers. - -But now we are watching a new trend emerge. Frameworks are inventing their own top level directives, `use client`, `use server`, `use cache`, `use workflow`, and more are appearing across the ecosystem. They look like language features. They sit where real language features sit. They affect how code is interpreted, bundled, and executed. - -There is an important distinction: these are not standardized JavaScript features. Runtimes don't understand them, there is no governing specification, and each framework is free to define its own meaning, rules, and edge cases. - -This can feel ergonomic today, but it also increases confusion, complicates debugging, and imposes costs on tooling and portability, patterns we’ve seen before. - ---- - -### When directives look like the platform, developers treat them like the platform - -A directive at the top of a file looks authoritative. It gives the impression of being a language level truth, not a framework hint. That creates a perception problem: - -- Developers assume directives are official -- Ecosystems begin to treat them as a shared API surface -- New learners struggle to distinguish JavaScript from framework magic -- The boundary between platform and vendor blurs -- Debuggability suffers and tooling must special‑case behaviors - -We’ve already seen confusion. Many developers now believe `use client` and `use server` are just how modern JavaScript works, unaware that they only exist inside specific build pipelines and server component semantics. That misunderstanding signals a deeper issue. - ---- - -### Credit where it's due: `use server` and `use client` - -Some directives exist because multiple tools needed a single, simple coordination point. In practice, `use server` and `use client` are pragmatic shims that tell bundlers and runtimes where code is allowed to execute in an RSC world. They have seen relatively broad support across bundlers precisely because the scope is narrow: execution location. - -That said, even these show the limits of directives once real-world needs appear. At scale, you often need parameters and policies that matter deeply to correctness and security: HTTP method, headers, middleware, auth context, tracing, caching behaviors, and more. Directives have no natural place to carry those options, which means they are frequently ignored, bolted on elsewhere, or re-encoded as new directive variants. - -### Where directives start to strain: options and directive-adjacent APIs - -When a directive immediately, or soon after creation, needs options or spawns siblings (e.g., `'use cache:remote'`) and helper calls like `cacheLife(...)`, that’s often a signal the feature wants to be an API, not a string at the top of a file. If you know you need a function anyway, just use a function for all of it. - -Examples: - -```js -'use cache:remote' -const fn = () => 'value' -``` - -```js -// explicit API with provenance and options -import { cache } from 'next/cache' -export const fn = cache(() => 'value', { - strategy: 'remote', - ttl: 60, -}) -``` - -And for server behavior where details matter: - -```js -import { server } from '@acme/runtime' - -export const action = server( - async (req) => { - return new Response('ok') - }, - { - method: 'POST', - headers: { 'x-foo': 'bar' }, - middleware: [requireAuth()], - }, -) -``` - -APIs carry provenance (imports), versioning (packages), composition (functions), and testability. Directives typically don’t, and trying to encode options into them can quickly become a design smell. - ---- - -### Shared syntax without a shared spec can be a fragile foundation - -Once multiple frameworks start adopting directives, we end up in the worst possible state: - -| Category | Shared Syntax | Shared Contract | Result | -| -------------------- | ------------- | --------------- | ---------------------- | -| ECMAScript | ✅ | ✅ | Stable and universal | -| Framework APIs | ❌ | ❌ | Isolated and fine | -| Framework Directives | ✅ | ❌ | Confusing and unstable | - -A shared surface area without a shared definition creates: - -- Interpretation drift, each framework defines its own semantics -- Portability issues, code that looks universal but is not -- Tooling burden, bundlers, linters, and IDEs must guess or chase behavior -- Platform friction, standards bodies get boxed in by ecosystem expectations - -An example of where we've seen these struggles before is with decorators. TypeScript normalized a non standard semantics, the community built on top of it, then TC39 went in a different direction. This was and continues to be a painful migration for many. - ---- - -### “Isn’t this just a Babel plugin/macro with different syntax?” - -Functionally, yes. Both directives and custom transforms can change behavior at compile time. The issue isn’t capability; it’s surface and optics. - -- Directives look like the platform. No import, no owner, no explicit source. They signal “this is JavaScript.” -- APIs/macros point to an owner. Imports provide provenance, versioning, and discoverability. - -At best, a directive is equivalent to calling a global, importless function like `window.useCache()` at the top of your file. That’s exactly why it’s risky: it hides the provider and moves framework semantics into what looks like language. - -Examples: - -```js -'use cache' -const fn = () => 'value' -``` - -```js -// explicit API (imported, ownable, discoverable) -import { createServerFn } from '@acme/runtime' -export const fn = createServerFn(() => 'value') -``` - -```js -// global magic (importless, hidden provider) -window.useCache() -const fn = () => 'value' -``` - -Why this matters: - -- Ownership and provenance: imports tell you who provides the behavior; directives do not. -- Tooling ergonomics: APIs live in package space; directives require ecosystem-wide special-casing. -- Portability and migration: replacing an imported API is straightforward; unwinding directive semantics across files is costly and ambiguous. -- Education and expectations: directives blur the platform boundary; APIs make the boundary explicit. - -So while a custom Babel plugin or macro can implement the same underlying feature, the import-based API keeps it clearly in framework space. Directives move that same behavior into what looks like language space, which is the core concern of this post. - -### “Does namespacing fix it?” (e.g., "use next.js cache") - -Namespacing helps human discoverability, but it doesn’t address the core problems: - -- It still looks like the platform. A top-level string literal implies language, not library. -- It still lacks provenance and versioning at the module level. Imports encode both; strings do not. -- It still requires special-casing across the toolchain (bundlers, linters, IDEs), rather than leveraging normal import resolution. -- It still encourages pseudo-standardization of syntax without a spec, just with vendor prefixes. -- It still increases migration cost compared to swapping an imported API. - -Examples: - -```js -'use next.js cache' -const fn = () => 'value' -``` - -```js -// explicit, ownable API with provenance and versioning -import { cache } from 'next/cache' -export const fn = cache(() => 'value') -``` - -If the goal is provenance, imports already solve that cleanly and work with today’s ecosystem. If the goal is a shared cross-framework primitive, that needs a real spec, not vendor strings that look like syntax. - ---- - -### Directives can drive competitive dynamics - -Once directives become a competitive surface, the incentives shift: - -1. One vendor ships a new directive -2. It becomes a visible feature -3. Developers expect it everywhere -4. Other frameworks feel pressure to adopt it -5. The syntax spreads without a spec - -This is how you get: - -```tsx -'use server' -'use client' -'use cache' -'use cache:remote' -'use workflow' -``` - -Even durable tasks, caching strategies, and execution locations are now being encoded as directives. These are runtime semantics, not syntax semantics. Encoding them as directives sets direction outside the standards process and merits caution. - ---- - -### Considering APIs instead of directives for option‑rich features - -Durable execution is a good example (e.g., `'use workflow'`, `'use step'`), but the point is general: directives can collapse behavior to a boolean, while many features benefit from options and room to evolve. Compilers and transforms can support either surface; this is about choosing the right one for longevity and clarity. - -```js -'use workflow' -'use step' -``` - -One option: an explicit API with provenance and options: - -```js -import { workflow, step } from '@workflows/workflow' - -export const sendEmail = workflow( - async (input) => { - /* ... */ - }, - { retries: 3, timeout: '1m' }, -) - -export const handle = step( - 'fetchUser', - async () => { - /* ... */ - }, - { cache: 60 }, -) -``` - -Function forms can be just as AST/transform‑friendly as directives, and they carry provenance (imports) and type‑safety. - -Another option is to inject a global once and type it: - -```ts -// bootstrap once -globalThis.workflow = createWorkflow() -// global types (e.g., global.d.ts) -declare global { - var workflow: typeof import('@workflows/workflow').workflow -} -``` - -Usage stays API‑shaped, without directives: - -```ts -export const task = workflow( - async () => { - /* ... */ - }, - { retries: 5 }, -) -``` - -Compilers that extend ergonomics are great. Just look at JSX is a useful precedent! We just need to do it carefully and responsibly: extend via APIs with clear provenance and types, not top‑level strings that look like the language. These are options, not prescriptions. - ---- - -### Subtle forms of lock‑in can emerge - -Even when there is no bad intent, directives create lock in by design: - -- Mental lock in, developers form muscle memory around a vendor's directive semantics -- Tooling lock in, IDEs, bundlers, and compilers must target a specific runtime -- Code lock in, directives sit at the syntax level, making them costly to remove or migrate - -Directives may not look proprietary, but they can behave more like proprietary features than an API would, because they reshape the grammar of the ecosystem. - ---- - -### If we want shared primitives, we should collaborate on specs and APIs - -There absolutely are real problems to solve: - -- Server execution boundaries -- Streaming and async workflows -- Distributed runtime primitives -- Durable tasks -- Caching semantics - -But those are problems for **APIs, capabilities, and future standards**, not for ungoverned pseudo syntax pushed through bundlers. - -If multiple frameworks truly want shared primitives, a responsible path is: - -- Collaborate on a cross framework spec -- Propose primitives to TC39 when appropriate -- Keep non standard features clearly scoped to API space, not language space - -Directives should be rare, stable, standardized and especially used judiciously rather than proliferating across vendors. - ---- - -### Why this differs from the JSX/virtual DOM moment - -It’s tempting to compare criticism of directives to the early skepticism around React’s JSX or the virtual DOM. The failure modes are different. JSX and the VDOM did not masquerade as language features; they came with explicit imports, provenance, and tooling boundaries. Directives, by contrast, live at the top-level of files and look like the platform, which creates ecosystem expectations and tooling burdens without a shared spec. - ---- - -### The bottom line - -Framework directives might feel like DX magic today, but the current trend risks a more fragmented future consisting of dialects defined not by standards, but by tools. - -We can aim for clearer boundaries. - -If frameworks want to innovate, they should, but they should also clearly distinguish **framework behavior** from **platform semantics**, instead of blurring that line for short term adoption. Clearer boundaries help the ecosystem. diff --git a/src/blog/from-docs-to-agents.md b/src/blog/from-docs-to-agents.md deleted file mode 100644 index cee148a99..000000000 --- a/src/blog/from-docs-to-agents.md +++ /dev/null @@ -1,152 +0,0 @@ ---- -title: 'Introducing TanStack Intent: Ship Agent Skills with your npm Packages' -published: 2026-03-04 -authors: - - Sarah Gerrard - - Kyle Mathews ---- - -![From Docs to Agents](/blog-assets/from-docs-to-agents/header.png) - -Your docs are good. Your types are solid. Your agent still gets it wrong. - -Not because it's dumb — because nothing connects what you know about your tool to what agents know. Docs target humans who browse. Types check individual API calls but can't encode intent. Training data snapshots the ecosystem as it _was_, mixing versions with no way to tell which applies. The gap isn't content. It's lifecycle. - -## The copy-paste era - -The ecosystem already moves toward agent-readable knowledge. Cursor rules, CLAUDE.md files, skills directories — everyone agrees agents need more than docs and types. But delivery hasn't caught up. - -Today, if you want your agent to understand TanStack Router, you hunt for a community-maintained rules file on GitHub. Maybe it's in `awesome-cursorrules`. Maybe someone linked it in Discord. You copy it into `.cursorrules` or `CLAUDE.md`. Then you repeat for TanStack Query. And TanStack Table. Each from a different place, author, and point in time. - -Multiply that across every tool in your stack. You're managing copy-pasted knowledge files with no versioning, no update path, and no staleness signal. Did TanStack Router ship a breaking change last week? Your rules file doesn't know. Is that Query skill written for v4 or v5? Hope you checked. - -Finding skills is manual. Installing them is manual. Keeping them current is manual. When they drift — and they always drift — you discover it only when your agent produces subtly wrong code. - -Library maintainers already have the knowledge agents need — in docs, migration guides, "common mistakes" GitHub discussions, Discord answers. But none of it reaches agents through a channel the maintainer controls. The knowledge exists. The delivery mechanism doesn't. - -![The status quo: scattered rules files from different repos, authors, and versions, all manually copy-pasted into one project](/blog-assets/from-docs-to-agents/diagram-status-quo.svg) - -## Introducing `@tanstack/intent` - -`@tanstack/intent` is a CLI for library maintainers to generate, validate, and ship [Agent Skills](https://agentskills.io) alongside their npm packages. The [Agent Skills spec](https://agentskills.io) is an open standard already adopted by VS Code, GitHub Copilot, OpenAI Codex, Cursor, Claude Code, Goose, Amp, and others. - -**Skills ship inside your npm package.** They encode how your tool works, which patterns fit which goals, and what to avoid. Skills travel with the tool via `npm update` — not the model's training cutoff, not community-maintained rules files, not prompt snippets in READMEs. Versioned knowledge the maintainer owns, updated when the package updates. - -For popular, stable patterns — standard React hooks, Express middleware, Tailwind classes — agents do well. Training data is saturated with correct usage. But at the frontier — new tools, major version transitions, novel compositions across packages — agents hallucinate, confuse versions, and miss critical implications. The frontier is bigger than it sounds: every new library, every breaking change, every composition across tools that nobody has written about. And once a breaking change ships, models don't "catch up." They develop a permanent split-brain — training data contains _both_ versions forever with no way to disambiguate. Skills bypass this. They're pinned to the installed version. - -![Model training data mixes versions permanently vs. skills pinned to your installed version](/blog-assets/from-docs-to-agents/diagram-split-brain.svg) - -A skill is a short, versioned document that tells agents how to use a specific capability of your library — correct patterns, common mistakes, and when to apply them. Each skill declares which docs it was derived from: - -``` ---- -name: tanstack-router-search-params -description: Type-safe search param patterns for TanStack Router. Use when working with search params, query params, or validateSearch. -metadata: - sources: - - docs/framework/react/guide/search-params.md ---- -``` - -Inside the skill, you write what the agent needs to get right — including what NOT to do: - -```markdown -## Search Params - -Use `validateSearch` to define type-safe search params on a route: - -const Route = createFileRoute('/products')({ -validateSearch: z.object({ -page: z.number().default(1), -filter: z.string().optional(), -}), -}) - -## Common Mistakes - -❌ Don't access search params via `window.location` — use -`useSearch()` which is fully type-safe. - -❌ Don't parse search params manually. `validateSearch` handles -parsing, validation, and defaults. -``` - -That `metadata.sources` field is what keeps skills current. When those docs change, the CLI flags the skill for review. One source of truth, one derived artifact that stays in sync. - -## Generating and validating skills - -You don't author skills from scratch. `@tanstack/intent scaffold` generates them from your library: - -```bash -npx @tanstack/intent scaffold -``` - -The scaffold produces drafts you review, refine, and commit. Once committed, `@tanstack/intent validate` checks that they're well-formed: - -```bash -npx @tanstack/intent validate -``` - -`@tanstack/intent setup-github-actions` copies CI workflow templates into your repo so validation runs on every push: - -```bash -npx @tanstack/intent setup-github-actions -``` - -## The dependency graph does the discovery - -That's the maintainer side. For developers, the experience is simpler. - -When a developer runs `@tanstack/intent install`, the CLI discovers every intent-enabled package and wires skills into the agent configuration — CLAUDE.md, .cursorrules, whatever the tooling expects. - -```bash -npx @tanstack/intent install -``` - -![intent install discovers intent-enabled packages in node_modules and wires skills into agent config](/blog-assets/from-docs-to-agents/diagram-discovery.svg) - -No per-library setup. No hunting for rules files. Install the package, run `@tanstack/intent install`, and the agent understands the tool. Update the package, and skills update too. Knowledge travels the same channel as code. - -`@tanstack/intent list` shows what's available: - -```bash -npx @tanstack/intent list # See what's intent-enabled in your deps -npx @tanstack/intent list --json # Machine-readable output -``` - -For library maintainers, `@tanstack/intent meta` surfaces meta-skills — higher-level guidance on authoring and maintaining skills: - -```bash -npx @tanstack/intent meta -``` - -## Keeping it current - -The real risk with any derived artifact is staleness. You update your docs, ship a new API, and skills silently drift. `@tanstack/intent` treats staleness as a first-class problem. - -`@tanstack/intent stale` checks for version drift, flagging skills that have fallen behind their sources: - -```bash -npx @tanstack/intent stale # Human-readable report -npx @tanstack/intent stale --json # Machine-readable for CI -``` - -Run it in CI and you get a failing check when sources change. Skills become part of your release checklist — not something you remember to update, but something your pipeline catches. - -![The intent lifecycle: docs to skills to npm to agent config, with staleness checks and feedback loops](/blog-assets/from-docs-to-agents/diagram-lifecycle.svg) - -The feedback loop runs both directions. `@tanstack/intent feedback` lets users submit structured reports when a skill produces wrong output — which skill, which version, what broke. - -```bash -npx @tanstack/intent feedback -``` - -That context flows back to you as a maintainer, and the fix ships to everyone on the next `npm update`. Every support interaction produces an artifact that prevents the same class of problem for all future users — not just the one who reported it. This is what makes skills compound: each fix makes the skill better, and each `npm update` distributes the improvement. - -Skills that keep needing the same workaround signal something deeper. Sometimes the fix is a better skill. Sometimes it's a better API — the tool should absorb the lesson directly. A skill that persists forever means the tool has a design gap. A skill that disappears because the tool fixed the underlying problem is the system working exactly as intended. - -## Try it out - -We've started rolling out skills in [TanStack DB](https://github.com/TanStack/db/pull/1330) with other TanStack libraries following. If you maintain a library, tell your coding agent to run `npx @tanstack/intent scaffold` and let us know how it goes. We want feedback on the authoring workflow, the skill format, and what's missing. File issues on [GitHub](https://github.com/TanStack/intent) or find us on [Discord](https://tlinz.com/discord). - -The lifecycle: write your docs, generate skills, ship them with your package, validate and keep them current, learn from usage, improve your tool. Repeat. diff --git a/src/blog/generation-hooks.md b/src/blog/generation-hooks.md deleted file mode 100644 index 243f6cc76..000000000 --- a/src/blog/generation-hooks.md +++ /dev/null @@ -1,263 +0,0 @@ ---- -title: 'Generation Hooks: Type-Safe AI Beyond Chat' -published: 2026-03-11 -authors: - - Alem Tuzlak ---- - -![Generation Hooks](/blog-assets/generation-hooks/header.png) - -Chat is just the beginning. Your AI-powered app probably needs to generate images, convert text to speech, transcribe audio, summarize documents, or create videos. Until now, wiring up each of these activities meant writing custom fetch logic, managing loading states, handling errors, and juggling streaming protocols for every single one. - -Not anymore. - -## One Pattern to Rule Them All - -TanStack AI now ships **generation hooks**: a unified set of React hooks (with Solid, Vue, and Svelte support) that give you first-class primitives for every non-chat AI activity: - -- `useGenerateImage()` for image generation -- `useGenerateSpeech()` for text-to-speech -- `useTranscription()` for audio transcription -- `useSummarize()` for text summarization -- `useGenerateVideo()` for video generation - -Every hook follows the exact same API surface. Learn one, and you know them all: - -```tsx -const { generate, result, isLoading, error, stop, reset } = useGenerateImage({ - connection: fetchServerSentEvents('/api/generate/image'), -}) - -// That's it. Call generate() and your UI reacts. -generate({ prompt: 'A neon-lit cyberpunk cityscape at sunset' }) -``` - -The `result` is fully typed. The `error` is handled. Loading state is tracked. Abort is built in. No boilerplate, no `useEffect` spaghetti, no manual state management. - -## Three Ways to Connect - -Every generation hook supports three transport modes, so you can pick the one that fits your architecture: - -### 1. Streaming (Connection Adapter) - -The classic SSE approach. Your server wraps the generation in `toServerSentEventsResponse()`, and the client consumes it through `fetchServerSentEvents()`: - -```tsx -// Client -const { generate, result, isLoading } = useGenerateImage({ - connection: fetchServerSentEvents('/api/generate/image'), -}) -``` - -```typescript -// Server (API route) -const stream = generateImage({ - adapter: openaiImage('gpt-image-1'), - prompt: data.prompt, - stream: true, -}) -return toServerSentEventsResponse(stream) -``` - -This is the most flexible option. It works with any server framework, any hosting provider, any deployment model. - -### 2. Direct (Fetcher) - -Sometimes you don't need streaming. You just want to call a function and get a result. The fetcher mode does exactly that: - -```tsx -const { generate, result, isLoading } = useGenerateImage({ - fetcher: (input) => generateImageFn({ data: input }), -}) -``` - -The server function runs, returns JSON, and the hook updates your UI. Simple, synchronous from the user's perspective, and fully type-safe. - -### 3. Server Function Streaming (NEW) - -This is the one we're most excited about. It combines the **type safety of server functions** with the **real-time feedback of streaming**, and it works beautifully with TanStack Start. - -Here is the problem we solved: the `connection` approach uses a generic `Record` for its data payload. Great for flexibility, but your input loses all type information. The `fetcher` approach is fully typed, but it waits for the entire result before updating the UI. - -Server Function Streaming gives you both. Your fetcher returns a `Response` object (an SSE stream), and the client automatically detects it and parses the stream in real-time: - -```tsx -// Client - looks identical to the direct fetcher -const { generate, result, isLoading } = useGenerateImage({ - fetcher: (input) => generateImageStreamFn({ data: input }), -}) -``` - -```typescript -// Server - just add stream: true and wrap with toServerSentEventsResponse -export const generateImageStreamFn = createServerFn({ method: 'POST' }) - .inputValidator( - z.object({ - prompt: z.string(), - numberOfImages: z.number().optional(), - size: z.string().optional(), - }), - ) - .handler(({ data }) => - toServerSentEventsResponse( - generateImage({ - adapter: openaiImage('gpt-image-1'), - prompt: data.prompt, - stream: true, - }), - ), - ) -``` - -From the client's perspective, the API is identical to a direct fetcher call. But behind the scenes, TanStack AI detects the `Response` object, reads the SSE stream, and feeds chunks through the same event pipeline used by the connection adapter. Progress events fire in real-time. Errors are reported as they happen. And your `input` parameter stays fully typed throughout. - -The detection is simple and zero-config: if your fetcher returns a `Response`, it's treated as an SSE stream. If it returns anything else, it's treated as a direct result. No flags, no configuration, no separate hook. - -## How It Works Under the Hood - -When a fetcher returns a `Response`, the `GenerationClient` runs a simple check: - -```typescript -const result = await this.fetcher(input, { signal }) - -if (result instanceof Response) { - // Parse as SSE stream - same pipeline as ConnectionAdapter - await this.processStream(parseSSEResponse(result, signal)) -} else { - // Use as direct result - this.setResult(result) -} -``` - -The `parseSSEResponse` utility reads the response body as a stream of newline-delimited SSE events, parses each `data:` line into a `StreamChunk`, and yields them into the same `processStream` method that the ConnectionAdapter uses. Same event types, same state transitions, same callbacks. - -This means every feature that works with streaming connections also works with server function streaming: progress reporting, chunk callbacks, abort signals, error handling. All of it. - -## Result Transforms - -Sometimes the raw result from the server isn't what you want to store in state. Every generation hook accepts an `onResult` callback that can transform the result before it's stored: - -```tsx -const { result } = useGenerateSpeech({ - fetcher: (input) => generateSpeechStreamFn({ data: input }), - onResult: (raw) => { - // Convert base64 audio to a blob URL for playback - const bytes = Uint8Array.from(atob(raw.audio), (c) => c.charCodeAt(0)) - const blob = new Blob([bytes], { type: raw.contentType ?? 'audio/mpeg' }) - return { - audioUrl: URL.createObjectURL(blob), - format: raw.format, - duration: raw.duration, - } - }, -}) - -// result is typed as { audioUrl: string; format?: string; duration?: number } | null -``` - -TypeScript infers the output type from your transform function. No explicit generics needed. - -## Video Generation: A First-Class Citizen - -Video generation is a different beast. Unlike image or speech generation, video providers like OpenAI's Sora use a jobs-based architecture: you submit a prompt, receive a job ID, then poll for status until the video is ready. This can take minutes. - -`useGenerateVideo()` handles all of this transparently: - -```tsx -const { generate, result, jobId, videoStatus, isLoading } = useGenerateVideo({ - fetcher: (input) => generateVideoStreamFn({ data: input }), -}) - -// In your JSX: -{ - videoStatus && ( -
-

Status: {videoStatus.status}

- {videoStatus.progress != null && ( -
- )} -
- ) -} -``` - -The hook exposes `jobId` and `videoStatus` as reactive state that updates in real-time as the server streams polling updates. Your users see "pending", "processing", progress percentages, and finally the completed video URL, all without you writing a single polling loop. - -## Every Activity, Same API - -Here's what makes this design special: the API is identical across all five generation types. Once you've built an image generation page, building a speech generation page is a matter of swapping the hook name and adjusting the input: - -| Hook | Input | Result | -| --------------------- | ------------------------------------ | ----------------------------------------------- | -| `useGenerateImage()` | `{ prompt, numberOfImages?, size? }` | `{ images: [{ url, b64Json, revisedPrompt }] }` | -| `useGenerateSpeech()` | `{ text, voice?, format? }` | `{ audio, contentType, format, duration }` | -| `useTranscription()` | `{ audio, language? }` | `{ text, segments, language, duration }` | -| `useSummarize()` | `{ text, style?, maxLength? }` | `{ summary }` | -| `useGenerateVideo()` | `{ prompt, size?, duration? }` | `{ jobId, status, url }` | - -Same `generate()`. Same `result`. Same `isLoading`. Same `error`. Same `stop()` and `reset()`. The consistency is intentional: we want AI features to be as easy to add to your app as a form submission. - -## Getting Started - -Install the packages: - -```bash -pnpm add @tanstack/ai @tanstack/ai-react @tanstack/ai-client @tanstack/ai-openai -``` - -Create a server function that streams: - -```typescript -import { createServerFn } from '@tanstack/react-start' -import { generateImage, toServerSentEventsResponse } from '@tanstack/ai' -import { openaiImage } from '@tanstack/ai-openai' - -export const generateImageStreamFn = createServerFn({ method: 'POST' }) - .inputValidator(z.object({ prompt: z.string() })) - .handler(({ data }) => { - return toServerSentEventsResponse( - generateImage({ - adapter: openaiImage('gpt-image-1'), - prompt: data.prompt, - stream: true, - }), - ) - }) -``` - -Use it in your component: - -```tsx -import { useGenerateImage } from '@tanstack/ai-react' -import { generateImageStreamFn } from '../lib/server-fns' - -function ImageGenerator() { - const { generate, result, isLoading, error } = useGenerateImage({ - fetcher: (input) => generateImageStreamFn({ data: input }), - }) - - return ( -
- - {result?.images.map((img, i) => ( - Generated - ))} -
- ) -} -``` - -Three lines of hook setup. Type-safe input. Streaming progress. Error handling. Abort support. That's it. - -## What's Next - -Generation hooks are available now in `@tanstack/ai-client` and `@tanstack/ai-react`. Support for Solid, Vue, and Svelte is coming soon with the same API surface. - -We're also working on expanding the adapter ecosystem so you can use these hooks with providers beyond OpenAI. The generation functions are provider-agnostic by design, so swapping from OpenAI to Anthropic or a local model will be a single line change. - -Build something cool and let us know. We can't wait to see what you create. diff --git a/src/blog/netlify-partnership.md b/src/blog/netlify-partnership.md index ae8f94b19..f3740959d 100644 --- a/src/blog/netlify-partnership.md +++ b/src/blog/netlify-partnership.md @@ -18,7 +18,7 @@ Netlify has earned its reputation as the ultimate deployment platform for modern ## Why Netlify? -Netlify is more than just a deployment provider. They’ve worked closely with us to ensure that deploying TanStack Start applications is not just fast, but optimized for the best possible developer experience. Whether you’re building interactive UIs, data-heavy dashboards, real-time tools, or AI-powered applications, Netlify’s platform makes the process seamless. +Netlify is more than just a deployment provider—they’ve worked closely with us to ensure that deploying TanStack Start applications is not just fast, but optimized for the best possible developer experience. Whether you’re building interactive UIs, data-heavy dashboards, real-time tools, or AI-powered applications, Netlify’s platform makes the process seamless. As part of this partnership, Netlify has also launched a **full-stack AI chatbot starter template** that showcases TanStack Start’s powerful data management capabilities alongside Netlify Functions. This template provides: diff --git a/src/blog/npm-stats-the-right-way.md b/src/blog/npm-stats-the-right-way.md deleted file mode 100644 index 12e7f995c..000000000 --- a/src/blog/npm-stats-the-right-way.md +++ /dev/null @@ -1,327 +0,0 @@ ---- -title: 'How We Track Billions of Downloads: The NPM Stats API Deep Dive' -published: 2025-12-02 -authors: - - Tanner Linsley ---- - -When you're tracking download stats for an ecosystem of 200+ packages that have been downloaded over 4 billion times, you learn a few things about NPM's download counts API. Some of those lessons are documented. Others you discover the hard way. - -This post is about one of those hard-learned lessons: **why we can't just ask NPM for all-time download stats in a single request, and why the approach matters more than you'd think.** - ---- - -## The Two Faces of NPM Stats - -NPM offers two endpoints for download statistics: - -**The Point Endpoint** (`/downloads/point/{period}/{package}`) - -```json -{ - "downloads": 585291892, - "start": "2024-06-06", - "end": "2025-12-06", - "package": "@tanstack/react-query" -} -``` - -This gives you a single aggregate number. Clean, simple, exactly what you want. - -**The Range Endpoint** (`/downloads/range/{period}/{package}`) - -```json -{ - "downloads": [ - { "day": "2024-06-06", "downloads": 1904088 }, - { "day": "2024-06-07", "downloads": 1847293 }, - ... - ], - "start": "2024-06-06", - "end": "2025-12-06", - "package": "@tanstack/react-query" -} -``` - -This gives you day-by-day breakdowns. More data, but you have to sum it yourself if you want totals. - -On the surface, these should return the same numbers. The range endpoint just has more detail, right? - -Not quite. - ---- - -## The 18-Month Wall - -Here's what the docs say: **both endpoints are limited to 18 months of historical data for standard queries.** - -But here's what the docs don't emphasize: when you request more than 18 months, **the API silently truncates your results.** - -Let me show you what I mean. - ---- - -## The Experiment - -I built a script to test this. Simple premise: query the same packages with both endpoints across different time ranges, and see what happens. - -```javascript -// Query @tanstack/react-query for different time periods -const periods = [ - 'last-week', // 7 days - 'last-month', // 30 days - '2024-12-06:2025-12-06', // 12 months - '2024-06-06:2025-12-06', // 18 months - '2023-12-07:2025-12-06', // 24 months - '2015-01-10:2025-12-06', // All-time -] -``` - -For short periods (7 days, 30 days, 12 months), everything worked perfectly. Both endpoints returned identical data: - -``` -Last 7 days: - Point: 13,085,419 - Range: 13,085,419 (7 days) - ✅ Difference: 0.00% - -Last 30 days: - Point: 54,052,299 - Range: 54,052,299 (30 days) - ✅ Difference: 0.00% - -12 months: - Point: 479,463,656 - Range: 479,463,656 (366 days) - ✅ Difference: 0.00% -``` - -Great! The endpoints match. Time to query all-time stats. - ---- - -## The Plot Twist - -Here's where things get interesting: - -``` -18 months: - Point: 585,291,892 - Range: 585,291,892 (549 days) - ✅ Difference: 0.00% - -24 months (beyond limit): - Point: 585,291,892 - Range: 585,291,892 (549 days) - ✅ Difference: 0.00% - -All-time (from 2015): - Point: 585,291,892 - Range: 585,291,892 (549 days) - ✅ Difference: 0.00% -``` - -Notice something? **The numbers are identical for 18 months, 24 months, and all-time.** - -Same downloads. Same number of days (549). **Both endpoints are silently capped at roughly 18 months**, returning exactly 549 days of data no matter what date range you request. - -This means: - -- Requesting "all downloads since 2015" gives you 18 months of data -- The API doesn't tell you it truncated your request -- Both endpoints fail the same way - -TanStack Query has been around since 2019. React has been around since 2013. If we just asked NPM for "all-time" stats, we'd be missing **years** of download history. - ---- - -## Proof: The Real Numbers - -To validate this, I ran a second test comparing single requests vs properly chunked requests: - -**Single Request** (2019-10-25 to today): - -``` -Downloads: 585,291,892 -Days: 549 days -``` - -**Chunked Requests** (same period, 5 chunks of ~500 days each): - -``` -Chunk 1 (2019-10-25 → 2021-03-08): 0 downloads -Chunk 2 (2021-03-09 → 2022-07-22): 0 downloads -Chunk 3 (2022-07-23 → 2023-12-05): 86,135,448 downloads -Chunk 4 (2023-12-06 → 2025-04-19): 284,835,067 downloads -Chunk 5 (2025-04-20 → 2025-12-06): 373,366,977 downloads - -Total: 744,337,492 -Days: 2,235 days -``` - -**The difference? 159 million downloads.** That's **27% of the data** completely missing from the single request approach. - -You can verify this yourself using tools like [npm-stat.com](https://npm-stat.com), which properly implements chunking and shows ~744M downloads for TanStack Query - matching our chunked approach, not the naive single-request number. - ---- - -## Why This Matters - -When you're tracking growth for an open source ecosystem, accuracy matters. Not for vanity metrics, but because: - -1. **Sponsorship decisions** are made based on real adoption numbers -2. **Contributors want to see impact** from their work -3. **Companies evaluating libraries** look at download trends - -If we naively queried for all-time stats, we'd be reporting 585 million downloads for TanStack Query. The real number? **744 million**. That's 159 million downloads (27%) missing. - -For the entire TanStack ecosystem with 200+ packages? We'd be off by billions. - ---- - -## The Right Way: Chunked Requests - -The solution is to break time into chunks and request each period separately: - -```typescript -async function fetchAllTimeDownloads(packageName: string, createdDate: string) { - const chunks = [] - const maxChunkDays = 500 // Stay under 18-month limit - - let currentDate = new Date(createdDate) - const today = new Date() - - while (currentDate < today) { - const chunkEnd = new Date(currentDate) - chunkEnd.setDate(chunkEnd.getDate() + maxChunkDays) - - if (chunkEnd > today) { - chunkEnd = today - } - - const from = formatDate(currentDate) - const to = formatDate(chunkEnd) - - const url = `https://api.npmjs.org/downloads/range/${from}:${to}/${packageName}` - const data = await fetchWithRetry(url) - - chunks.push(data) - currentDate = chunkEnd - - // Small delay to avoid rate limiting - await sleep(200) - } - - // Sum all chunks - return chunks.reduce((total, chunk) => { - return total + chunk.downloads.reduce((sum, day) => sum + day.downloads, 0) - }, 0) -} -``` - -This approach: - -- Breaks the timeline into ~17-month chunks (staying safely under the limit) -- Fetches each chunk sequentially to avoid rate limiting -- Sums the results to get true all-time totals -- Includes retry logic for reliability - -It's more work, but it's the only way to get accurate historical data. - ---- - -## Point vs Range: Which One? - -After all this, you might wonder: should you use `/point/` or `/range/`? - -**For all-time stats, use `/range/` with chunking.** Here's why: - -1. **They return the same totals** (when you sum the daily breakdowns from range) -2. **Range gives you daily granularity** for trend analysis -3. **Range is what you need for chunking anyway** (you have to sum across chunks) -4. **Both are limited to 18 months**, so there's no advantage to point - -The point endpoint is useful for quick spot checks or when you only need recent data. But for building a real stats system, range is the way to go. - ---- - -## Our Implementation - -At TanStack, we've built a sophisticated stats system that handles this properly: - -- **Automatic chunking** for packages created before 18 months ago -- **Rate limit handling** with exponential backoff -- **Concurrent processing** of 8 packages at a time (to balance speed and API limits) -- **Database caching** with 24-hour TTL to avoid hammering NPM -- **Scheduled refreshes** every 6 hours via Netlify functions -- **Growth rate calculation** from the most recent 7 days for live animations - -The full implementation is in [`src/utils/stats.functions.ts`](https://github.com/TanStack/tanstack.com/blob/main/src/utils/stats.functions.ts) if you want to see how we handle the details. - -### Library-Level Aggregation - -One interesting aspect of our system is how we track stats at the library level. Each TanStack library (Query, Table, Router, etc.) maps to a GitHub repository, and we aggregate downloads for **all npm packages** published from that repo. - -This includes: - -1. **Scoped packages**: Like `@tanstack/react-query`, `@tanstack/query-core` -2. **Legacy packages**: Like `react-query` (the pre-rebrand name) -3. **Addon packages**: Like `@tanstack/react-query-devtools`, `@tanstack/react-query-persist-client` - -For example, TanStack Query's library stats include: - -```typescript -// From src/libraries/query.tsx -{ - repo: 'tanstack/query', - legacyPackages: ['react-query'] -} -``` - -This means our library metrics sum up all related packages, which can include addons and dependencies that might also depend on the core package. This **could inflate library-level numbers** since some downloads might be for packages that themselves depend on other packages in the same library. - -We know this. We're keeping it simple for now. - -The alternative would be dependency analysis and deduplication - figuring out which packages depend on each other and avoiding double-counting. That's a project for another day. For now, the simple aggregation gives us a reasonable approximation of ecosystem reach, even if it's not perfectly precise. - -What matters is consistency: we track the same way over time, so trends and growth rates remain meaningful. - ---- - -## The Results - -This approach lets us accurately track downloads across **203 packages** (199 scoped @tanstack/\* + 4 legacy packages), maintaining historical accuracy going back to 2015. - -The stats you see on [tanstack.com](/stats) aren't guesses or estimates. They're the sum of thousands of individual API calls, properly chunked, cached, and aggregated. - -When we say TanStack has been downloaded over 4 billion times, that number is real. And it's growing by millions every day. - ---- - -## Key Takeaways - -If you're building a system to track NPM download stats: - -1. **Never trust a single "all-time" request** - it's capped at 18 months -2. **Use the `/range/` endpoint with chunking** for historical accuracy -3. **Implement retry logic** - rate limiting will happen -4. **Cache aggressively** - NPM's data doesn't update instantly -5. **Test your assumptions** - build experiments to verify behavior - -The NPM download counts API is powerful, but it has sharp edges. Understanding these limitations is the difference between showing users vanity metrics and giving them real data. - ---- - -## Why This Matters to TanStack - -We care about this because **transparency matters**. When we show download stats, we want them to be accurate. When we talk about growth, we want it to be real. - -The same principle applies to our libraries. We don't hide complexity behind magic. We build tools that are powerful when you need them to be, and simple when you don't. - -That's the TanStack way. - ---- - -**Want to dive deeper into how we build TanStack?** [Join our Discord](https://tlinz.com/discord) where we talk about architecture, API design, and the technical decisions behind the ecosystem. - -**Using TanStack and want to support the work?** [Check out our sponsors and partners page](/partners). Every contribution helps us keep building open source the right way. diff --git a/src/blog/openrouter-partnership.md b/src/blog/openrouter-partnership.md deleted file mode 100644 index 6e0c4829e..000000000 --- a/src/blog/openrouter-partnership.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: TanStack + OpenRouter Partnership -published: 2026-03-09 -authors: - - Tanner Linsley ---- - -![TanStack + OpenRouter](/blog-assets/openrouter-partnership/header.png) - -**OpenRouter is now an official TanStack sponsor.** And the most concrete expression of that is already shipped: [`@tanstack/ai-openrouter`](https://tanstack.com/ai/latest/docs/adapters/openrouter) — a first-class TanStack AI adapter that gives you access to 300+ models from 60+ providers through a single, unified API. - -## Why OpenRouter - -When we started building TanStack AI, one of our core beliefs was that you shouldn't have to bet your integration on a single provider. The AI model landscape is moving faster than anyone can predict. The model that wins this quarter might not be the one you want next quarter, and rewriting your AI layer every time a new frontier model drops is exactly the kind of undifferentiated toil we want to help you avoid. - -OpenRouter solves this cleanly. One API key. One integration. GPT-5, Claude, Gemini, Llama, Mistral, DeepSeek — and whatever ships next month. When you want to try a different model, you change a string. When a provider goes down, OpenRouter routes around it automatically. That's the kind of leverage I want TanStack developers to have. - -## The Adapter - -```bash -npm install @tanstack/ai-openrouter -``` - -```typescript -import { chat } from '@tanstack/ai' -import { openRouterText } from '@tanstack/ai-openrouter' - -const stream = chat({ - adapter: openRouterText('anthropic/claude-sonnet-4.5'), - messages: [{ role: 'user', content: 'Hello!' }], -}) -``` - -Swap the model string for any of the [300+ models on OpenRouter](https://openrouter.ai/models?utm_source=tanstack). Everything else stays the same. - -One feature I particularly love is the auto-router with fallbacks. It's dead simple to set up and gives your app real production resilience without any retry logic of your own: - -```typescript -const stream = chat({ - adapter: openRouterText('openrouter/auto'), - messages, - providerOptions: { - models: [ - 'openai/gpt-5', - 'anthropic/claude-sonnet-4.5', - 'google/gemini-3-pro-preview', - ], - route: 'fallback', - }, -}) -``` - -If the primary model fails or gets rate-limited, OpenRouter falls through to the next one. No outage pages, no extra infrastructure. - -## Jack's Image Generation Demo - -Our own Jack Herrington put together a demo showing off TanStack AI with the OpenRouter adapter to do image generation. It's a great look at how far this goes beyond just chat: - - - -## What This Means Going Forward - -OpenRouter's sponsorship of TanStack means the adapter is actively maintained, tested, and will stay in sync with both libraries as they evolve. More importantly, both teams are genuinely aligned on the same goal: give developers the most flexible AI integration possible without locking them into anything. - -If you're building AI features with TanStack, the OpenRouter adapter is the one I'd reach for first. - -- [TanStack AI + OpenRouter docs](https://tanstack.com/ai/latest/docs/adapters/openrouter) -- [Browse OpenRouter models](https://openrouter.ai/models?utm_source=tanstack) diff --git a/src/blog/react-server-components.md b/src/blog/react-server-components.md deleted file mode 100644 index 1913961f0..000000000 --- a/src/blog/react-server-components.md +++ /dev/null @@ -1,519 +0,0 @@ ---- -title: 'React Server Components Your Way' -published: 2026-01-15 -draft: true -authors: - - Manuel Schiller - - Tanner Linsley - - Jack Herrington ---- - -![React Server Components](/blog-assets/composite-components/header.jpg) - -**You know what's best for your application architecture.** That's always been the TanStack philosophy, and it's exactly how we approached React Server Components. - -Here's the thing: RSCs are genuinely exciting. Smaller bundles, streaming UI, moving heavy work off the client. But existing implementations force you into a one-size-fits-all pattern. The server owns your component tree. You opt into interactivity with `'use client'`. Composition flows one direction: server decides, client receives. - -We think you deserve more control than that. - -What if RSCs were components that _you_ could fetch, cache, and compose on your own terms? What if the client led the composition instead of just hydrating whatever the server handed down? - -That's exactly what we built in **TanStack Start**. We call them **Composite Components**, and we're genuinely excited to see what you build with them. - -> **Status:** RSC support ships as an experimental feature in TanStack Start RC and will remain experimental into early v1. The API design is stable but expect refinements. See the [Start documentation](https://tanstack.com/start) for setup instructions. - ---- - -## What Are Composite Components? - -A **Composite Component** is a server-rendered React component that the client can fetch, cache, and assemble into its own UI tree. - -The server ships UI _pieces_. The client decides how to arrange them. That's it. That's the model. - -This inverts the typical RSC pattern. Instead of the client hydrating a server-owned tree, _your_ client pulls server-rendered fragments and composes them using familiar React patterns: props, children, render props. No `'use client'` directives littering your codebase. Your client components are already client components. You pass them into slots, and they render with full interactivity. - -Why does this matter in practice? - -- Cache RSC output across navigations (instant back-button, anyone?) -- Interleave server UI with client state -- Reuse the same server fragments in multiple layouts - -And because this is TanStack, Composite Components integrate with the tools you already know and trust: - -- **TanStack Router** loads them in route loaders and caches them automatically -- **TanStack Query** caches them with fine-grained control over staleness and refetching -- **TanStack DB** (coming soon) will sync them with offline support and optimistic updates - -The wire format is standard React Flight. The mental model is simple: server components are data. You fetch them, you cache them, you render them. Your app, your rules. - ---- - -## Two Approaches, Your Choice - -TanStack Start gives you two RSC helpers, and you can use either, both, or neither depending on what your app needs. - -**`renderToReadableStream` + `createFromReadableStream`** is the simpler option. The server renders to a Flight stream, and the client decodes it: - -```tsx -// Server -import { createServerFn } from '@tanstack/react-start' -import { renderToReadableStream } from '@tanstack/react-start/rsc' - -export const getGreeting = createServerFn({ method: 'GET' }).handler( - async () => { - return await renderToReadableStream(

Hello from the server

) - }, -) - -// Client -import { createFromReadableStream } from '@tanstack/react-start/rsc' - -function Greeting() { - const [content, setContent] = useState(null) - - useEffect(() => { - getGreeting().then((stream) => - createFromReadableStream(stream).then(setContent), - ) - }, []) - - return <>{content} -} -``` - -**`createCompositeComponent`** is for when you need slots—places where the client can inject its own components with full interactivity: - -```tsx -import { - CompositeComponent, - createCompositeComponent, -} from '@tanstack/react-start/rsc' - -const getCard = createServerFn().handler(async () => { - const src = await createCompositeComponent( - (props: { children?: React.ReactNode }) => ( -
-

Server-rendered header

- {props.children} -
- ), - ) - return { src } -}) - -// In your component: -const { src } = await getCard() -return ( - - {/* Full client interactivity */} - -) -``` - -Notice there's no `"use client"` anywhere. Components you pass into slots are fully interactive by default—no directives required. - -**Mix and match freely.** Use `renderToReadableStream` for static content, `createCompositeComponent` when you need slots, or skip RSCs entirely for client-heavy routes. The architecture doesn't force a pattern on you. - ---- - -## Why RSCs Matter - -Before we dive into patterns, let's talk about when server components actually help: - -- **Heavy dependencies stay on the server.** Markdown parsers, syntax highlighters, date formatting libraries—these can add hundreds of KB to your bundle. With RSCs, that code runs on the server and only the rendered HTML ships to the client. Your users' phones will thank you. - -- **Colocated data fetching.** TanStack Router already eliminates waterfalls by parallelizing route loaders. RSCs offer a different ergonomic: await data directly in the component that renders it. Super convenient for static or slow-changing content. - -- **Sensitive logic stays secure.** API keys, database queries, business logic—none of it reaches the client bundle. Ever. - -- **Streaming for perceived performance.** RSCs stream UI progressively. Users see content immediately while slower parts load in the background. It just _feels_ fast. - -Here's the thing: RSCs aren't about replacing client interactivity. They're about giving you the choice of where work happens. And that choice should be yours, not your framework's. - ---- - -## Composition Patterns - -Composite Components support two levels of composition. Let's look at both. - -### Intra-component: Slots Inside One Component - -A Composite Component can render server UI while exposing **slots** for client content. Slots use plain React patterns you already know: - -- `children` -- render props (like `renderActions`) - -Because the client owns the component tree, the components you pass into slots are regular client components. No `'use client'` directive required. The server positions them as opaque placeholders but can't inspect, clone, or transform them. That's what keeps the model predictable and, frankly, makes it easy to reason about. - -#### Server - -```tsx -import { createCompositeComponent } from '@tanstack/react-start/rsc' - -const getPost = createServerFn().handler(async ({ data }) => { - const post = await db.posts.get(data.postId) - - const src = await createCompositeComponent( - (props: { - children?: React.ReactNode - renderActions?: (data: { - postId: string - authorId: string - }) => React.ReactNode - }) => ( -
-

{post.title}

-

{post.body}

- - {/* Server renders this link directly */} - - Next Post - - - {/* Slot: server requests client UI here */} -
- {props.renderActions?.({ postId: post.id, authorId: post.authorId })} -
- - {/* Slot: client fills this with children */} - {props.children} -
- ), - ) - - return { src } -}) -``` - -#### Client - -```tsx -import { CompositeComponent } from '@tanstack/react-start/rsc' - -function PostPage({ postId }) { - const { data } = useSuspenseQuery({ - queryKey: ['post', postId], - queryFn: () => getPost({ data: { postId } }), - }) - - return ( - ( - // Full client interactivity: hooks, state, context - - )} - > - - - ) -} -``` - -The server renders the `` directly and leaves join points for the client: - -- A render prop slot for `` (with server-provided arguments) -- A `children` slot for `` - -### Inter-component: Composition Across Components - -Since a Composite Component is just data, the client can treat it as a building block: - -- Interleave multiple Composite Components in a new tree -- Wrap them in client providers or layouts -- Nest one inside another via slots -- Reorder or swap them based on client state - -Same mental model as regular React components. - -### Bundling Multiple RSCs - -Sometimes you want to fetch a few server-rendered fragments together, like a header, a content region, and a footer. A single server function can return multiple Composite Components in one request: - -```tsx -import { createCompositeComponent } from '@tanstack/react-start/rsc' - -const getPageLayout = createServerFn().handler(async () => { - const [Header, Content, Footer] = await Promise.all([ - createCompositeComponent(() =>
...
), - createCompositeComponent(() =>
...
), - createCompositeComponent(() =>
...
), - ]) - - return { Header, Content, Footer } -}) -``` - -This keeps network overhead low while still giving you composable pieces. Each returned component can still expose its own slots. - ---- - -## Caching - -Here's where things get really nice. Server components are streams, but you don't have to think about that. TanStack Start integrates them with two caching layers you already know. - -### Router: Automatic Route-Based Caching - -TanStack Router caches loader data automatically. The cache key is the route path plus its params: - -```tsx -import { CompositeComponent } from '@tanstack/react-start/rsc' - -export const Route = createFileRoute('/posts/$postId')({ - loader: async ({ params }) => ({ - Post: await getPost({ data: { postId: params.postId } }), - }), - component: PostPage, -}) - -function PostPage() { - const { Post } = Route.useLoaderData() - - return ( - } - > - - - ) -} -``` - -Navigate from `/posts/abc` to `/posts/xyz` and the loader runs again. Navigate back to `/posts/abc` and Router serves the cached component instantly. Your users get that snappy back-button experience without you writing any caching logic. - -Router caching is effectively zero-config for most routes. For more advanced cache key control (like including search params), check out [`loaderDeps`](/router/latest/docs/framework/react/guide/data-loading#using-loaderdeps-to-access-search-params) in the docs. - -### Query: Fine-Grained Control - -When you need more control, use TanStack Query. With Suspense you can treat the server component like any other async resource. You still get explicit cache keys, stale time, background refetching, and all the other Query features: - -```tsx -import { CompositeComponent } from '@tanstack/react-start/rsc' - -function PostPage() { - const { postId } = Route.useParams() - - const { data } = useSuspenseQuery({ - queryKey: ['post', postId], - queryFn: () => getPost({ data: { postId } }), - staleTime: 5 * 60 * 1000, - }) - - return ( - } - > - - - ) -} -``` - -Navigate away and back: cache hit, instant render, no network request. The RSC payload is the cache value. Query doesn't know it's caching a server component. It's just bytes that decode into a React element tree. For static content, just set `staleTime: Infinity` and you're done. - ---- - -## How It Works - -Curious about the magic? Here's what's happening under the hood. - -When your server component accesses props, it accesses a proxy. Every property access and function call is tracked: - -- `props.children` serializes as a slot placeholder -- `props.renderActions({ postId, authorId })` serializes with the arguments attached - -You can destructure props normally—the proxy handles both `props.children` and `({ children })`. - -**The rules are simple:** Slot placeholders are opaque on the server. You can't enumerate props with `Object.keys()` or serialize a render prop with `JSON.stringify()`. The [documentation](/start/latest/docs/server-components) covers the full contract. - -Over the wire, it's a React element stream with embedded placeholders. On the client: - -1. The stream decodes into a React element tree -2. Placeholders match the props you passed when rendering -3. Render functions replay with the serialized arguments - -``` -Server Client ------- ------ -props.renderActions({ renderActions prop is called - postId: "abc", -> with { postId: "abc", authorId: "xyz" } - authorId: "xyz" -}) Your function runs client-side - with full hooks/state/context -``` - -Type safety flows through automatically. The function signature on the server determines what arguments your client function receives—no extra work required. - ---- - -## Low-Level API: Full Control - -The patterns above cover most use cases. But if you want to serve RSCs from API routes, build custom streaming protocols, or integrate with external systems, you can use the same Flight stream primitives directly. - -### The Primitives - -| Function | Where it runs | What it does | -| -------------------------- | ------------- | ------------------------------------------------- | -| `renderToReadableStream` | Server only | Renders React elements to a Flight stream | -| `createFromFetch` | Client | Decodes a Flight stream from a fetch response | -| `createFromReadableStream` | Client/SSR | Decodes a Flight stream from any `ReadableStream` | - -### Example: RSC via API Route - -Here's a minimal example serving an RSC from an API endpoint: - -```tsx -// src/routes/api/rsc.tsx -import { createFileRoute } from '@tanstack/react-router' -import { createServerFn } from '@tanstack/react-start' -import { renderToReadableStream } from '@tanstack/react-start/rsc' - -const getFlightStream = createServerFn({ method: 'GET' }).handler(async () => { - return renderToReadableStream( -
-

Hello from the server

-

This is a Flight stream served via API route.

-
, - ) -}) - -export const Route = createFileRoute('/api/rsc')({ - server: { - handlers: { - GET: async () => { - const stream = await getFlightStream() - return new Response(stream, { - headers: { 'Content-Type': 'text/x-component' }, - }) - }, - }, - }, -}) -``` - -And on the client: - -```tsx -import { createFromFetch } from '@tanstack/react-start/rsc' - -function GreetingLoader() { - const [content, setContent] = React.useState(null) - - React.useEffect(() => { - createFromFetch(fetch('/api/greeting')).then(setContent) - }, []) - - return content ??
Loading...
-} -``` - -This gives you complete control over how RSC content is generated and consumed. Use it for custom caching layers, WebSocket-based streaming, or anything else the high-level helpers don't cover. - ---- - -## Security: One-Way Data Flow - -Let's talk about something important. You may have seen recent CVEs affecting RSC implementations in other frameworks. Here's why TanStack Start isn't vulnerable to those same issues. - -The core difference is simple: **TanStack Start's server functions don't accept or parse incoming Flight data.** Payloads flow in one direction only: server to client. - -Other RSC implementations use the `'use server'` directive to create Server Actions that parse Flight data sent _from_ the client. That bidirectional flow is where the vulnerabilities live. When your server parses untrusted Flight payloads, you're exposed to deserialization attacks and prototype pollution. - -We took a fundamentally different approach. TanStack Start uses `createServerFn` for server functions. These are regular functions that receive JSON input, validate it with your middleware, and return data. They don't accept Flight streams. They don't parse React's wire format from untrusted sources. - -The result: server-rendered RSC content streams to your client, but the client never sends Flight data back. No parsing of untrusted RSC payloads means no exposure to those attack vectors. - -That said, treat your server functions like any API surface: authenticate requests, validate inputs, and keep React patched. Security is always defense in depth. But you can use Composite Components knowing they aren't susceptible to the same class of vulnerabilities that have affected other frameworks. - ---- - -## The Full Spectrum - -With RSCs as primitives, TanStack Start covers every frontend use case. And we mean _every_: - -- **Fully Interactive** - No server components at all. Client-first, SPA-style. RSCs are an optimization you add when helpful, not a paradigm you're forced to build around. - -- **Hybrid** - Server components for static shells, data-heavy regions, or SEO-critical content. Slots for interactivity. Mix freely within the same component. This is where most apps will land. - -- **Fully Static** - Pre-render everything at build time. No hydration, no JavaScript. Just ship HTML. - -**One framework. One mental model. The entire spectrum.** -You don't have to choose "interactive framework" or "static framework" or "RSC framework." -You choose patterns **per-route, per-component, per-use-case**. The architecture supports all of it. Because, again, you know what's best for your app. - ---- - -## Current Status: Experimental - -RSC support is experimental in TanStack Start RC and will remain experimental into early v1. - -**Serialization:** This release uses React's native Flight protocol. TanStack Start's usual serialization features aren't available within server components for now. - -**API surface:** The `createCompositeComponent`, `renderToReadableStream`, and related APIs are stable in design but may see refinements. - -If you hit rough edges, [open an issue](https://github.com/tanstack/router/issues) or join the [Discord](https://tlinz.com/discord). - ---- - -## FAQ - -We get questions. Here are answers. - -### How does this compare to Next.js App Router? - -Next.js App Router is server-first: your component tree lives on the server by default, and you opt into client interactivity with `'use client'`. - -TanStack Start is **isomorphic-first**: your tree lives wherever makes sense. The key difference is **client-led composition**. Composite Components expose slots so the client assembles the final tree. You're in control. - -### Can I use this with Next.js or Remix? - -Not directly—TanStack Start is its own framework. But if you use TanStack Query or Router already, the mental model transfers. - -### Do I have to use RSCs? - -Nope. RSCs are completely opt-in. You can build fully client-side routes (including `ssr: false`), use traditional SSR without server components, or go fully static. - -Composite Components are just another primitive. They compose with Start features like Selective SSR and with TanStack Query and Router caching, instead of replacing them. - -### What about React 19 and Server Actions? - -TanStack Start uses React's Flight protocol and works with React 19. `createServerFn` serves a similar purpose to Server Actions but integrates with TanStack's middleware, validation, and caching. We're watching the Server Actions API and will align where it makes sense. - -### Can I define components outside the RSC helpers? - -Yes. Define your component separately and invoke it inside `createCompositeComponent` or `renderToReadableStream`. The helpers just initiate the RSC stream—they don't care where your JSX comes from. - -### Can I return raw JSX without the RSC helpers? - -No. `renderToReadableStream` and `createCompositeComponent` enable streaming, slot handling, and client rehydration. Plain JSX from a server function won't have RSC behavior. - -### Do `cloneElement` and React Context work with server component children? - -**cloneElement:** No—client children are slot placeholders. The server can't inspect or clone them. (This is actually a feature, not a bug. It keeps the model predictable.) - -**React Context:** Yes! Providers in server components wrap client children just fine. The context must work across the boundary (typically `'use client'` on the provider component). - -### What about security? - -See the [Security: One-Way Data Flow](#security-one-way-data-flow) section above. The short version: TanStack Start's architecture doesn't parse Flight data from the client, so recent CVEs affecting other RSC frameworks don't apply here. - ---- - -## Your RSCs, Your Way - -We started this post with a simple idea: you know what's best for your application architecture. That's why we built the low-level API and Composite Components the way we did. - -Other frameworks tell you how RSCs have to work. We give you primitives and let you decide. Want a fully interactive SPA? Go for it. Want to sprinkle in server components for heavy lifting? Easy. Want to go full static? That works too. The architecture supports all of it because _your_ app isn't one-size-fits-all, and your framework shouldn't be either. - -TanStack Start's RSC model is available now as an experimental feature. We're excited to see what you build with it. - -- [Documentation](https://tanstack.com/start) -- [GitHub](https://github.com/tanstack/router) -- [Discord](https://tlinz.com/discord) - -Let's build something amazing together. diff --git a/src/blog/search-params-are-state.md b/src/blog/search-params-are-state.md index 751147bf4..9e66c9c21 100644 --- a/src/blog/search-params-are-state.md +++ b/src/blog/search-params-are-state.md @@ -7,9 +7,9 @@ authors: ![Search Params Are State Header](/blog-assets/search-params-are-state/search-params-are-state-header.jpg) -## Search Params Are State . Treat Them That Way +## Search Params Are State — Treat Them That Way -Search params have been historically treated like second-class state. They're global, serializable, and shareable . but in most apps, they’re still hacked together with string parsing, loose conventions, and brittle utils. +Search params have been historically treated like second-class state. They're global, serializable, and shareable — but in most apps, they’re still hacked together with string parsing, loose conventions, and brittle utils. Even something simple, like validating a `sort` param, quickly turns verbose: @@ -30,7 +30,7 @@ This works, but it’s manual and repetitive. There’s no inference, no connect Even worse, `URLSearchParams` is string-only. It doesn’t support nested JSON, arrays (beyond naive comma-splitting), or type coercion. So unless your state is flat and simple, you’re going to hit walls fast. -That’s why we’re starting to see a rise in tools and proposals . things like Nuqs, Next.js RFCs, and userland patterns . aimed at making search params more type-safe and ergonomic. Most of these focus on improving _reading_ from the URL. +That’s why we’re starting to see a rise in tools and proposals — things like Nuqs, Next.js RFCs, and userland patterns — aimed at making search params more type-safe and ergonomic. Most of these focus on improving _reading_ from the URL. But almost none of them solve the deeper, harder problem: **writing** search params, safely and atomically, with full awareness of routing context. @@ -56,15 +56,15 @@ Constraint is what makes coordination possible. It’s what allows **non-local c --- -### Local Abstractions Can Help . But They Don’t Coordinate +### Local Abstractions Can Help — But They Don’t Coordinate -Tools like **Nuqs** are a great example of how local abstractions can improve the _ergonomics_ of search param handling. You get Zod-powered parsing, type inference, even writable APIs . all scoped to a specific component or hook. +Tools like **Nuqs** are a great example of how local abstractions can improve the _ergonomics_ of search param handling. You get Zod-powered parsing, type inference, even writable APIs — all scoped to a specific component or hook. -They make it easier to read and write search params **in isolation** . and that’s valuable. +They make it easier to read and write search params **in isolation** — and that’s valuable. But they don’t solve the broader issue of **coordination**. You still end up with duplicated schemas, disjointed expectations, and no way to enforce consistency between routes or components. Defaults can conflict. Types can drift. And when routes evolve, nothing guarantees all the callers update with them. -That’s the real fragmentation problem . and fixing it requires bringing search param schemas into the routing layer itself. +That’s the real fragmentation problem — and fixing it requires bringing search param schemas into the routing layer itself. --- @@ -100,13 +100,13 @@ navigate({ }) ``` -It’s reducer-style, transactional, and integrates directly with the router’s reactivity model. Components only re-render when the specific search param they use changes . not every time the URL mutates. +It’s reducer-style, transactional, and integrates directly with the router’s reactivity model. Components only re-render when the specific search param they use changes — not every time the URL mutates. --- ### How TanStack Router Prevents Schema Fragmentation -When your search param logic lives in userland . scattered across hooks, utils, and helpers . it’s only a matter of time before you end up with **conflicting schemas**. +When your search param logic lives in userland — scattered across hooks, utils, and helpers — it’s only a matter of time before you end up with **conflicting schemas**. Maybe one component expects \`sort: 'asc' | 'desc'\`. Another adds a \`filter\`. A third assumes \`sort: 'desc'\` by default. None of them share a source of truth. @@ -117,7 +117,7 @@ This leads to: - Navigation that sets values others can’t parse - Broken deep linking and bugs you can’t trace -TanStack Router prevents this by tying schemas directly to your route definitions . **hierarchically**. +TanStack Router prevents this by tying schemas directly to your route definitions — **hierarchically**. Parent routes can define shared search param validation. Child routes inherit that context, add to it, or extend it in type-safe ways. This makes it _impossible_ to accidentally create overlapping, incompatible schemas in different parts of your app. @@ -160,7 +160,7 @@ validateSearch: z.object({ }) ``` -This kind of enforcement makes nested routes composable _and_ safe . a rare combo. +This kind of enforcement makes nested routes composable _and_ safe — a rare combo. --- @@ -168,7 +168,7 @@ This kind of enforcement makes nested routes composable _and_ safe . a rare comb The magic here is that you don’t need to teach your team to follow conventions. The route _owns_ the schema. Everyone just uses it. There’s no duplication. No drift. No silent bugs. No guessing. -When you bring validation, typing, and ownership into the router itself, you stop treating URLs like strings and start treating them like real state . because that’s what they are. +When you bring validation, typing, and ownership into the router itself, you stop treating URLs like strings and start treating them like real state — because that’s what they are. --- @@ -176,7 +176,7 @@ When you bring validation, typing, and ownership into the router itself, you sto Most routing systems treat search params like an afterthought. Something you _can_ read, maybe parse, maybe stringify, but rarely something you can actually **trust**. -TanStack Router flips that on its head. It makes search params a core part of the routing contract . validated, inferable, writable, and reactive. +TanStack Router flips that on its head. It makes search params a core part of the routing contract — validated, inferable, writable, and reactive. Because if you’re not treating search params like state, you’re going to keep leaking it, breaking it, and working around it. diff --git a/src/blog/tanstack-2-years.md b/src/blog/tanstack-2-years.md deleted file mode 100644 index d963af646..000000000 --- a/src/blog/tanstack-2-years.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: The State of TanStack, Two Years of Full-Time OSS -published: 2025-11-24 -authors: - - Tanner Linsley ---- - -![TanStack Form v1](/blog-assets/tanstack-2-years/tanstack-2-years-header.jpg) - -Two years ago I went all in on TanStack. No consulting, no safety nets, just a commitment to build open source at a professional, sustainable level. What started as a handful of libraries I built at Nozzle has grown into a real ecosystem powering millions of developers and many of the largest companies in the world. - -I can share plenty of numbers in this post, but this is really about what it feels like to run a modern open source organization: the highs, the lows, the cost, the growth, and the people who have made it possible. - ---- - -## The Big Challenge: TanStack Start - -Building a full stack framework is hard. I knew that from watching other teams do it. Most of them had something I didn't: capital. Next, Gatsby, Redwood, Remix... they all had funding, companies, or acquisition paths that helped them move fast. - -I didn't. TanStack had a ground swell behind it, but financially it was just me and whatever I had saved to survive another startup winter. I knew [Start](/start) would take a level of focus and sacrifice that most projects never require. It was an ecosystem-level rethink of how modern frontend applications should be built, starting with React but designed from day one to support Solid and other runtimes through adapters. - -I could get far alone. I couldn’t finish it alone. - ---- - -## The Human Cost - -Money buys time, and time has to be protected. Before I started this journey, I knew my personal, financial, and family life needed to be solid. When you’re trying to build something this big, your foundation matters more than your code. - -My family has kept me grounded. They are the thing I run back to every afternoon and weekend. They’ve supported the late nights and the intense sprints, and in return I try to be fully present when I’m not at my desk. Without my wife, kids, and extended family, I would have burned out months in. - -And yes, stepping away is hard. When you’re deep in flow, taking a vacation feels like losing momentum. But I love being with my family too much to trade that away. Even if I secretly worry I’ll forget how to code after a week on the beach. - ---- - -## The Team - -The other key ingredient was people. If I was going to take breaks and keep my sanity, I needed a team that could carry the torch with pride and consistency. Great software is always built by great people. - -I wanted contributors who could give their best work without feeling exploited or drained. That meant finding enough funding to pay them fairly and keep the lights on. Some of our contributors would tell you that money isn’t why they’re here, and they’re right. Their loyalty and pride in what we’re building is unshakeable. Still, I sleep better knowing they’re compensated for the value they bring. - ---- - -## Some Numbers - -At the time of writing, TanStack has **[16 partners](/partners)** funding a model that actually feels sustainable. Their support covers a reasonable salary for me, a growing rainy-day fund for the organization, monthly sponsorships for around **12 core contributors**, and short-term contracts for another **3 to 5 people**. - -Two years ago I had no idea if this approach to open source would work. So far it has. The real test will come in 2026, but we’ll get to that. - ---- - -## The Growth - -Here’s where the work shows. - -TanStack now includes **[13 active projects](/)** maintained by **36 core contributors** and supported by a community of **[6,300+ on Discord](https://tlinz.com/discord)**. Our libraries have been downloaded over **4 billion times**, have **[112,660 GitHub stars](https://github.com/tanstack)**, **[2,790 contributors](https://github.com/tanstack)**, and more than **1.3 million dependent repositories**. - -Even the website has become a real destination. In the last year, TanStack.com saw **3 million users**, **40 million page views**, and an average **session duration of 15 minutes**. - -More importantly, real companies are building real things on [TanStack Start](/start). Behind those numbers are teams from some of the largest and most well-known companies in the world, spanning tech, finance, e-commerce, entertainment, hardware, and healthcare. Seeing that level of adoption from both startups and global enterprises has been one of the most rewarding parts of this journey. - -Today, over **9,000 companies** are in our ongoing usage funnel, with another **33,000** in evaluation or experimentation. - -Every active TanStack library continues to grow month over month. That kind of growth isn’t hype. It’s teams building long-term bets. - -These numbers don’t define us, but they prove that principled open source can scale without compromising what makes it good. - ---- - -## Two Years of Full-Time OSS - -Going full time on open source felt risky. I had conviction, not guarantees. But the shift to sustainability changed everything. I could finally think long term. Not “next sprint” long term. Next decade long term. - -The experience has also taught me a lot about leadership. I’ve had to say no more often, slow things down at times, and balance my drive to create with the responsibility to maintain. Every decision has both a technical and a human cost. - -Success used to mean numbers. Now it means letting the people around me thrive too. - -Looking back, going full time wasn’t a bet on myself. It was a bet on us. A bet that an independent, principled community could build professional-grade software and still remain free, open, and sustainable. - ---- - -## Reflections - -TanStack has always been built on kindness. Inclusive, patient, and fiercely protective of quality. I’ve even had contributors turn down money purely out of principle, which still blows my mind. I usually convince them to take it anyway, but it says a lot about the kind of people involved. - -I still wrestle with polish and focus. That last ten percent takes me forever. I lean on my team for that. And I’m forgetful enough that I’m probably one missed calendar reminder away from hiring a personal assistant. - -If TanStack vanished tomorrow, I’d want people to remember the care we put into it. Not just in the code, but in how we treated each other. - ---- - -## What’s Next - -The next two years are about scale. - -[TanStack Start](/start) is closing in on 1.0. We're finalizing React Server Component support in a way that feels uniquely TanStack: pragmatic, cache-aware, and treating RSCs as another stream of server-side state rather than a whole new worldview. - -On the [Router](/router) side, some long-planned features may finally get their moment in 2026. - -And yes, we’ve already started work on a massive new library that will take most of next year to get off the ground. It’s one of the biggest things we’ve ever attempted. I can’t share details yet, but it will open a new chapter for the entire ecosystem. - -If the last two years were roots, the next two will be growth. - ---- - -## Gratitude - -None of this happens alone. - -To the contributors: thank you. You’ve turned ideas into software people can rely on. - -To our sponsors and partners: thank you for believing that open source can be sustainable, not just inspirational. - -And to the community: thank you for building your products, companies, and careers on our work. We don’t take that for granted for a second. - -These past two years have been the most demanding and fulfilling of my career. We’ve shown that open source can be principled, independent, and sustainable. And we’re still just getting started. - ---- - -## How to Support TanStack - -If TanStack has helped you or your team, here's how to help us keep going: - -- ⭐ [Star our repos on GitHub](https://github.com/tanstack) -- 💬 [Join the TanStack Discord](https://tlinz.com/discord) -- 💼 [Become a sponsor or partner](/partners) - -Every bit of support helps more than you realize. diff --git a/src/blog/tanstack-ai-alpha-2.md b/src/blog/tanstack-ai-alpha-2.md deleted file mode 100644 index 4aa8da895..000000000 --- a/src/blog/tanstack-ai-alpha-2.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: 'TanStack AI Alpha 2: Every Modality, Better APIs, Smaller Bundles' -published: 2025-12-19 -authors: - - Alem Tuzlak - - Jack Herrington - - Tanner Linsley ---- - -![TanStack AI Alpha 2](/blog-assets/tanstack-ai-alpha-2/header.jpeg) - -It's been two weeks since we released the first alpha of TanStack AI. To us, it feels like decades ago. We've prototyped through 5-6 different internal architectures to bring you the best experience possible. - -Our goals were simple: move away from monolithic adapters and their complexity, while expanding the flexibility and power of our public APIs. This release delivers on both. - -## New Adapter Architecture - -We wanted to support everything AI providers offer. Image generation, video, audio, text-to-speech, transcription. Without updating every adapter simultaneously. - -We're a small team. Adding image support shouldn't mean extending `BaseAdapter`, updating 5+ provider implementations, ensuring per-model type safety for each, and combing through docs manually. That's a week per provider. Multiply that by 20 providers and 6 modalities. - -So we split the monolith. - -Instead of: - -```ts -import { openai } from '@tanstack/ai-openai' -``` - -You now have: - -```ts -import { openaiText, openaiImage, openaiVideo } from '@tanstack/ai-openai' -``` - -### Why This Matters - -**Incremental feature support.** Add image generation to OpenAI this week, Gemini next week, video for a third provider the week after. Smaller releases, same pace. - -**Easier maintenance.** Our adapter abstraction had grown to 7 type generics with only text, summarization, and embeddings. Adding 6 more modalities would have exploded complexity. Now each adapter is focused. 3 generics max. - -**Better bundle size.** You control what you pull in. Want only text? Import `openaiText`. Want text and images? Import both. Your bundle, your choice. - -**Faster contributions.** Add support for your favorite provider with a few hundred lines. We can review and merge it quickly. - -## New Modalities - -What do we support now? - -- Structured outputs -- Image generation -- Video generation -- Audio generation -- Transcription -- Text-to-speech - -You have a use-case with AI? We support it. - -## API Changes - -We made breaking changes. Here's what and why. - -### Model Moved Into the Adapter - -Before: - -```ts -chat({ - adapter: openai(), - model: 'gpt-4', - // now you get typesafety... -}) -``` - -After: - -```ts -chat({ - adapter: openaiText('gpt-4'), - // immediately get typesafety -}) -``` - -Fewer steps to autocomplete. No more type errors from forgetting to define the model. - -### providerOptions → modelOptions - -Quick terminology: - -- **Provider**: Your LLM provider (OpenAI, Anthropic, Gemini) -- **Adapter**: TanStack AI's interface to that provider -- **Model**: The specific model (GPT-4, Claude, etc.) - -The old `providerOptions` were tied to the _model_, not the provider. Changing from `gpt-4` to `gpt-3.5-turbo` changes those options. So we renamed them: - -```ts -chat({ - adapter: openaiText('gpt-4'), - modelOptions: { - text: {}, - }, -}) -``` - -### Options Flattened to Root - -Settings like `temperature` work across providers. Our other modalities already put config at the root: - -```ts -generateImage({ - adapter, - numberOfImages: 3, -}) -``` - -So we brought chat in line: - -```ts -chat({ - adapter: openaiText('gpt-4'), - modelOptions: { - text: {}, - }, - temperature: 0.6, -}) -``` - -Start typing to see what's available. - -### The Full Diff - -```diff -chat({ -- adapter: openai(), -+ adapter: openaiText("gpt-4"), -- model: "gpt-4", -- providerOptions: { -+ modelOptions: { - text: {} - }, -- options: { -- temperature: 0.6 -- }, -+ temperature: 0.6 -}) -``` - -## What's Next - -**Standard Schema support.** We're dropping the Zod constraint for tools and structured outputs. Bring your own schema validation library. - -**On the roadmap:** - -- Middleware -- Tool hardening -- Headless UI library for AI components -- Context-aware tools -- Better devtools and usage reporting -- More adapters: AWS Bedrock, OpenRouter, and more - -Community contributions welcome. - -## Wrapping Up - -We've shipped a major architectural overhaul, new modalities across the board, and a cleaner API. The adapters are easy to make, easy to maintain, and easy to reason about. Your bundle stays minimal. - -We're confident in this direction. We think you'll like it too. - - diff --git a/src/blog/tanstack-ai-alpha-your-ai-your-way.md b/src/blog/tanstack-ai-alpha-your-ai-your-way.md deleted file mode 100644 index 1821a3e1b..000000000 --- a/src/blog/tanstack-ai-alpha-your-ai-your-way.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: 'TanStack AI Alpha: Your AI, Your Way' -published: 2025-12-04 -authors: - - Jack Herrington - - Alem Tuzlak - - Tanner Linsley ---- - -![TanStack AI Alpha](/blog-assets/tanstack-ai-alpha-your-ai-your-way/header.jpg) - -**The TanStack team is excited to announce the alpha release of [TanStack AI](/ai), a framework-agnostic AI toolkit built for developers who want control over their stack.** - -Let's be honest. The current AI landscape has a problem. You pick a framework, you pick a cloud provider, and suddenly you're locked into an ecosystem that dictates how you build. We think that's backwards. - -TanStack AI takes a different approach. We're building the Switzerland of AI tooling. An honest, open source set of libraries (across multiple languages) that works with your existing stack instead of replacing it. - -## What's in the Alpha - -**Server support across multiple languages.** We're shipping with JavaScript/TypeScript, PHP, and Python support out of the gate. All three support full agentic flows with tools. (Python and PHP have not yet been released to the appropriate package systems.) - -**Adapters for the providers you actually use.** TypeScript adapters for OpenAI, Anthropic, Gemini, and Ollama. The TypeScript server library also handles summarizations and embeddings. - -**An open, published protocol.** We've documented exactly how the server and client communicate. Use whatever language you want. Use whatever transport layer you want. HTTP, websockets, smoke signals. As long as you speak the protocol through a connection adapter, our client will work with your backend. - -**Isomorphic Tool Support.** Define your tools once with meta definitions, then provide isolated server and client implementations. This architecture gives you type safety that actually works across your entire application. - -**Client libraries that meet you where you are.** Vanilla JS, React, and Solid are ready now. Svelte and more are on the way. - -**Real examples that actually ship.** We're not just giving you docs, we're giving you working code: - -- [TanStack Start](/start) with React - -- [TanStack Start](/start) with Solid - -- PHP with Slim running a Vanilla client - -- Laravel with React (coming soon) - -- Python FastAPI with Vanilla frontend - -- A multi-user group chat built on [TanStack Start](/start) using Cap'n'Web RPC and websockets - -**Per-model type safety that actually matters.** Every provider has different options. Every model supports different modalities. Text, audio, video, tools. We give you full typing for providerOptions on a per-model basis, so your IDE knows exactly what each model can do. No more guessing. No more runtime surprises. - -**Isomorphic devtools.** A full AI devtools panel that gives you unparalleled insight into what the LLM is doing on both sides of the connection. See what's happening on the server. See what's happening on the client. Debug your AI workflows the way you debug everything else. Built on [TanStack Devtools](/devtools). - -## Coming Soon - -**Headless chatbot UI components.** Think Radix, but for AI chat interfaces. Fully functional, completely unstyled components for React and Solid that you can skin to match your application. You handle the look and feel, we handle the complexity underneath. Similar to how [TanStack Table](/table) and [TanStack Form](/form) work. - -## The Catch - -The only catch is that we're still in alpha. There will be bugs. There will be rough edges. There will be things that don't work as expected. We're not perfect. But we're honest. We're transparent. We're here to help. We're here to make building AI applications easier. What we are looking for is your feedback. Your suggestions. Your ideas. We're not done yet. But we're here to build the best AI toolkit possible. - -We are also taking a lot on here. All the TanStack teams are small and totally volunteer. So if you want to step up to help us build adapters, or help us work on the Python or PHP support, or really anything, we are here for it. - -## Why We Built This - -TanStack AI exists because developers deserve better. We're not selling a service. There's no platform to migrate to. No vendor lock-in waiting around the corner. Nor will there ever be. - -Just real honest open source tooling from the team you trust that has been shipping framework-agnostic developer tools for years. We've always had your back, and that's not changing now. diff --git a/src/blog/tanstack-ai-lazy-tool-discovery.md b/src/blog/tanstack-ai-lazy-tool-discovery.md deleted file mode 100644 index e11192474..000000000 --- a/src/blog/tanstack-ai-lazy-tool-discovery.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -title: 'Lazy Tool Discovery: Scaling AI Tool Systems Without Drowning in Tokens' -published: 2026-03-12 -authors: - - Alem Tuzlak ---- - -![Lazy Tool Discovery](/blog-assets/tanstack-ai-lazy-tool-discovery/header.webp) - -If you've built an AI-powered application with more than a handful of tools, you've probably hit the wall: every tool definition you send to the LLM costs tokens, eats into the context window, and — past a certain point — actually makes the model _worse_ at picking the right tool. More tools means more noise, slower responses, and higher bills. - -Today we're shipping **lazy tool discovery** in TanStack AI, a mechanism that lets the LLM discover tools on demand instead of receiving all of them upfront. - -## The Problem - -Consider a customer support agent with 30 tools: ticket lookup, order management, refund processing, knowledge base search, escalation workflows, analytics queries, and more. On any given request, the user probably needs 2–3 of these. But the LLM sees all 30 tool definitions on every single call. - -This creates three problems: - -1. **Token waste.** Tool definitions with descriptions and JSON schemas add up fast. Thirty detailed tools can easily burn 3,000–5,000 tokens before the conversation even starts. -2. **Decision fatigue.** LLMs perform better with fewer, more relevant options. Research consistently shows that tool selection accuracy degrades as the number of available tools grows. -3. **Inflexibility.** You either send everything or build your own routing layer to pre-filter tools. Neither option is great. - -## The Solution: `lazy: true` - -Lazy tool discovery adds a single flag to tool definitions: - -```typescript -const searchProducts = toolDefinition({ - name: 'searchProducts', - description: 'Search products by keyword', - inputSchema: z.object({ - query: z.string(), - }), - lazy: true, -}) -``` - -That's it. Tools marked `lazy: true` are withheld from the LLM. In their place, the LLM sees a single synthetic tool called `__lazy__tool__discovery__` whose description lists the names of all available lazy tools. - -When the LLM decides it needs a tool, the flow looks like this: - -1. The LLM sees the discovery tool: _"You have access to additional tools: [searchProducts, compareProducts, calculateFinancing]"_ -2. The LLM calls the discovery tool: `{ toolNames: ["searchProducts"] }` -3. The discovery tool returns the full description and JSON schema for `searchProducts` -4. `searchProducts` is injected as a normal tool in the next iteration -5. The LLM calls `searchProducts` directly with actual arguments - -From the LLM's perspective, it asked about a tool, learned what it does, and then used it. From your perspective, you saved tokens on every request where that tool wasn't needed. - -## How It Works Under the Hood - -When you pass tools to `chat()`, the engine separates them into eager tools (the default) and lazy tools. A `LazyToolManager` class handles the rest: - -- **Separation:** Eager tools are sent to the LLM immediately. Lazy tools are held back. -- **Discovery tool:** If any lazy tools exist, a synthetic discovery tool is created and included in the tool set. Its description contains the names of all lazy tools so the LLM knows what's available. -- **Dynamic injection:** When the LLM discovers a tool, it's added to the active tool set for the next agent loop iteration. The LLM then sees it as a regular tool with full schema — no proxy, no indirection. -- **Multi-turn memory:** On each `chat()` call, the manager scans the message history for previous discovery results. Tools discovered in earlier turns are automatically pre-populated — the LLM doesn't need to re-discover them. -- **Self-correction:** If the LLM tries to call a lazy tool it hasn't discovered yet (LLMs sometimes skip steps), it gets a helpful error: _"Tool 'searchProducts' must be discovered first. Call **lazy**tool**discovery** with toolNames: ['searchProducts'] to discover it."_ The LLM self-corrects on the next iteration. -- **Auto-cleanup:** When all lazy tools have been discovered, the discovery tool removes itself from the active set. No unnecessary clutter. - -## Zero Overhead When Not Used - -If none of your tools have `lazy: true`, the behavior is identical to before. No discovery tool is created, no extra processing happens, no code paths change. The feature is entirely opt-in. - -## A Real Example - -Here's a guitar store chat application with a mix of eager and lazy tools: - -```typescript -import { chat, toolDefinition, maxIterations } from '@tanstack/ai' -import { openaiText } from '@tanstack/ai-openai' -import { z } from 'zod' - -// Always available — core functionality -const getGuitars = toolDefinition({ - name: 'getGuitars', - description: 'Get all guitars from inventory', - inputSchema: z.object({}), -}).server(() => fetchGuitarsFromDB()) - -const recommendGuitar = toolDefinition({ - name: 'recommendGuitar', - description: 'Display a guitar recommendation to the user', - inputSchema: z.object({ id: z.number() }), -}).server(({ id }) => ({ id })) - -// Discovered on demand — secondary features -const compareGuitars = toolDefinition({ - name: 'compareGuitars', - description: 'Compare two or more guitars side by side', - inputSchema: z.object({ - guitarIds: z.array(z.number()).min(2), - }), - lazy: true, -}).server(({ guitarIds }) => buildComparison(guitarIds)) - -const calculateFinancing = toolDefinition({ - name: 'calculateFinancing', - description: 'Calculate monthly payment plans for a guitar', - inputSchema: z.object({ - guitarId: z.number(), - months: z.number(), - }), - lazy: true, -}).server(({ guitarId, months }) => computePaymentPlan(guitarId, months)) - -const searchGuitars = toolDefinition({ - name: 'searchGuitars', - description: 'Search guitars by keyword in name or description', - inputSchema: z.object({ - query: z.string(), - }), - lazy: true, -}).server(({ query }) => searchInventory(query)) - -// Use in chat — lazy tools work automatically -const stream = chat({ - adapter: openaiText('gpt-4o'), - messages, - tools: [ - getGuitars, - recommendGuitar, - compareGuitars, - calculateFinancing, - searchGuitars, - ], - agentLoopStrategy: maxIterations(20), -}) -``` - -When a user asks _"recommend me a guitar"_, the LLM sees `getGuitars`, `recommendGuitar`, and `__lazy__tool__discovery__`. It calls the first two and never touches discovery. Tokens saved. - -When a user asks _"compare the Motherboard Guitar and the Racing Guitar"_, the LLM sees the discovery tool, discovers `compareGuitars`, and calls it. One extra round-trip, but only when the feature is actually needed. - -When a user follows up with _"how much would the cheaper one cost per month?"_, the LLM has `compareGuitars` already available (from the earlier discovery) and discovers `calculateFinancing`. The conversation builds naturally without re-discovering tools. - -## When Should You Use It? - -Lazy discovery makes sense when: - -- **You have many tools** and most aren't needed in every conversation -- **Some tools are niche** — advanced search, analytics, admin functions, reporting -- **Tool descriptions are verbose** — detailed schemas with many properties -- **You're cost-conscious** — fewer tokens per request means lower bills - -Keep tools eager (the default) when: - -- They're called in most conversations -- The total tool count is small (under ~10) -- Latency is critical and the extra discovery round-trip matters - -A good rule of thumb: if a tool is used in less than 30% of conversations, it's a strong candidate for `lazy: true`. - -## What's Next - -Lazy tool discovery is available now in `@tanstack/ai`. Add `lazy: true` to any tool definition and you're done. - -We're exploring a few follow-on improvements: - -- **Grouped discovery:** Discover related tools together (e.g., all analytics tools at once) -- **Cost tracking:** Surface token savings from lazy tools in DevTools -- **Smarter descriptions:** Let the discovery tool description include one-line summaries per lazy tool, not just names - -Check out the [full documentation](https://tanstack.com/ai/latest/docs/guides/lazy-tool-discovery) for details, or try it out in the [ts-react-chat example](https://github.com/TanStack/ai/tree/main/examples/ts-react-chat) which includes three lazy tools with test prompts. - ---- - -_TanStack AI is an open-source, provider-agnostic AI SDK for building type-safe AI applications. [Get started here.](https://tanstack.com/ai)_ diff --git a/src/blog/tanstack-ai-middleware.md b/src/blog/tanstack-ai-middleware.md deleted file mode 100644 index b1f5d24cf..000000000 --- a/src/blog/tanstack-ai-middleware.md +++ /dev/null @@ -1,443 +0,0 @@ ---- -title: 'TanStack AI Just Got Middleware — And It Changes Everything' -published: 2026-03-12 -authors: - - Alem Tuzlak ---- - -![TanStack AI Middleware](/blog-assets/tanstack-ai-middleware/header.webp) - -If you've ever built a production AI application, you know the pain. Your `chat()` call starts simple — then you need logging, then content filtering, then tool caching, then rate limiting, then an audit trail... and suddenly your clean server endpoint is a 200-line monster with deeply nested try/catch blocks. - -TanStack AI now ships a **first-class middleware system** for the `chat()` function. It's composable, type-safe, and comes with batteries included via the new `@tanstack/ai/middlewares` subpath export. - -Let's dive in. - -## The Shape of a Middleware - -A middleware is just an object with optional hooks. No classes, no inheritance, no decorators — just a plain object that satisfies the `ChatMiddleware` interface: - -```typescript -import type { ChatMiddleware } from '@tanstack/ai' - -const logger: ChatMiddleware = { - name: 'logger', - onStart(ctx) { - console.log( - `[${ctx.requestId}] Chat started — model: ${ctx.model}, provider: ${ctx.provider}`, - ) - }, - onFinish(ctx, info) { - console.log( - `[${ctx.requestId}] Done in ${info.duration}ms — ${info.usage?.totalTokens} tokens`, - ) - }, -} -``` - -Drop it into the `middleware` array and you're done: - -```typescript -import { chat } from '@tanstack/ai' -import { openaiText } from '@tanstack/ai-openai' - -const stream = chat({ - adapter: openaiText('gpt-4o'), - messages: [{ role: 'user', content: 'Explain middleware to me' }], - middleware: [logger], -}) -``` - -No wrapping, no monkey-patching, no provider-specific hacks. - -## The Lifecycle: 12 Hooks, Zero Guesswork - -The middleware system exposes hooks at every meaningful point in the `chat()` lifecycle: - -``` -chat() called - → onConfig (phase: 'init') // transform config before anything runs - → onStart // one-time setup - ┌─ ITERATION LOOP ──────────────────────────────────────┐ - │ → onConfig (phase: 'beforeModel') // tweak config per iteration │ - │ → onIteration // observe iteration boundary │ - │ → onChunk (for every streamed chunk) │ - │ → onBeforeToolCall → [tool executes] → onAfterToolCall │ - │ → onToolPhaseComplete // all tools done this round │ - │ → onUsage // token counts │ - └────────────────────────────────────────────────────────┘ - → onFinish / onAbort / onError // exactly ONE fires -``` - -Every hook receives a rich `ChatMiddlewareContext` with `requestId`, `iteration`, `chunkIndex`, current `messages`, and two powerful control functions: **`abort()`** to stop the run, and **`defer()`** to register non-blocking side effects that run after streaming completes. - -## What Middleware Enables - -Before we look at code, let's talk about what this actually unlocks. - -### Transform Anything the Model Sees - -`onConfig` fires at two critical moments — once at startup (`phase: 'init'`) and once before every model call (`phase: 'beforeModel'`). Return a partial config and it's shallow-merged in. You can change `messages`, `systemPrompts`, `tools`, `temperature`, `maxTokens`, `metadata`, or `modelOptions` — per request, per iteration, conditionally. - -This means you can inject tenant-specific system prompts based on who's making the request. You can strip tools out after the first iteration so the model stops looping. You can bump temperature on retries. All without touching your adapter or your tool definitions. - -When multiple middleware define `onConfig`, the config is **piped** through them in order — each one sees the merged result of the previous. So you can layer concerns: one middleware handles auth-based prompt injection, another handles tool filtering, a third adjusts model parameters. They compose naturally. - -### Intercept Every Streamed Chunk - -`onChunk` gives you access to every piece of data the adapter yields. You can observe it, transform it, expand it into multiple chunks, or drop it entirely by returning `null`. - -This is where content filtering lives. Redact PII before it reaches the client. Strip out markdown formatting your UI doesn't support. Inject synthetic chunks to add custom metadata to the stream. If a previous middleware drops a chunk, downstream middleware never see it — the pipeline is clean. - -### Control Tool Execution Without Touching Tools - -`onBeforeToolCall` and `onAfterToolCall` wrap every tool invocation. Before a tool runs, you can: - -- **Pass through** — return `void`, the tool runs normally -- **Transform arguments** — return `{ type: 'transformArgs', args }` to rewrite what the tool receives -- **Skip execution** — return `{ type: 'skip', result }` to short-circuit with a synthetic result (this is how caching works) -- **Abort the entire run** — return `{ type: 'abort', reason }` to stop everything - -This is **first-win** composition: the first middleware that returns a non-void decision wins, and the rest are skipped for that call. After execution, `onAfterToolCall` fires on all middleware with timing data, success/failure status, and the result or error. - -`onToolPhaseComplete` fires after _all_ tool calls in an iteration are done, giving you aggregate data — what completed, what needs user approval, what needs client-side execution. This is where you'd implement batch-level validation or summary logging. - -### Track Token Spend in Real Time - -`onUsage` fires once per model iteration with `promptTokens`, `completionTokens`, and `totalTokens`. Combined with `ctx.iteration`, you can build cumulative budgets, per-model cost tracking, or real-time spend dashboards without any external instrumentation. - -### Abort from Anywhere - -`ctx.abort(reason)` is available in every hook. Call it and the run stops gracefully — `onAbort` fires as the terminal hook with the reason and duration. This is how you implement timeouts, budget limits, content policy violations, or any "stop everything" signal. - -### Fire-and-Forget Side Effects - -`ctx.defer(promise)` registers a non-blocking promise that executes _after_ the terminal hook. It never blocks streaming. This is the right pattern for analytics, audit logs, webhook notifications, or database writes that shouldn't add latency to the user's response. - -### Thread Request-Scoped Data - -The `context` option on `chat()` is an opaque value that flows into `ctx.context` on every hook. Pass in your auth token, tenant ID, feature flags, or any request-scoped data — middleware reads it without coupling to your HTTP framework. - -## Composition: Order Matters (But Predictably) - -Middleware compose cleanly in array order with well-defined semantics: - -```typescript -middleware: [authMiddleware, guardMiddleware, cacheMiddleware, loggerMiddleware] -``` - -| Hook | Composition Model | What "order" means | -| ------------------ | ----------------- | ----------------------------------------------------------- | -| `onConfig` | **Piped** | Each middleware transforms config, next one sees the result | -| `onChunk` | **Piped** | Chunks flow through each middleware in sequence | -| `onBeforeToolCall` | **First-win** | First non-void decision wins, rest are skipped | -| Everything else | **Sequential** | All run in order, no short-circuiting | - -This means you can stack a content guard _before_ a logger and the logger only sees the redacted output. Or put a rate limiter _before_ a cache and the cache never stores rate-limited calls. The ordering is explicit, the rules are simple, and there are no surprises. - -## Built-in Middleware: `@tanstack/ai/middlewares` - -The new subpath export ships two production-ready middlewares. You don't need to write these yourself — they're tree-shakeable, so unused ones don't end up in your bundle. - -### `toolCacheMiddleware` — Never Re-Execute the Same Tool Call - -If your agent calls `getWeather({ city: "Berlin" })` three times in a conversation, do you really want to hit the API three times? - -```typescript -import { chat } from '@tanstack/ai' -import { toolCacheMiddleware } from '@tanstack/ai/middlewares' - -const stream = chat({ - adapter, - messages, - tools: [weatherTool, stockTool], - middleware: [ - toolCacheMiddleware({ - ttl: 60_000, // expire after 60s - maxSize: 50, // LRU eviction at 50 entries - toolNames: ['getWeather'], // only cache weather lookups - }), - ], -}) -``` - -Under the hood, it uses `onBeforeToolCall` to check the cache and returns `{ type: 'skip', result }` on a hit — the tool never executes. On a miss, `onAfterToolCall` stores the result. Failed calls are never cached. - -**Custom cache keys** let you ignore irrelevant arguments: - -```typescript -toolCacheMiddleware({ - keyFn: (toolName, args) => { - const { page, ...rest } = args as Record - return JSON.stringify([toolName, rest]) // ignore pagination - }, -}) -``` - -**Pluggable storage** means you can swap the in-memory LRU map for Redis, a database, or anything with `getItem`/`setItem`/`deleteItem`: - -```typescript -import { createClient } from 'redis' -import { - toolCacheMiddleware, - type ToolCacheStorage, -} from '@tanstack/ai/middlewares' - -const redis = createClient() - -const redisStorage: ToolCacheStorage = { - getItem: async (key) => { - const raw = await redis.get(`tool-cache:${key}`) - return raw ? JSON.parse(raw) : undefined - }, - setItem: async (key, value) => { - await redis.set(`tool-cache:${key}`, JSON.stringify(value)) - }, - deleteItem: async (key) => { - await redis.del(`tool-cache:${key}`) - }, -} - -const stream = chat({ - adapter, - messages, - tools: [weatherTool], - middleware: [toolCacheMiddleware({ storage: redisStorage, ttl: 60_000 })], -}) -``` - -### `contentGuardMiddleware` — Real-Time Stream Redaction - -Your model just streamed back a user's SSN. Your model just leaked an internal API key. Your model included PII in a customer-facing response. - -```typescript -import { contentGuardMiddleware } from '@tanstack/ai/middlewares' - -const guard = contentGuardMiddleware({ - rules: [ - // Regex rules: pattern + replacement - { pattern: /\b\d{3}-\d{2}-\d{4}\b/g, replacement: '[SSN REDACTED]' }, - { pattern: /sk-[a-zA-Z0-9]{48}/g, replacement: '[API KEY REDACTED]' }, - - // Function rules: full control - { - fn: (text) => - text.replace( - /\b[A-Z0-9._%+-]+@company\.internal\b/gi, - '[EMAIL REDACTED]', - ), - }, - ], - strategy: 'buffered', // catches patterns that span chunk boundaries - bufferSize: 60, // hold back 60 chars to catch cross-boundary matches - onFiltered: (info) => { - console.warn(`Content filtered in message ${info.messageId}`) - }, -}) -``` - -Two strategies are available: - -- **`delta`** — applies rules to each chunk as it arrives. Zero added latency, but patterns split across chunk boundaries might slip through. -- **`buffered`** (default) — accumulates content and applies rules to settled portions, holding back a configurable look-behind buffer. Catches cross-boundary patterns at the cost of a tiny delay. - -Set `blockOnMatch: true` to drop entire chunks when any rule matches instead of replacing: - -```typescript -contentGuardMiddleware({ - rules: [{ pattern: /CONFIDENTIAL/gi, replacement: '' }], - blockOnMatch: true, // if the word appears, the chunk is gone -}) -``` - -## Ideas: What You Could Build - -The middleware system is deliberately low-level and composable. Here are patterns that fall right out of the hook design. - -### Per-Iteration Tool Swapping - -Expose different tool sets at different stages of the agent loop — let the model search first, then unlock write tools: - -```typescript -const progressiveTools: ChatMiddleware = { - name: 'progressive-tools', - onConfig(ctx, config) { - if (ctx.phase !== 'beforeModel') return - - if (ctx.iteration === 0) { - return { tools: config.tools.filter((t) => t.name === 'search') } - } - // After search results come back, unlock everything - }, -} -``` - -### Token Budget Enforcement - -Track cumulative usage and abort when you've spent enough: - -```typescript -function tokenBudget(maxTokens: number): ChatMiddleware { - let total = 0 - return { - name: 'token-budget', - onUsage(ctx, usage) { - total += usage.totalTokens - if (total > maxTokens) { - ctx.abort(`Token budget exhausted: ${total}/${maxTokens}`) - } - }, - } -} -``` - -### Deferred Analytics (Non-Blocking) - -Fire-and-forget side effects that never slow down streaming: - -```typescript -const analytics: ChatMiddleware = { - name: 'analytics', - onFinish(ctx, info) { - ctx.defer( - fetch('/api/analytics', { - method: 'POST', - body: JSON.stringify({ - requestId: ctx.requestId, - model: ctx.model, - provider: ctx.provider, - duration: info.duration, - tokens: info.usage?.totalTokens, - toolCount: ctx.toolNames?.length ?? 0, - }), - }), - ) - }, -} -``` - -### Dangerous Tool Guard - -Intercept tool calls and block the ones you don't trust: - -```typescript -const dangerousToolGuard: ChatMiddleware = { - name: 'dangerous-tool-guard', - onBeforeToolCall(ctx, hookCtx) { - const blocked = ['deleteUser', 'dropTable', 'sendEmail'] - if (blocked.includes(hookCtx.toolName)) { - return { - type: 'abort', - reason: `Blocked dangerous tool: ${hookCtx.toolName}`, - } - } - }, -} -``` - -### Tenant-Aware Prompt Injection - -Thread request-scoped data through middleware via `context`: - -```typescript -// Server endpoint -const stream = chat({ - adapter, - messages, - middleware: [tenantMiddleware], - context: { tenantId: req.auth.tenantId, userId: req.auth.userId }, -}) - -// Middleware reads it -const tenantMiddleware: ChatMiddleware = { - name: 'tenant', - onConfig(ctx, config) { - const { tenantId } = ctx.context as { tenantId: string } - return { - systemPrompts: [ - ...config.systemPrompts, - `You are an assistant for tenant ${tenantId}. Follow their policies.`, - ], - } - }, -} -``` - -### Stacking It All Together - -The real power is composition. Here's what a production setup might look like: - -```typescript -import { chat } from '@tanstack/ai' -import { openaiText } from '@tanstack/ai-openai' -import { - toolCacheMiddleware, - contentGuardMiddleware, -} from '@tanstack/ai/middlewares' - -const stream = chat({ - adapter: openaiText('gpt-4o'), - messages: req.body.messages, - tools: [searchTool, weatherTool, calendarTool], - context: { tenantId: req.auth.tenantId }, - middleware: [ - // 1. Inject tenant system prompt - tenantMiddleware, - // 2. Guard dangerous tools before anything else - dangerousToolGuard, - // 3. Redact PII from the stream - contentGuardMiddleware({ - rules: [ - { pattern: /\b\d{3}-\d{2}-\d{4}\b/g, replacement: '[SSN REDACTED]' }, - ], - }), - // 4. Cache expensive tool calls - toolCacheMiddleware({ ttl: 120_000 }), - // 5. Enforce token budget - tokenBudget(50_000), - // 6. Log everything (sees redacted output, not raw) - analytics, - ], -}) -``` - -Six concerns. Six middleware. Zero coupling between them. The order is explicit and the composition rules are predictable. - -## DevTools Integration - -Middleware events are wired into TanStack DevTools out of the box. Every hook execution, config transformation, and chunk transformation emits structured events via `@tanstack/ai-event-client`. The new **Iteration Timeline** and **Iteration Card** UI components let you visually trace what happened at each step of the agent loop — which middleware fired, how long each hook took, and what was transformed. - -This isn't just logging. It's a full timeline view of your middleware pipeline, per iteration, in real time. - -## Getting Started - -```bash -pnpm add @tanstack/ai -``` - -All middleware types are exported from the main package: - -```typescript -import type { - ChatMiddleware, - ChatMiddlewareContext, - ChatMiddlewareConfig, - BeforeToolCallDecision, - AfterToolCallInfo, - FinishInfo, - AbortInfo, - ErrorInfo, - UsageInfo, -} from '@tanstack/ai' -``` - -Built-in middleware lives in the tree-shakeable subpath: - -```typescript -import { - toolCacheMiddleware, - contentGuardMiddleware, -} from '@tanstack/ai/middlewares' -``` - -The full middleware documentation is available in the [TanStack AI Middleware Guide](https://tanstack.com/ai/latest/docs/guides/middleware). diff --git a/src/blog/tanstack-ai-realtime-voice-chat.md b/src/blog/tanstack-ai-realtime-voice-chat.md deleted file mode 100644 index b42875dfd..000000000 --- a/src/blog/tanstack-ai-realtime-voice-chat.md +++ /dev/null @@ -1,559 +0,0 @@ ---- -title: 'Talk to Your AI: Realtime Voice Chat in TanStack AI' -published: 2026-03-12 -authors: - - Alem Tuzlak ---- - -![Talk to Your AI: Realtime Voice Chat in TanStack AI](/blog-assets/tanstack-ai-realtime-voice-chat/header.webp) - -Text-based chat is table stakes. The next wave of AI applications is conversational — real voice, real time, with the AI hearing you, thinking, and responding as naturally as a phone call. TanStack AI now ships first-class support for **realtime voice conversations**, with a clean provider-agnostic architecture, client-side tool execution, multimodal input, and a React hook that makes the whole thing feel like building a form. - -Two providers are supported out of the box: **OpenAI Realtime** (via WebRTC) and **ElevenLabs** (via WebSocket). The adapter system means more providers can slot in without touching your application code. - -## The Architecture: Tokens on the Server, Connections on the Client - -Realtime voice chat has a fundamental constraint that text chat doesn't: the audio stream connects **directly from the browser to the provider**. You can't proxy a WebRTC session through your server. But you also can't ship your API key to the client. - -TanStack AI solves this with a **token/connection split**: - -1. Your server generates a short-lived ephemeral token using `realtimeToken()` — this never exposes your API key -2. Your client uses that token to establish a direct connection via a provider-specific adapter -3. Audio capture, playback, tool execution, and state management all happen client-side through `useRealtimeChat` - -The token is the only thing that crosses your server boundary. Everything else is a direct browser-to-provider stream. - -## Server Side: One Function, Any Provider - -The server-side surface is intentionally tiny. Generate a token, return it to the client: - -```typescript -import { realtimeToken } from '@tanstack/ai' -import { openaiRealtimeToken } from '@tanstack/ai-openai' - -// In your API route / server function -const token = await realtimeToken({ - adapter: openaiRealtimeToken({ - model: 'gpt-4o-realtime-preview', - }), -}) - -// Return `token` to the client -``` - -For ElevenLabs, swap the adapter: - -```typescript -import { elevenlabsRealtimeToken } from '@tanstack/ai-elevenlabs' - -const token = await realtimeToken({ - adapter: elevenlabsRealtimeToken({ - agentId: process.env.ELEVENLABS_AGENT_ID!, - }), -}) -``` - -That's the entire server-side implementation. The token adapters handle the provider-specific session creation (OpenAI's `/v1/realtime/sessions` endpoint, ElevenLabs' signed URL generation) and return a uniform `RealtimeToken` with `token`, `expiresAt`, and `config`. The client auto-refreshes tokens before they expire. - -## Client Side: `useRealtimeChat` - -The React hook is where the magic happens. It manages the entire connection lifecycle, audio capture/playback, voice activity detection, tool execution, message state, and audio visualization — all behind a single hook: - -```typescript -import { useRealtimeChat } from '@tanstack/ai-react' -import { openaiRealtime } from '@tanstack/ai-openai' - -function VoiceChat() { - const { - // Connection - status, // 'idle' | 'connecting' | 'connected' | 'reconnecting' | 'error' - error, - connect, - disconnect, - - // Conversation - mode, // 'idle' | 'listening' | 'thinking' | 'speaking' - messages, - pendingUserTranscript, - pendingAssistantTranscript, - - // Voice control - startListening, - stopListening, - interrupt, - - // Input - sendText, - sendImage, - - // Audio visualization - inputLevel, - outputLevel, - } = useRealtimeChat({ - getToken: () => fetch('/api/realtime-token').then((r) => r.json()), - adapter: openaiRealtime(), - voice: 'alloy', - instructions: 'You are a helpful voice assistant. Keep responses concise.', - }) - - return ( -
-

Status: {status} | Mode: {mode}

- - {status === 'idle' ? ( - - ) : ( - - )} - - {mode === 'speaking' && ( - - )} -
- ) -} -``` - -That's a working voice chat. The hook requests microphone access on connect, streams audio to the provider, plays back the AI's response, tracks transcripts in real time, and tears everything down on disconnect or unmount. - -## What `mode` Tells You - -The `mode` state gives you a single value that describes what's happening in the conversation right now: - -| Mode | What's Happening | -| ----------- | -------------------------------------------------- | -| `idle` | Silence — no one is speaking | -| `listening` | The user is speaking and the AI is hearing them | -| `thinking` | The AI received input and is generating a response | -| `speaking` | The AI is producing audio output | - -This is enough to build responsive UI indicators — pulsing microphone icons, thinking spinners, speaking animations — without managing multiple boolean flags. - -## Voice Activity Detection: Three Modes - -How does the system know when the user starts and stops talking? That's voice activity detection (VAD), and TanStack AI supports three modes: - -```typescript -useRealtimeChat({ - // ... - vadMode: 'server', // Provider detects speech server-side (default) - vadMode: 'semantic', // Uses semantic understanding for turn boundaries (OpenAI only) - vadMode: 'manual', // You control start/stop via startListening() / stopListening() -}) -``` - -**Server VAD** is the simplest — the provider handles everything. **Semantic VAD** (OpenAI only) uses the model's understanding of conversation flow to decide when the user is done speaking, controlled by the `semanticEagerness` option (`'low'`, `'medium'`, `'high'`). **Manual** mode gives you full control for push-to-talk UIs: - -```typescript -function PushToTalk() { - const { connect, startListening, stopListening, mode } = useRealtimeChat({ - getToken: () => fetch('/api/realtime-token').then((r) => r.json()), - adapter: openaiRealtime(), - vadMode: 'manual', - autoCapture: false, - }) - - return ( - - ) -} -``` - -## Tools: The Same Definitions, Running on the Client - -The realtime system uses TanStack AI's isomorphic `toolDefinition()` system. Define your tool once with Zod schemas, implement it with `.client()`, and pass it directly to `useRealtimeChat`: - -```typescript -import { toolDefinition } from '@tanstack/ai' -import { z } from 'zod' - -const getCurrentTime = toolDefinition({ - name: 'getCurrentTime', - description: 'Get the current date and time.', - inputSchema: z.object({ - timezone: z.string().optional(), - }), - outputSchema: z.object({ - time: z.string(), - date: z.string(), - timezone: z.string(), - }), -}).client(({ timezone }) => { - const tz = timezone || Intl.DateTimeFormat().resolvedOptions().timeZone - const now = new Date() - return { - time: now.toLocaleTimeString('en-US', { timeZone: tz }), - date: now.toLocaleDateString('en-US', { - weekday: 'long', - year: 'numeric', - month: 'long', - day: 'numeric', - timeZone: tz, - }), - timezone: tz, - } -}) - -const getWeather = toolDefinition({ - name: 'getWeather', - description: 'Get the current weather for a location.', - inputSchema: z.object({ - location: z.string(), - }), - outputSchema: z.object({ - location: z.string(), - temperature: z.number(), - condition: z.string(), - }), -}).client(async ({ location }) => { - const res = await fetch( - `/api/weather?location=${encodeURIComponent(location)}`, - ) - return res.json() -}) -``` - -Then pass them in: - -```typescript -useRealtimeChat({ - getToken: () => fetch('/api/realtime-token').then((r) => r.json()), - adapter: openaiRealtime(), - tools: [getCurrentTime, getWeather], - instructions: `You are a voice assistant with access to tools. - You can tell the user the time and check the weather. - Keep responses concise since this is voice.`, -}) -``` - -When the AI decides to call a tool, the `RealtimeClient` executes it locally in the browser, sends the result back to the provider, and the AI continues talking with the tool's output. The user hears a natural response — "It's currently 72 degrees and sunny in San Francisco" — with no visible round-trip. - -## Multimodal Input: Text and Images Alongside Voice - -Voice is the primary input, but you're not limited to it. `sendText()` lets users type when voice isn't practical, and `sendImage()` (OpenAI only) lets users share images for the AI to see and discuss: - -```typescript -function MultimodalChat() { - const { sendText, sendImage, status } = useRealtimeChat({ /* ... */ }) - - const handleImageUpload = (e: React.ChangeEvent) => { - const file = e.target.files?.[0] - if (!file) return - - const reader = new FileReader() - reader.onload = () => { - const base64 = (reader.result as string).split(',')[1]! - sendImage(base64, file.type) - } - reader.readAsDataURL(file) - } - - return ( -
- {/* Text fallback */} -
{ - e.preventDefault() - const input = e.currentTarget.elements.namedItem('msg') as HTMLInputElement - sendText(input.value) - input.value = '' - }}> - - -
- - {/* Image input */} - -
- ) -} -``` - -The user can be mid-conversation by voice, snap a photo, send it, and ask "What's in this image?" — all within the same realtime session. - -## Audio Visualization - -The hook exposes audio levels and raw frequency/time-domain data for building visualizations: - -```typescript -const { - inputLevel, // 0-1 normalized microphone volume - outputLevel, // 0-1 normalized speaker volume - getInputFrequencyData, // Uint8Array — FFT frequency bins - getOutputFrequencyData, - getInputTimeDomainData, // Uint8Array — waveform samples - getOutputTimeDomainData, -} = useRealtimeChat({ - /* ... */ -}) -``` - -`inputLevel` and `outputLevel` update on every animation frame while connected — use them for simple volume bars: - -```typescript -
-
-
-``` - -For waveform or frequency visualizations, use the raw data getters with a canvas: - -```typescript -function Waveform({ getData }: { getData: () => Uint8Array }) { - const canvasRef = useRef(null) - - useEffect(() => { - let frameId: number - function draw() { - const canvas = canvasRef.current - if (!canvas) return - const ctx = canvas.getContext('2d')! - const data = getData() - - ctx.clearRect(0, 0, canvas.width, canvas.height) - ctx.beginPath() - ctx.strokeStyle = '#22c55e' - ctx.lineWidth = 2 - - const sliceWidth = canvas.width / data.length - let x = 0 - for (let i = 0; i < data.length; i++) { - const y = (data[i]! / 255) * canvas.height - i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y) - x += sliceWidth - } - ctx.stroke() - frameId = requestAnimationFrame(draw) - } - draw() - return () => cancelAnimationFrame(frameId) - }, [getData]) - - return -} - -// Usage - - -``` - -## Live Transcripts - -While the user or assistant is speaking, you get streaming transcription via `pendingUserTranscript` and `pendingAssistantTranscript`. These update in real time as speech is recognized and are cleared when the final message is committed to `messages`: - -```typescript -{pendingUserTranscript && ( -

{pendingUserTranscript}...

-)} - -{pendingAssistantTranscript && ( -

{pendingAssistantTranscript}...

-)} -``` - -Final messages land in the `messages` array as `RealtimeMessage` objects with typed `parts` — `text`, `audio` (with transcript), `image`, `tool-call`, and `tool-result`: - -```typescript -messages.map((msg) => ( -
- {msg.parts.map((part, i) => { - if (part.type === 'audio') return

{part.transcript}

- if (part.type === 'text') return

{part.content}

- if (part.type === 'image') return - return null - })} - {msg.interrupted && (interrupted)} -
-)) -``` - -## Interruptions - -Users can interrupt the AI mid-sentence — just start talking (with server/semantic VAD) or call `interrupt()` programmatically. The AI stops speaking, the interrupted message is marked with `interrupted: true`, and the conversation continues naturally. The `onInterrupted` callback fires so you can update UI state: - -```typescript -useRealtimeChat({ - // ... - onInterrupted: () => { - console.log('User interrupted the AI') - }, -}) -``` - -## Session Configuration - -The full set of session options covers everything you need to tune the voice experience: - -```typescript -useRealtimeChat({ - getToken: () => fetch('/api/realtime-token').then((r) => r.json()), - adapter: openaiRealtime(), - - // Personality - instructions: 'You are a pirate. Respond in pirate speak.', - voice: 'coral', // alloy, ash, ballad, coral, echo, sage, shimmer, verse - - // Generation - temperature: 0.9, // 0.6–1.2 for OpenAI realtime - maxOutputTokens: 500, - - // Output control - outputModalities: ['audio', 'text'], // or just ['text'] for text-only responses - - // VAD - vadMode: 'semantic', - semanticEagerness: 'medium', // low = waits longer, high = responds faster - - // Audio - autoPlayback: true, // auto-play AI audio (default: true) - autoCapture: true, // request mic on connect (default: true) - - // Tools - tools: [getCurrentTime, getWeather], - - // Callbacks - onConnect: () => console.log('Connected'), - onDisconnect: () => console.log('Disconnected'), - onMessage: (msg) => console.log('New message:', msg), - onModeChange: (mode) => console.log('Mode:', mode), - onError: (err) => console.error('Error:', err), - onInterrupted: () => console.log('Interrupted'), -}) -``` - -## Switching Providers at Runtime - -Because adapters are just objects, you can switch providers based on user choice without restructuring your code: - -```typescript -function VoiceChat({ provider }: { provider: 'openai' | 'elevenlabs' }) { - const adapter = - provider === 'openai' ? openaiRealtime() : elevenlabsRealtime() - - const { status, connect, disconnect, messages, mode } = useRealtimeChat({ - getToken: () => - fetch('/api/realtime-token', { - method: 'POST', - body: JSON.stringify({ provider }), - }).then((r) => r.json()), - adapter, - voice: 'alloy', - }) - - // Same UI regardless of provider - // ... -} -``` - -The server token endpoint picks the right adapter too: - -```typescript -// Server -async function handleTokenRequest(provider: string) { - if (provider === 'openai') { - return realtimeToken({ - adapter: openaiRealtimeToken({ model: 'gpt-4o-realtime-preview' }), - }) - } - if (provider === 'elevenlabs') { - return realtimeToken({ - adapter: elevenlabsRealtimeToken({ - agentId: process.env.ELEVENLABS_AGENT_ID!, - }), - }) - } - throw new Error(`Unknown provider: ${provider}`) -} -``` - -## Using the Client Directly (Without React) - -If you're not using React — or need lower-level control — the `RealtimeClient` class from `@tanstack/ai-client` provides the same functionality without framework coupling: - -```typescript -import { RealtimeClient } from '@tanstack/ai-client' -import { openaiRealtime } from '@tanstack/ai-openai' - -const client = new RealtimeClient({ - getToken: () => fetch('/api/realtime-token').then((r) => r.json()), - adapter: openaiRealtime(), - instructions: 'You are a helpful assistant.', - voice: 'alloy', - tools: [getCurrentTime, getWeather], - onStatusChange: (status) => console.log('Status:', status), - onModeChange: (mode) => console.log('Mode:', mode), - onMessage: (msg) => console.log('Message:', msg), -}) - -// Connect -await client.connect() - -// Listen to state changes -const unsub = client.onStateChange((state) => { - console.log('Pending transcript:', state.pendingUserTranscript) -}) - -// Send text when voice isn't available -client.sendText('What time is it?') - -// Send an image (OpenAI only) -client.sendImage(base64Data, 'image/png') - -// Interrupt the AI -client.interrupt() - -// Manual VAD control -client.startListening() -client.stopListening() - -// Access audio visualization -console.log(client.audio?.inputLevel) - -// Clean up -await client.disconnect() -client.destroy() -``` - -This is how you'd integrate realtime voice into Solid, Vue, Svelte, or any other framework — wrap the `RealtimeClient` in your framework's reactivity primitives. - -## Ideas: What You Could Build - -The realtime system gives you the building blocks. Here's what falls out of them: - -**Voice-controlled dashboards** — "Show me last week's revenue" triggers a tool that queries your analytics API. The AI reads back the numbers while the dashboard updates in real time. - -**Multimodal customer support** — users describe a problem by voice, send a screenshot, and the AI sees both. Tool calls look up their account, check order status, or file a ticket — all executed client-side. - -**Language tutoring** — semantic VAD with low eagerness gives students time to think. The AI listens patiently, then responds with corrections. `pendingUserTranscript` shows what's being heard so students can self-correct. - -**Accessibility interfaces** — voice in, voice out, with text transcripts for deaf-accessible screen reading. `outputModalities: ['audio', 'text']` gives you both simultaneously. - -**Field data collection** — a technician inspects equipment, describes what they see, sends photos, and the AI logs structured data via tool calls. Push-to-talk with `vadMode: 'manual'` works in noisy environments. - -## Getting Started - -```bash -# Core + React hook -pnpm add @tanstack/ai @tanstack/ai-client @tanstack/ai-react - -# Pick your provider -pnpm add @tanstack/ai-openai # OpenAI Realtime (WebRTC) -pnpm add @tanstack/ai-elevenlabs # ElevenLabs (WebSocket) -``` - -Set your API key in the environment: - -```bash -OPENAI_API_KEY=sk-... -# or -ELEVENLABS_API_KEY=... -``` - -The full documentation is available in the [Realtime Voice Chat Guide](https://tanstack.com/ai/latest/docs/guides/realtime-chat). diff --git a/src/blog/tanstack-ai-the-ai-function-postmortem.md b/src/blog/tanstack-ai-the-ai-function-postmortem.md deleted file mode 100644 index 2991b54c0..000000000 --- a/src/blog/tanstack-ai-the-ai-function-postmortem.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: 'The ai() Function That Almost Was' -published: 2025-12-26 -authors: - - Alem Tuzlak ---- - -![The ai() Function That Almost Was](/blog-assets/tanstack-ai-the-ai-function-postmortem/header.jpg) - -We spent eight days building an API we had to kill. Here's what happened. - -## The Dream - -One function to rule them all. One function to control all adapters. One function to make it all typesafe. - -```ts -import { ai } from '@tanstack/ai' -import { openaiText, openaiImage, openaiSummarize } from '@tanstack/ai-openai' - -// text generation -ai({ - adapter: openaiText('gpt-4'), - // ... text options -}) - -// image generation -ai({ - adapter: openaiImage('dall-e-3'), - // ... image options -}) - -// summarization -ai({ - adapter: openaiSummarize('gpt-4'), - // ... summary options -}) -``` - -Simple. Single function. Powers everything AI-related. Clear naming. You're using AI. Types constrained to each adapter's capabilities. Pass image options to an image adapter, text options to a text adapter. - -Change models? Type errors if something's not supported. Change adapters? Type errors if something's not supported. - -It felt powerful. Switching between adapters was fast. We were excited. - -It was a failure. - -## Why It Failed - -Two things killed it: complexity and tree-shaking. - -### The Complexity Trap - -The simplicity of `ai()` for end users hid enormous implementation complexity. - -**Attempt 1: Function Overloads** - -We tried using function overloads to constrain each adapter's options. Too many scenarios. The overloads resolved to wrong signatures. You could end up providing video options instead of image options. We got it to 99% working, but the 1% felt wrong and was a bigger hurdle than you'd think. - -Having 10+ overloads is cumbersome. Get the order wrong and it all falls apart. This would exponentially increase the difficulty of contributions and lowered our confidence in shipping stable releases. - -**Attempt 2: Pure Inference** - -We tried TypeScript inference instead. It actually worked. Everything inferred perfectly. Types constrained to models. Life was good. Coconuts were rolling on the beach. - -But the inference code was 50-100 lines just to cover text, image, and audio. It would grow with more modalities and grow again with type safety improvements. After thorough analysis it was almost impossible to reason about. A single glance and understanding was out the window. - -We'll take complexity on our side over forcing you to use `as` casts or `any` types. But where this API completely failed was in our options factories. - -### The aiOptions Nightmare - -We added a `createXXXOptions` API. `createTextOptions`, `createImageOptions`, etc. You can construct options as ready-made agents and pass them into functions, overriding what you need. - -To match the theme, we called it `aiOptions`. It would constrain everything to the modality and provider: - -```ts -const opts = aiOptions({ - adapter: openaiText('gpt-4'), -}) - -ai(opts) -``` - -Here's where we hit the wall. - -When `aiOptions` returned readonly values, spreading into `ai()` worked. But `aiOptions` was loosely typed. You could pass anything in. - -When we fixed `aiOptions` to accept only valid properties, the spread would cast the `ai()` function to `any`. Then it would accept anything. - -We went in circles. Get one part working, break another. Fix that, break the first thing. - -I believe it could have been done. Our approach was probably just wrong. Some subtle bug in the system causing everything to break. But that proves the point: it was too complex to wrap your head around and find the root cause. Any fix would have to propagate through all the adapters. Very costly. - -We spent almost a week trying to get this API to work perfectly. We couldn't. Maybe another week would have done it. But then what? How would we fix bugs in this brittle type system? How would we find root causes? - -Even if we'd gotten it working, there was another problem. - -### Tree-Shaking - -We'd just split our adapters into smaller pieces so bundlers could tree-shake what you don't use. Then we put all that complexity right back into `ai()`. - -We don't want to be the lodash of AI libraries, bundling everything you don't use and calling it a day. If a huge adapter that bundles everything is not okay, a single function that does the same thing is definitely not okay. - -## The Warnings We Missed - -Here's the part that stings. - -### LLMs Couldn't Write It - -We wrestled with the API for six days before reverting, then two more days to unwind it. Eight days total. - -The warning sign we missed? LLMs couldn't reliably generate code for this API. - -Think about that. We're building tools for AI, and AI couldn't figure out how to use them. That should have been a massive clue that humans wouldn't reliably write to this API unaided either. - -LLMs like function names that indicate what the thing does. `ai()`? Who knows. `generateImage()`? Crystal clear. - -When we finally asked the LLMs directly what they thought of the API, they were 4-0 against `ai()` and for the more descriptive approach we ended up with. - -### Agents Hid the Pain - -We used agents to do the implementation work. That hid the struggle from us. - -If we'd been writing the code by hand, we would have _felt_ the challenge of wrestling with the types. That probably would have stopped the idea early. - -LLMs won't bark when you tell them to do crazy stuff. They won't criticize your designs unless you ask them to. They just try. And try. And eventually produce something that technically works but shouldn't exist. - -### We Skipped the Vetting - -We were so confident in the design that we didn't make an RFC. Didn't get external feedback. Didn't run it by the LLMs themselves. - -This is the classic trap. Smart people in a room, design something cool, pat each other on the backs, not realizing they left off a key detail or two. Go build the simple new thing, and it turns into a nightmare. - -These situations are almost unavoidable. The only optimization is to cut them off early. Which we could have done if we'd: - -1. Written code by hand before automating it -2. Asked the LLMs what they thought of the API -3. Made an RFC and gotten feedback -4. Noticed that the agents were struggling - -## What We Explored Instead - -Before landing on separate functions, we tried one more thing: an adapter with sub-properties. - -```ts -const adapter = openai() -adapter.image('model') -adapter.text('model') -``` - -Looks nicer. Feels more unified. Same problem: still bundles everything. - -We could have done custom bundling in TanStack Start to strip unused parts, but we don't want to force you to use our framework for the best experience. This library is for the web ecosystem, not just TanStack users. - -## Where We Landed - -Separate functions. `chat()`, `generateImage()`, `generateSpeech()`, `generateTranscription()`. - -```ts -import { chat } from '@tanstack/ai' -import { openaiText } from '@tanstack/ai-openai' - -chat({ - adapter: openaiText('gpt-4'), - temperature: 0.6, -}) -``` - -It's not as clever. That's the point. - -You know what `chat()` does. You know what `generateImage()` does. LLMs know what they do. Your bundle only includes what you import. The types are simple enough to reason about. - -Like a lot of things in life, there has to be compromise between complexity, DX, and UX. We decided to keep the core simple, split features into separate bundles, and make modalities easy to pull in or ignore. - -## Lessons - -1. **If LLMs can't write to your API, reconsider.** It's a signal that humans will struggle too. - -2. **Don't let agents hide the pain.** Write code by hand before automating. Feel the friction yourself. - -3. **Vet designs externally.** RFC it. Get feedback. Ask the LLMs what they think. - -4. **Simple and clear beats clever.** APIs shouldn't surprise you. Function names should say what they do. - -5. **Cut early.** These traps are almost unavoidable. The win is recognizing them fast. - -We loved the `ai()` API. We built it. We had to kill it. That's how it goes sometimes. - ---- - -_Ready to try what we shipped instead? Read [TanStack AI Alpha 2: Every Modality, Better APIs, Smaller Bundles](/blog/tanstack-ai-alpha-2)._ diff --git a/src/blog/tanstack-ai-why-we-split-the-adapters.md b/src/blog/tanstack-ai-why-we-split-the-adapters.md deleted file mode 100644 index af2180fc6..000000000 --- a/src/blog/tanstack-ai-why-we-split-the-adapters.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: 'TanStack AI: Why We Split the Adapters' -published: 2026-01-02 -authors: - - Alem Tuzlak ---- - -![TanStack AI: Why We Split the Adapters](/blog-assets/tanstack-ai-why-we-split-the-adapters/header.jpeg) - -With the latest release we brought a major architectural change to how we do adapters. Instead of one monolithic adapter that does everything, we split into smaller adapters. Each in charge of a single functionality. - -Here's why. - -## The Problem - -We need to support: - -- Text generation -- Audio generation -- Video generation -- Text-to-speech -- Transcription -- Summarization -- And more to come - -We're a small team. We don't have infinite funds or a lot of people to help iterate and add functionalities. We can't afford mistakes that slow us down. The adapters for providers are the biggest bottleneck in the whole process, so getting this part right was crucial. - -We were trying to solve three things: bundle splitting, ease of development, and a better type system. - -## Bundle Splitting - -We don't want to give you a single function that bundles every possible functionality into your code, leaving kilobytes of data you never even use. - -The fix was straightforward: break up the monolith into micro-adapters. As every enterprise knows, this is the answer to all business problems. Split it into micro-services. Or in our case, micro-adapters. - -After the split, the single `openai` function turned into `openaiText`, `openaiImage`, `openaiSummarize`, and so on. You choose what you need. We give you the adapter to plug. - -## Ease of Development - -Imagine the old approach at scale: - -1. Support 30 different adapters -2. Add image functionality -3. Update all 30 adapters that extend `BaseAdapter` to bring in image support -4. Make sure all of them work - -That would take months to ship. - -Here's how it looks with split adapters: - -1. Support 30 different adapters -2. Add a new `BaseImageAdapter` -3. Update however many adapters we want (1 or 30) to export an image adapter with the implemented functionality -4. Incrementally roll out support for adapters we don't include in the initial release - -This approach lets us be incremental and minimal in the surface area we impact. Supporting new functionalities becomes trivial because we don't have the overhead of adding it to every adapter at once. - -We can move fast, add new features, and incrementally roll out support as the ecosystem grows. External contributors can add image support for the adapters they need by opening a PR with a few hundred lines of code. We can review it faster and merge it faster. - -## Better Type System - -Our `BaseAdapter` monolith had already grown to 7 type generics. And it only supported chat. - -Now imagine adding all the other functionalities. We'd probably end up somewhere close to 20-30 generics. Good luck implementing a new adapter for a provider we don't support yet. - -With the new approach, the generics max out at 3. It's easy to add new adapters. This lets external contributors help us out, and it lets us move through adapters with less complexity and in less time. - -## What We Explored Instead - -One idea was to create an adapter with sub-properties: - -```ts -const adapter = openai() -adapter.image('model') -adapter.text('model') -``` - -Looks nicer. Feels more split. Same problem. It still bundles everything. - -We could have used a custom bundling approach in TanStack Start to strip unused parts from the bundle. But we don't want to force you to use our framework for the best experience. This library is for the web ecosystem, not just TanStack users. That approach was out of the question. - -## Where We Landed - -We aimed to make TanStack AI easier for both maintainers and the community to get involved. We pulled it off. - -The adapters are easy to make, easy to maintain, and easy to reason about. Your bundle size stays minimal. Our productivity stays high. - -Out of all the possible outcomes, this one is the best. We're confident in the direction. We're confident you'll enjoy it too. - ---- - -_See it in action: [TanStack AI Alpha 2: Every Modality, Better APIs, Smaller Bundles](/blog/tanstack-ai-alpha-2)_ diff --git a/src/blog/tanstack-db-0.1-the-embedded-client-database-for-tanstack-query.md b/src/blog/tanstack-db-0.1-the-embedded-client-database-for-tanstack-query.md index 960399080..dbb829b94 100644 --- a/src/blog/tanstack-db-0.1-the-embedded-client-database-for-tanstack-query.md +++ b/src/blog/tanstack-db-0.1-the-embedded-client-database-for-tanstack-query.md @@ -1,5 +1,5 @@ --- -title: Stop Re-Rendering. TanStack DB, the Embedded Client Database for TanStack Query +title: Stop Re-Rendering — TanStack DB, the Embedded Client Database for TanStack Query published: 2025-07-30 authors: - Kyle Mathews @@ -10,11 +10,11 @@ authors: **Your React dashboard shouldn't grind to a halt** just because one TODO turns from ☐ to ☑. Yet every optimistic update still kicks off a cascade of re-renders, filters, useMemos and spinner flashes. -If you’ve ever muttered “**why is this still so hard in 2025?**”, same. +If you’ve ever muttered “**why is this still so hard in 2025?**”—same. TanStack DB is our answer: a client-side database layer powered by differential dataflow that plugs straight into your existing useQuery calls. -It recomputes only what changed, **0.7 ms to update one row in a sorted 100k collection** on an M1 Pro ([CodeSandbox](https://codesandbox.io/p/sandbox/bold-noyce-jfz9fs)) +It recomputes only what changed—**0.7 ms to update one row in a sorted 100k collection** on an M1 Pro ([CodeSandbox](https://codesandbox.io/p/sandbox/bold-noyce-jfz9fs)) One early-alpha adopter, building a Linear-like application, swapped out a pile of MobX code for TanStack DB and told us with relief, “everything is now completely instantaneous when clicking around the app, even w/ 1000s of tasks loaded.” @@ -83,17 +83,17 @@ Today most teams face an ugly fork in the road: **Option B. Load-everything-and-filter** (simple backend, sluggish client). -Differential dataflow unlocks **Option C: load normalized collections once, let TanStack DB stream millisecond-level incremental joins in the browser**. No rewrites, no spinners, no jitter. +Differential dataflow unlocks **Option C—load normalized collections once, let TanStack DB stream millisecond-level incremental joins in the browser**. No rewrites, no spinners, no jitter. -**Live queries, effortless optimistic writes, and a radically simpler architecture**, all incrementally adoptable. +**Live queries, effortless optimistic writes, and a radically simpler architecture**—all incrementally adoptable. _[Try out the TanStack DB Starter](https://github.com/TanStack/db/tree/main/examples/react/projects)_ ## So what’s happening under the hood? -TanStack DB keeps a **normalized collection store** in memory, then uses **differential dataflow** to update query results incrementally. Think of it like Materialize-style streaming SQL, except embedded in the browser and hooked straight into React Query’s cache. +TanStack DB keeps a **normalized collection store** in memory, then uses **differential dataflow** to update query results incrementally. Think of it like Materialize-style streaming SQL—except embedded in the browser and hooked straight into React Query’s cache. -- **Collections** wrap your existing `useQuery` calls (REST, tRPC, GraphQL, WebSocket, doesn’t matter). Do you sync data some other way? [Build a custom collection](https://tanstack.com/db/latest/docs/guides/collection-options-creator). +- **Collections** wrap your existing `useQuery` calls (REST, tRPC, GraphQL, WebSocket—doesn’t matter). Do you sync data some other way? [Build a custom collection](https://tanstack.com/db/latest/docs/guides/collection-options-creator). - **Transactions** let you mutate those collections optimistically; failures roll back automatically. - **Live queries** declare _what_ data you need; TanStack DB streams only the rows that change, in < 1 ms. @@ -251,23 +251,23 @@ const Todos = () => { TanStack Query is incredibly popular with 12m (and counting) downloads per week. So why make something new like TanStack DB? -Query solves the hardest problems of server state management: intelligent caching, background synchronization, request deduplication, optimistic updates, and seamless error handling. +Query solves the hardest problems of server state management — intelligent caching, background synchronization, request deduplication, optimistic updates, and seamless error handling. It's become the de facto standard because it eliminates the boilerplate and complexity of managing async data fetching while providing an excellent developer experience with features like automatic background refetching, stale-while-revalidate patterns, and powerful DevTools. -But Query treats data as isolated cache entries. Each query result is independent, there's no concept of relationships, live queries across multiple data sources, or reactive updates when one piece of data affects another. **You can't easily ask "show me all todos where the project status is active"** and watch the list update automatically when a project flips status. +But Query treats data as isolated cache entries. Each query result is independent—there's no concept of relationships, live queries across multiple data sources, or reactive updates when one piece of data affects another. **You can't easily ask "show me all todos where the project status is active"** and watch the list update automatically when a project flips status. TanStack DB fills this gap. While Query excels at fetching and caching server state, DB provides the missing reactive, relational layer on top. You get the best of both worlds: Query's robust server state management plus TanStack DB’s embedded client database that can join, filter, and reactively update across your entire data graph. -But it doesn’t just improve your current setup. It enables a new radically simplified architecture. +But it doesn’t just improve your current setup — it enables a new radically simplified architecture. ## TanStack DB enables a radically simplified architecture Let's revisit the three options: -**Option A. View-Specific APIs**: Create view-specific API endpoints that return exactly what each component needs. Clean, fast, zero client-side processing. But now you're drowning in brittle API routes, dealing with network waterfalls when components need related data, and creating tight coupling between your frontend views and backend schemas. +**Option A — View-Specific APIs**: Create view-specific API endpoints that return exactly what each component needs. Clean, fast, zero client-side processing. But now you're drowning in brittle API routes, dealing with network waterfalls when components need related data, and creating tight coupling between your frontend views and backend schemas. -**Option B. Load-everything-and-filter**: Load broader datasets and filter/process them client-side. Fewer API calls, more flexible frontend. But you slam into the performance wall: `todos.filter()`, `users.find()`, `posts.map()`, `useMemo()` everywhere, with cascading re-renders destroying your UX. +**Option B — Load-everything-and-filter**: Load broader datasets and filter/process them client-side. Fewer API calls, more flexible frontend. But you slam into the performance wall — `todos.filter()`, `users.find()`, `posts.map()`, `useMemo()` everywhere, with cascading re-renders destroying your UX. Most teams pick Option A to avoid performance problems. You're trading client-side complexity for API proliferation and network dependency. @@ -300,7 +300,7 @@ const projectCollection = createQueryCollection({ queryFn: fetchAllProjects, }) -// Navigation is instant, no new API calls needed +// Navigation is instant — no new API calls needed const { data: activeProjectTodos } = useLiveQuery( (q) => q @@ -330,23 +330,23 @@ Your API becomes simpler. Your network calls drop dramatically. Your frontend ge Companies like Linear, Figma, and Slack load massive datasets into the client and achieve incredible performance through heavy investment in custom indexing, differential updates, and optimized rendering. These solutions are too complex and expensive for most teams to build. -**TanStack DB brings this capability to everyone** through differential dataflow, a technique that only recomputes the parts of queries that actually changed. Instead of choosing between "many fast API calls with network waterfalls" or "few API calls with slow client processing," you get the best of both options: fewer network round-trips AND sub-millisecond client-side queries, even with large datasets. +**TanStack DB brings this capability to everyone** through differential dataflow — a technique that only recomputes the parts of queries that actually changed. Instead of choosing between "many fast API calls with network waterfalls" or "few API calls with slow client processing," you get the best of both options: fewer network round-trips AND sub-millisecond client-side queries, even with large datasets. -This isn't just about sync engines like [Electric (though they make this pattern incredibly powerful)](https://electric-sql.com/blog/2025/07/29/local-first-sync-with-tanstack-db). It's about enabling a fundamentally different data loading strategy that works with any backend: REST, GraphQL, or real-time sync. +This isn't just about sync engines like [Electric (though they make this pattern incredibly powerful)](https://electric-sql.com/blog/2025/07/29/local-first-sync-with-tanstack-db). It's about enabling a fundamentally different data loading strategy that works with any backend — REST, GraphQL, or real-time sync. ## Why are sync engines interesting? While TanStack DB works great with REST and GraphQL, it really shines when paired with sync engines. Here's why sync engines are such a powerful complement: -**Easy real-time**: If you need real-time updates, you know how painful it can be to set up WebSockets, handle reconnections, and wire up event handlers. Many new sync engines are native to your actual data store (e.g., Postgres) so you can simply write to the database directly and know the update will get streamed out to all subscribers in real-time. No more manual WebSocket plumbing. +**Easy real-time** — If you need real-time updates, you know how painful it can be to set up WebSockets, handle reconnections, and wire up event handlers. Many new sync engines are native to your actual data store (e.g., Postgres) so you can simply write to the database directly and know the update will get streamed out to all subscribers in real-time. No more manual WebSocket plumbing. -**Side-effects are pushed automatically**: When you do a backend mutation, there are often cascading updates across multiple tables. Update a todo's status? That might change the project's completion percentage, update team metrics, or trigger workflow automations. With TanStack Query alone, you need manual bookkeeping to track all these potential side-effects and reload the right data. Sync engines eliminate this complexity, any backend change that happens during a mutation is automatically pushed to all clients - without any extra work. +**Side-effects are pushed automatically** — When you do a backend mutation, there are often cascading updates across multiple tables. Update a todo's status? That might change the project's completion percentage, update team metrics, or trigger workflow automations. With TanStack Query alone, you need manual bookkeeping to track all these potential side-effects and reload the right data. Sync engines eliminate this complexity—any backend change that happens during a mutation is automatically pushed to all clients - without any extra work. -**Load far more data efficiently**: It's far cheaper to update data in the client when using sync engines. Instead of re-loading entire collections after each change, sync engines send only the actual changed items. This makes it practical to load far more data upfront, enabling the "load everything once" pattern that makes apps like Linear feel so fast. +**Load far more data efficiently** — It's far cheaper to update data in the client when using sync engines. Instead of re-loading entire collections after each change, sync engines send only the actual changed items. This makes it practical to load far more data upfront, enabling the "load everything once" pattern that makes apps like Linear feel so fast. TanStack DB was designed from the ground up to support sync engines. [When you define a collection, you're provided with an API for writing synced transactions](https://tanstack.com/db/latest/docs/guides/collection-options-creator) from the backend into your local collections. Try out collection implementations for [Electric](https://tanstack.com/db/latest/docs/installation#electric-collection), [Trailblaze](https://tanstack.com/db/latest/docs/installation#trailbase-collection), and [(soon) Firebase](https://github.com/TanStack/db/pull/323)! -DB gives you a common interface for your components to query data, which means you can easily switch between data loading strategies as needed without changing client code. Start with REST, switch to a sync engine later as needed, your components don't need to know the difference. +DB gives you a common interface for your components to query data, which means you can easily switch between data loading strategies as needed without changing client code. Start with REST, switch to a sync engine later as needed—your components don't need to know the difference. ## Our Goals for TanStack DB @@ -358,7 +358,7 @@ We're building TanStack DB to address the client-side data bottlenecks that ever - **Optimistic updates that don't break**: Reliable rollback behavior when network requests fail, without complex custom state management. - **Type and runtime safety throughout**: Full TypeScript inference from your schema to your components, catching data mismatches at compile and runtime. -We're excited about giving teams a fundamentally better way to handle client-side data, while preserving the freedom to choose whatever backend works best. +We're excited about giving teams a fundamentally better way to handle client-side data—while preserving the freedom to choose whatever backend works best. ## What's Next @@ -378,4 +378,4 @@ If your team spends more time optimizing React re-renders than building features - [Try out the TanStack DB Starter](https://github.com/TanStack/db/tree/main/examples/react/projects) - [Join the TanStack Discord](https://tlinz.com/discord) - Direct migration support from the team -No more stutters. No more jank. Stop re-rendering, start shipping! +No more stutters. No more jank. Stop re-rendering—start shipping! diff --git a/src/blog/tanstack-db-0.5-query-driven-sync.md b/src/blog/tanstack-db-0.5-query-driven-sync.md deleted file mode 100644 index f9ce0bce1..000000000 --- a/src/blog/tanstack-db-0.5-query-driven-sync.md +++ /dev/null @@ -1,360 +0,0 @@ ---- -title: TanStack DB 0.5 . Query-Driven Sync -published: 2025-11-12 -authors: - - Sam Willis - - Kevin De Porre - - Kyle Mathews ---- - -![Query-Driven Sync](/blog-assets/tanstack-db-0.5-query-driven-sync/header.png) - -You don't need a new API for every component. With 0.5, the component's query _is_ the API call. - -```tsx -// Your component's query... -const { data: projectTodos } = useLiveQuery((q) => - q - .from({ todos }) - .join({ projects }, (t, p) => eq(t.projectId, p.id)) - .where(({ todos }) => eq(todos.status, 'active')) - .where(({ projects }) => eq(projects.id, 123)), -) - -// ...becomes these precise API calls automatically: -// GET /api/projects/123 -// GET /api/todos?projectId=123&status=active -``` - -No custom endpoint. No GraphQL resolver. No backend change. Just write your query and TanStack DB figures out exactly what to fetch. - -We're releasing TanStack DB 0.5 today with Query-Driven Sync. A feature that fundamentally changes how you think about loading data. - -## Pure queries over data - -React's breakthrough was making components pure functions of state: `UI = f(state)`. You describe what you want to render, React handles the how. - -TanStack DB brings the same philosophy to data: `view = query(collections)`. You describe what data you need. **DB handles the fetching, caching, and updating**, even across 100k+ row datasets. - -```tsx -// Pure view over state -function TodoList({ todos, filter }) { - return todos - .filter((t) => t.status === filter) - .map((t) => ) -} - -// Pure query over data -function TodoList({ filter }) { - const { data: todos } = useLiveQuery( - (q) => - q - .from({ todos: todoCollection }) - .where(({ todos }) => eq(todos.status, filter)), - [filter], - ) - return todos.map((t) => ) -} -``` - -The difference? React recomputes the view when state changes. TanStack DB recomputes the _query_ when data changes. And optimizes the network calls automatically. - -## The reactive client-first store for your API - -TanStack DB is a client-first store for your API powered by [differential dataflow](https://github.com/TimelyDataflow/differential-dataflow). A technique that recomputes only what changed. When you mark a todo complete, DB updates query results in <1ms on a modern laptop, even with 100,000+ rows in memory. - -This isn't just fast filtering. It's **live queries** that incrementally maintain themselves as data changes. **Effortless optimistic mutations** that instantly update all affected queries, then reconcile with the server. And a **normalized collection store** that eliminates duplicate data and keeps everything coherent. - -[When we released TanStack DB 0.1](/blog/tanstack-db-0.1-the-embedded-client-database-for-tanstack-query) in July, we described the two options teams face and that TanStack DB enables a new Option, C: - -> **Option A. View-specific APIs** (fast render, slow network, endless endpoint sprawl) -> -> **Option B. Load-everything-and-filter** (simple backend, sluggish client) -> -> **Option C. Normalized collections + differential dataflow** (load once, query instantly, no jitter) - -## The problem we kept hearing about - -Since we released the first beta in July, we've gotten the same question over and over: - -> This looks great for loading normalized data once, but what if my `users` table has 100,000 rows? I can't load everything. - -They're right. Before 0.5, collections loaded their entire dataset upfront. That works beautifully for many apps with datasets in the thousands of rows, but it's not a one-size-fits-all solution. - -Here's what we realized: **a collection shouldn't dictate what data loads. Your queries should.** - -A collection defines the _schema_ and _security boundaries_ for a data domain. Your live queries define _which subset_ of that domain to load right now. - -## Three sync modes: Pick the right loading strategy - -This led to three sync modes, each optimized for different use cases: - -**Eager mode (default & only mode before v0.5):** Load entire collection upfront. Best for <10k rows of mostly static data: user preferences, small reference tables. - -**On-demand mode:** Load only what queries request. Best for large datasets (>50k rows), search interfaces, catalogs where most data won't be accessed. - -**Progressive mode:** Load query subset immediately, sync full dataset in background. Best for collaborative apps where you want instant first paint AND sub-millisecond queries for everything else. - -Most apps use a mix. Your user profile? Eager. Your products catalog? On-demand. Your shared project workspace? Progressive. - -Let's see how each works. - -## On-demand sync: Your query becomes the API call - -With 0.5, you add one line to your collection: - -```tsx -const productsCollection = createCollection( - queryCollectionOptions({ - queryKey: ['products'], - queryFn: async (ctx) => { - // Parse your query predicates into API parameters - const params = parseLoadSubsetOptions(ctx.meta?.loadSubsetOptions) - - // GET /api/products with query-specific filters - return api.getProducts(params) - }, - syncMode: 'on-demand', // ← New! - }), -) -``` - -Now when you write this query: - -```tsx -const { data: electronics } = useLiveQuery((q) => - q - .from({ product: productsCollection }) - .where(({ product }) => - and(eq(product.category, 'electronics'), lt(product.price, 100)), - ) - .orderBy(({ product }) => product.price, 'asc') - .limit(10), -) -``` - -TanStack DB automatically calls your `queryFn` with: - -``` -GET /api/products?category=electronics&price_lt=100&sort=price:asc&limit=10 -``` - -**No custom API endpoint.** **No GraphQL schema changes.** Just a general-purpose products API that accepts filter parameters. - -Your component's query becomes the API call. - -If you're familiar with Relay or Apollo, this should feel familiar: components declare their data needs, and the framework optimizes fetching and updates. The difference? You get Relay-style normalized caching and automatic updates without GraphQL. Your REST, GraphQL, or tRPC API stays simple, your queries stay powerful, and differential dataflow keeps everything fast client-side. - -## Request Economics: Smarter than it looks - -"Wait," you're thinking, "doesn't this create N+1 query problems?" - -No. And here's why the performance story is actually _better_ than custom APIs. - -### **Automatic request collapsing** - -Multiple components requesting the same data trigger exactly one network call: - -```tsx -// Component A -const { data: active } = useLiveQuery((q) => - q.from({ todos }).where(({ todos }) => eq(todos.status, 'active')), -) - -// Component B (same query, different component) -const { data: active } = useLiveQuery((q) => - q.from({ todos }).where(({ todos }) => eq(todos.status, 'active')), -) - -// Result: ONE network request -// GET /api/todos?status=active -``` - -TanStack DB compares predicates across all live queries and deduplicates requests automatically. - -### **Subset matching and delta loading** - -When you navigate from viewing 10 products to viewing 20, DB doesn't reload everything: - -```tsx -// Initial query: loads 10 products -const { data } = useLiveQuery((q) => q.from({ products }).limit(10)) - -// User clicks "load more": loads ONLY the next 10 -fetchNextPage() -``` - -``` -# Page 1 -GET /api/products?limit=10&offset=0 - -# Page 2 -GET /api/products?limit=10&offset=10 -# NOT: GET /api/products?limit=20 -``` - -Already-loaded rows are reused; only the new window crosses the wire. The collection tracks which predicates it has already satisfied and only fetches the delta. - -### **Join optimization** - -Complex joins don't cause request explosions. They trigger a minimal set of filtered requests: - -```tsx -// Join todos with their projects -const { data } = useLiveQuery((q) => - q - .from({ todos }) - .join({ projects }, (t, p) => eq(t.projectId, p.id)) - .where(({ todos }) => eq(todos.status, 'active')), -) - -// Network calls: -// GET /api/todos?status=active (returns 10 todos) -// GET /api/projects?id_in=123,124,125 (only the 3 unique project IDs) -// -// NOT 10 separate project requests! -``` - -DB analyzes the join to determine exactly which related records are needed, then fetches them in a single batched request. - -### **Respects your cache policies** - -Query Collection integrates with TanStack Query's `staleTime` and `gcTime`: - -```tsx -const productsCollection = createCollection(queryCollectionOptions({ - queryKey: ['products'], - queryFn: fetchProducts, - staleTime: 5 * 60 * 1000, // 5 minutes - syncMode: 'on-demand' -})) - -// First query: network request -useLiveQuery(q => q.from({ products }).where(...)) - -// Same query within 5 minutes: instant, no network -useLiveQuery(q => q.from({ products }).where(...)) - -// Different query within 5 minutes: only fetches the diff -useLiveQuery(q => q.from({ products }).where(...).limit(20)) -``` - -You get TanStack Query's sophisticated caching plus DB's intelligent subset tracking. - -**The result:** Fewer total network requests than custom view-specific APIs, with better cache utilization and zero endpoint sprawl. - -## Progressive sync: Fast initial paint + instant client queries - -On-demand mode is great for search interfaces and catalogs where you'll never touch most of the data. But what about collaborative apps where you _want_ the full dataset client-side for instant queries and offline access, but also want fast first paint? - -That's progressive mode: load what you need immediately, sync everything in the background. - -```tsx -const todoCollection = createCollection( - electricCollectionOptions({ - table: 'todos', - syncMode: 'progressive', - }), -) - -// First query loads immediately (on-demand) -const { data: urgentTodos } = useLiveQuery((q) => - q - .from({ todos: todoCollection }) - .where(({ todos }) => eq(todos.priority, 'urgent')), -) -// ~100ms: Network request for urgent todos only - -// Meanwhile, collection syncs full dataset in background -// After sync completes: all queries run in <1ms client-side -``` - -Now your first query loads in ~100ms with a targeted network request. While the user interacts with that data, the full dataset syncs in the background. Once complete, all subsequent queries (even complex joins and filters) run in sub-millisecond time purely client-side. - -**Progressive mode shines with sync engines** like Electric, Trailbase, and PowerSync. With traditional fetch approaches, loading more data means re-fetching everything, which gets expensive fast. But sync engines only send deltas (the actual changed rows), making it cheap to maintain large client-side datasets. You get instant queries over 10,000s of rows without the network cost of repeatedly fetching all that data. - -With REST APIs, progressive mode is less common since updates generally require full re-fetches. But for sync engines, it's often the sweet spot: fast first paint + instant everything else. - -## Works today with REST. Gets better with sync engines. - -Query-Driven Sync is designed to work with your existing REST, GraphQL, or tRPC APIs. No backend migration required: just map your predicates to your API's parameters (as shown below) and you're done. - -For teams using sync engines like [Electric](https://electric-sql.com), [Trailbase](https://trailbase.io/), or [PowerSync](https://www.powersync.com/), you get additional benefits: - -- **Real-time updates** via streaming (no polling required) -- **Automatic predicate translation** (no manual mapping needed) -- **Delta-only syncing** (only changed rows cross the wire) - -For example, Electric translates your client query directly into Postgres queries, applies authorization rules, and streams updates. Your component's query becomes a secure, real-time, authorized Postgres query, no API endpoint needed. - -Collections abstract the data source. Start with REST. Upgrade to sync when you need real-time. - -## How Query Collection predicate mapping works - -Query Collection is designed for REST, GraphQL, tRPC, and any other API-based backend. When you enable `syncMode: 'on-demand'`, TanStack DB automatically passes your query predicates (where clauses, orderBy, limit) to your `queryFn` as expression trees in `ctx.meta.loadSubsetOptions`. You write the mapping logic once to translate these into your API's format. - -We provide helper functions to make this straightforward: - -```tsx -queryFn: async (ctx) => { - // Parse expression trees into a simple format - const { filters, sorts, limit } = parseLoadSubsetOptions( - ctx.meta?.loadSubsetOptions, - ) - - // Map to your REST API's query parameters - const params = new URLSearchParams() - filters.forEach(({ field, operator, value }) => { - if (operator === 'eq') params.set(field.join('.'), String(value)) - else if (operator === 'lt') - params.set(`${field.join('.')}_lt`, String(value)) - // Map other operators as needed - }) - if (limit) params.set('limit', String(limit)) - - return fetch(`/api/products?${params}`).then((r) => r.json()) -} -``` - -For APIs with custom formats (like GraphQL), use `parseWhereExpression` with custom handlers: - -```tsx -queryFn: async (ctx) => { - const { where, orderBy, limit } = ctx.meta?.loadSubsetOptions - - // Map to GraphQL's where clause format - const whereClause = parseWhereExpression(where, { - handlers: { - eq: (field, value) => ({ [field.join('_')]: { _eq: value } }), - lt: (field, value) => ({ [field.join('_')]: { _lt: value } }), - and: (...conditions) => ({ _and: conditions }), - }, - }) - - // Use whereClause in your GraphQL query... -} -``` - -You write this mapping once per collection. After that, every query automatically generates the right API calls. - -**Can't modify your API?** Your mapping doesn't need to be precise. Many queries can map to a single broad API call. For example, any product search query with category "hardware" could map to `GET /api/products?category=hardware`. TanStack DB will apply the remainder of the query client-side. As your API evolves to support more predicates, your client code doesn't change: just update the mapping to push down more filters. Start broad, optimize incrementally. - -[Full Query Collection predicate mapping documentation →](https://tanstack.com/db/latest/docs/collections/query-collection#queryfn-and-predicate-push-down) - -## Shipping toward 1.0 - -Query-Driven Sync (0.5) completes the core vision: intelligent loading that adapts to your queries, instant client-side updates via differential dataflow, and seamless persistence back to your backend. We're targeting 1.0 for December 2025, focusing on API stability and comprehensive docs. - -**This is new. We need early adopters.** Query-Driven Sync works and ships today, but it's fresh. If you try it, we'd love your feedback on rough edges or API improvements. Join us in [Discord](https://discord.gg/tanstack) or open [GitHub issues](https://github.com/TanStack/db/issues). - -If you have ideas for new collection types based on Query-Driven Sync, please reach out. The interface is very powerful and we have lots of interesting ideas for how it can be used. - -### Try it today - -```bash -npm install @tanstack/react-db@latest -``` - ---- - -Collections define schemas and security boundaries. Queries define what loads and when. Your components define UIs. Finally, each concern is separate. And your data layer adapts to how you actually use it. diff --git a/src/blog/tanstack-router-route-matching-tree-rewrite.md b/src/blog/tanstack-router-route-matching-tree-rewrite.md deleted file mode 100644 index addc75215..000000000 --- a/src/blog/tanstack-router-route-matching-tree-rewrite.md +++ /dev/null @@ -1,230 +0,0 @@ ---- -title: How we accidentally made route matching more performant by aiming for correctness -published: 2025-11-18 -authors: - - Florian Pellet ---- - -![Big performance number](/blog-assets/tanstack-router-route-matching-tree-rewrite/header.png) - -We achieved a 20,000× performance improvement in route matching in TanStack Router. Let's be honest, this is _definitely_ cherry-picked, but the number is real and comes from a real production application. More importantly, it shows that matching a pathname to a route is no longer bottlenecked by the number of routes in your application. - -## The Real Problem: correctness, not speed - -One big responsibility of a router is to match a given URL pathname (e.g., `/users/123`) to a route definition (e.g., `/users/$userId`). This is deceptively complex when you consider all the different types of route segments (static, dynamic, optional, wildcard) and the priority rules that govern which route should match first. - -Our previous route matching algorithm was based on a sorted flat list of all routes, iterating through each to find a match. As we added more features like optional segments and wildcards, the algorithm became increasingly complex and slow, and we started receiving reports of incorrect matches. Our sorting did not adhere to a strict weak ordering, the sorting logic was not well-defined and even behaved differently between Chrome and Firefox. - -We opted for a complete rewrite. - -## A Segment Trie - -We now parse the route tree into a segment trie, and matching is done by traversing this trie. This makes it much simpler to implement exact matching rules while ensuring high performance. - -A trie ([wikipedia](https://en.wikipedia.org/wiki/Trie)) is a tree structure where each node corresponds to the common string prefix shared by all of the node's children. The concept maps very well to a representation of the routes in an app, where each node is a URL pathname segment. - -Given a single route `/users/$id`, our segment trie would look like this: - -``` -root -└── users - └── $id => match /users/$id -``` - -Adding more routes gives a more complete picture: - -``` -/users/$id -/users/$id/posts -/users/profile -/posts/$slug -``` - -This yields the following tree: - -``` -root -├── users -│ ├── $id => match /users/$id -│ │ └── posts => match /users/$id/posts -│ └── profile => match /users/profile -└── posts - └── $slug => match /posts/$slug -``` - -To match `/users/123`, we: - -1. Start at root, look for "users" → found -2. Move to users node, look for "123" → matches $id pattern -3. Check if this node has a route → yes, return `/users/$id` - -## Algorithmic Complexity - -The reason we can get such a massive performance boost is because we changed which variable drives the complexity of the algorithm. The bigger the route tree, the bigger the performance gain. - -- Old approach: `O(N)` where `N` is the number of routes in the tree. -- New approach: `O(M)` where `M` is the number of segments in the pathname. - -(This is simplified, in practice it's more like `O(N * M)` vs. `O(M * log(N))` in the average case, but the point is that we changed which variable dominates the complexity.) - -Using this new tree structure, each check eliminates a large number of possible routes, allowing us to quickly zero in on the correct match. - -For example, imagine we have a route tree with 450 routes (fairly large app) and the tree can only eliminate 50% of routes at each segment check (this is unusually low, it's often much higher). With this bad setup, we have found a match in 9 checks (`2**9 > 450`). By contrast, the old approach _could_ have found the match on the first check, but in the worst case it would have had to check all 450 routes, which yields an average of 225 checks. Even in this simplified case, we are looking at a 25× performance improvement. - -This is what makes tree structures so powerful. - -In practice, we have observed: - -- Small apps (10 routes): 60× faster -- Big apps (450 routes): 10,000× faster - -These are lower than 20,000×, but they are still insane numbers. - -## Fun Implementation Details - -Beyond choosing the right data structures, working on performance is usually about avoiding death by a thousand cuts: avoiding memory allocations, skipping work, … Here are some of the fun implementation details that helped us get to these numbers. - -### Backwards Stack Processing - -We use a stack to manage our traversal of the tree, because the presence of dynamic segments (`/$required`, `/{-$optional}`, `/$` wildcards) means we may have multiple possible paths to explore at each segment. - -The ideal algorithm would be depth-first search (DFS) in order of highest priority, so that we can return as soon as we find a match. In practice, we have very few possibilities of early exit; but a fully static path should still be able to return immediately. - -To accomplish this, we use an array as the stack. We know that `.push()` and `.pop()` at the end of an array are O(1) operations, while `.shift()` and `.unshift()` from the start are O(N), and we want to avoid the latter entirely. At each segment, we iterate candidates in _reverse_ order of priority, pushing them onto the stack. This way, when we pop from the stack, we get the highest priority candidates first. - -```ts -const stack = [ - {/*initial frame*/} -] -while (stack.length) { - const frame = stack.pop() - - // search through lowest priority children first (wildcards) - // search through them in reverse order - for (let i = frame.wildcards.length - 1; i >= 0; i--) { - if (matches(...)) { - stack.push({/*next frame*/}) - } - } - - // then optional segments - for (let i = frame.optionals.length - 1; i >= 0; i--) { - if (matches(...)) { - stack.push({/*next frame*/}) - } - } - - // ... static segments last -} -``` - -### Bitmasking for Optional Segments - -Optional segments introduce additional complexity, as they can be present or absent in the URL. While walking the tree, we need to track which optional segments were skipped (i.e. we need an array of booleans). - -Every time we push onto the stack, we need to store the "state at which to pick up from" including which optional segments were skipped. But we don't want to have to `[...copy]` an array of booleans every time we push onto the stack as it would create many short-lived allocations. - -To avoid this overhead, we use bitmasking to represent skipped optional segments. - -For example, consider a route with two optional segments: `/{-$users}/{-$id}`. We can represent the presence of these segments with a bitmask: - -- `00`: no segments skipped -- `01`: only `{-$users}` skipped -- `10`: only `{-$id}` skipped -- `11`: both segments skipped - -To write to the bitmask, we use bitwise operators: - -```ts -const next = skipped | (1 << depth) // mark segment at 'depth' as skipped -``` - -And to read from the bitmask: - -```ts -if (skipped & (1 << depth)) // segment at 'depth' was skipped -``` - -The downside is that this limits us to 32 segments, because in JavaScript bitwise operations cast a number into a 32-bit integer. Optional segments beyond that point will never be considered skipped. We could switch to a `BigInt` if needed, but for now, this feels reasonable. - -### Reusing Typed Arrays for Segment Parsing - -When building the segment trie, we need to parse each route (e.g., `/users/$userId/{-$maybe}`) into its constituent segments (e.g. `static:users`, `dynamic:userId`, `optional:maybe`). Doing this is basically running the same parsing algorithms hundreds of times, every time extracting the same structured data (i.e. segment type, value, prefix, suffix, where the next segment starts, etc). - -Instead of re-creating a new object every time, we can reuse the same object across all parsing operations to avoid allocations in the hot path. - -```ts -const data = { kind: 0, prefixEnd: 0, suffixStart: 0, nextCursor: 0 } -do { - parseSegment(path, data) - // ... -} while (data.nextCursor) -``` - -Technically, we can push this even further by using a `Uint16Array` to store the data, which is more memory efficient and faster to access than object properties. And TypeScript handles this very well, so we don't need to type the buffer or even initialize it. - -```ts -let data -let cursor = 0 -while (cursor < path.length) { - data = parseSegment(path, cursor, data) - cursor = data[5] - // ^? let data: Segment -} - -type Segment = Uint16Array & {0: SegmentKind, 1: number, 2: number, ... } -function parseSegment( - path: string, - cursor: number, - data: Uint16Array = new Uint16Array(6) -): Segment -``` - -### Least Recently Used (LRU) Caching - -Because the route tree is static after initialization, a URL pathname will always yield the same match result. This makes this an ideal candidate for caching. - -```ts -const cache = new Map() -function match(pathname: string): MatchResult { - const cached = cache.get(pathname) - if (cached) return cached - const result = performMatch(pathname) - cache.set(pathname, result) - return result -} -``` - -With a cache, we only need to do the expensive matching operation once per unique pathname. Subsequent requests for the same pathname will be served from the cache, which is O(1). - -However, as we have seen before, some apps can have a very large number of unique routes, which means even more unique pathnames (e.g., route `/user/$id` is matched by `/user/1`, `/user/2`, etc). To prevent unbounded memory growth, we implement a Least Recently Used (LRU) cache. When the cache reaches a certain size, it automatically evicts the least recently used entries. - -[See implementation.](https://github.com/TanStack/router/blob/f830dffb7403819ea984017bb919b4a8708f24a5/packages/router-core/src/lru-cache.ts) - -This data structure performs about half as well as a regular `Object` for writes, and on par with an `Object` for reads. This is a trade-off we are willing to make to avoid unbounded memory growth. - -![benchmark results for LRU cache vs Object vs Map](/blog-assets/tanstack-router-route-matching-tree-rewrite/lru-benchmark.png) - -## The full story - -The numbers we have presented so far are impressive. They are also cherry-picked from the biggest apps we tested, which is biased in favor of the new algorithm. And they are comparisons against the old, uncached algorithm. In reality, we added caching a while ago. We can see the full progression over the last 4 months: - -![route matching performance over 4 evolutions of the algorithm](/blog-assets/tanstack-router-route-matching-tree-rewrite/matching-evolution-benchmark.png) - -And besides that, they also focus on a small part of the router's performance profile. Matching a pathname to a route is only one part of the job. If we look at a more "complete" operation, for example `buildLocation`, which involves matching, building the location object, interpolating the path, passing the validation functions, running the middlewares, etc, we see a more modest but still significant improvement: - -![buildLocation performance over 4 evolutions of the algorithm](/blog-assets/tanstack-router-route-matching-tree-rewrite/buildlocation-evolution-benchmark.png) - -Even the smallest apps see some improvement here, but it might not feel as dramatic. We will continue to optimize the other parts of the router to make it feel as snappy as we can. The good news is route matching is no longer a bottleneck. - -## Going even further - -While we are very happy with these results (and are probably done optimizing route matching for now), there are still some avenues we could explore to push this even further: - -- **sub-segment nodes**: currently, each node in the trie represents a full URL segment (between slashes). We could further break down segments into sub-segments (e.g., prefix, dynamic part, suffix) to allow for much better branch elimination. This is what [`find-my-way`](https://github.com/delvedor/find-my-way) does (the router behind [Fastify](https://www.fastify.io/)), and it yields impressive results. - -- **branch compression**: we could also expand in the other direction, and have tree nodes that represent multiple segments at once, when there is no branching (usually, for a series of static segments). This would reduce the depth of the tree and the number of stack frames we need to process. - ---- - -This wasn't a "let's make it faster" project, it was a "let's make it correct" project that happened to yield massive performance improvements as a side effect. We rarely see numbers this large in real benchmarks, so we hope you’ll forgive a bit of cherry-picking in this post. diff --git a/src/blog/tanstack-router-typescript-performance.md b/src/blog/tanstack-router-typescript-performance.md index 06b31a140..8c3d754dc 100644 --- a/src/blog/tanstack-router-typescript-performance.md +++ b/src/blog/tanstack-router-typescript-performance.md @@ -79,11 +79,8 @@ export type ParseRoute = TRouteTree extends { ? unknown extends TChildren ? TAcc : TChildren extends ReadonlyArray - ? ParseRoute - : ParseRoute< - TChildren[keyof TChildren], - TAcc | TChildren[keyof TChildren] - > + ? ParseRoute + : ParseRoute : TAcc ``` diff --git a/src/blog/why-tanstack-start-and-router.md b/src/blog/why-tanstack-start-and-router.md index 602622441..008cc83d4 100644 --- a/src/blog/why-tanstack-start-and-router.md +++ b/src/blog/why-tanstack-start-and-router.md @@ -9,65 +9,65 @@ authors: Building modern web applications is no small feat. The frameworks and tools we choose can make or break not only our developer experience but also the success of the applications we build. While there are many great frameworks out there, I believe **TanStack Router** and **TanStack Start** stand apart for their ability to solve the challenges developers face today and their readiness for what’s coming tomorrow. -These aren’t just another set of tools. They represent a commitment to building better apps with less friction and more joy. Here’s why I think you’ll love working with them as much as I do. +These aren’t just another set of tools—they represent a commitment to building better apps with less friction and more joy. Here’s why I think you’ll love working with them as much as I do. ### Type Safety You Can Rely On -Type safety isn’t just a buzzword. it’s a foundational tool for creating robust, maintainable applications. TanStack Router goes beyond the basics to offer **contextual type safety**, where types flow seamlessly through every part of your app. Route definitions, parameters, navigation, and even state management all work together with fully inferred types. +Type safety isn’t just a buzzword—it’s a foundational tool for creating robust, maintainable applications. TanStack Router goes beyond the basics to offer **contextual type safety**, where types flow seamlessly through every part of your app. Route definitions, parameters, navigation, and even state management all work together with fully inferred types. What does this mean for you? It means no more guessing if you’ve defined a parameter correctly, no more debugging mismatched types, and no need for extra plugins or AST transformations to fill in the gaps. TanStack Router works with TypeScript’s natural architecture, making the experience smooth, predictable, and delightful. -This level of type safety doesn’t just save time. It builds confidence. And it’s something I believe other frameworks will spend years trying to catch up to. +This level of type safety doesn’t just save time—it builds confidence. And it’s something I believe other frameworks will spend years trying to catch up to. ### Unlock the Power of URL State Management -One of the most overlooked but powerful tools in web development is the URL. It’s the original state management system: fast, shareable, and intuitive. Yet, many frameworks treat the URL as an afterthought, offering only basic utilities for reading and writing state. +One of the most overlooked but powerful tools in web development is the URL. It’s the original state management system—fast, shareable, and intuitive. Yet, many frameworks treat the URL as an afterthought, offering only basic utilities for reading and writing state. -TanStack Router flips that script. Managing state in the URL isn’t just supported. it’s encouraged. With intuitive APIs, you can validate, read, and update search parameters with type safety and runtime validation baked in. Want to create a deeply nested, dynamic filter system or synchronize your app’s state with the URL? It’s effortless. +TanStack Router flips that script. Managing state in the URL isn’t just supported—it’s encouraged. With intuitive APIs, you can validate, read, and update search parameters with type safety and runtime validation baked in. Want to create a deeply nested, dynamic filter system or synchronize your app’s state with the URL? It’s effortless. -But this isn’t just about developer convenience. it’s about creating better user experiences. When your app state lives in the URL, users can share it, bookmark it, and pick up right where they left off. TanStack Router makes that as easy as it should be. +But this isn’t just about developer convenience—it’s about creating better user experiences. When your app state lives in the URL, users can share it, bookmark it, and pick up right where they left off. TanStack Router makes that as easy as it should be. ### Familiar Patterns, More Flexibility If you’ve worked with Remix or Next.js, you’ll find plenty of familiar concepts in TanStack Start. But familiarity doesn’t mean compromise. We’ve taken some of the best ideas from those frameworks and pushed them further, stripping away the constraints and introducing more flexibility. -For example, routing patterns and server function integrations will feel natural if you’re coming from a server-first framework like Remix, but they’re designed to work just as well for traditional client-side SPAs. You don’t have to pick a side. you get the best of both worlds, with fewer trade-offs. +For example, routing patterns and server function integrations will feel natural if you’re coming from a server-first framework like Remix, but they’re designed to work just as well for traditional client-side SPAs. You don’t have to pick a side—you get the best of both worlds, with fewer trade-offs. ### Built for the Future (and Already Embracing It) -The web is changing fast. With React Server Components (RSCs) on the horizon, React 19 introducing new patterns, and streaming becoming the standard for data delivery, frameworks need to do more than just keep up. They need to lead. +The web is changing fast. With React Server Components (RSCs) on the horizon, React 19 introducing new patterns, and streaming becoming the standard for data delivery, frameworks need to do more than just keep up—they need to lead. -TanStack Start is ready for what’s next. RSCs are treated as another server-side state, with powerful primitives for caching, invalidating, and composing them into your application. Streaming isn’t an afterthought. it’s baked into the core of how TanStack works, giving you tools to incrementally send data and HTML to the client without extra complexity. +TanStack Start is ready for what’s next. RSCs are treated as another server-side state, with powerful primitives for caching, invalidating, and composing them into your application. Streaming isn’t an afterthought—it’s baked into the core of how TanStack works, giving you tools to incrementally send data and HTML to the client without extra complexity. But we’re not just about future-proofing. TanStack Start also makes these advanced capabilities approachable and usable today. You don’t need to wait for the “next big thing” to start building apps that feel like the future. ### SPAs Aren’t Dead (We’re Just Making Them Better) -There’s a lot of talk about server-first architectures these days, and while they’re exciting, they’re not the whole story. Single Page Applications (SPAs) are still an incredible way to build fast, interactive apps. Especially when done right. +There’s a lot of talk about server-first architectures these days, and while they’re exciting, they’re not the whole story. Single Page Applications (SPAs) are still an incredible way to build fast, interactive apps—especially when done right. -TanStack Start doesn’t just keep SPAs viable. It makes them better. With simplified patterns, powerful state management, and deep integrations, you can build SPAs that are more performant, easier to maintain, and a joy to use. Whether you’re working server-first, client-first, or somewhere in between, TanStack gives you the tools to build the app you want. +TanStack Start doesn’t just keep SPAs viable—it makes them better. With simplified patterns, powerful state management, and deep integrations, you can build SPAs that are more performant, easier to maintain, and a joy to use. Whether you’re working server-first, client-first, or somewhere in between, TanStack gives you the tools to build the app you want. ### Data Integration Like No Other If you’ve used **TanStack Query**, you already know how much it simplifies data-fetching. But the integration between TanStack Query and TanStack Router is where the magic really happens. Prefetching data, caching results, and streaming updates are all seamless, intuitive, and built to scale. -For example, you can prefetch data in a route loader, stream it down to the client, and hydrate it on demand. All with a single API. Whether you’re managing a simple blog or a complex dashboard, you’ll find yourself spending less time wiring up data and more time building features. +For example, you can prefetch data in a route loader, stream it down to the client, and hydrate it on demand—all with a single API. Whether you’re managing a simple blog or a complex dashboard, you’ll find yourself spending less time wiring up data and more time building features. -This isn’t just an integration. it’s a partnership between routing and data-fetching that makes everything else feel clunky by comparison. +This isn’t just an integration—it’s a partnership between routing and data-fetching that makes everything else feel clunky by comparison. ### Routing That Scales -Routing isn’t just a utility. it’s the backbone of every application. And yet, most routers struggle when things get complex. That’s where TanStack Router shines. It’s built to handle everything from a handful of simple routes to thousands of deeply nested ones without breaking a sweat. +Routing isn’t just a utility—it’s the backbone of every application. And yet, most routers struggle when things get complex. That’s where TanStack Router shines. It’s built to handle everything from a handful of simple routes to thousands of deeply nested ones without breaking a sweat. Features like type-safe navigation, hierarchical route contexts, and advanced state synchronization make it easy to build apps that scale in both size and complexity. And because TanStack Router works natively with TypeScript, you get all the benefits of type safety without sacrificing performance or flexibility. ### Always Innovating -What excites me most about TanStack is that we’re just getting started. From isomorphic server functions to powerful caching primitives and streamlined React Server Component support, we’re constantly pushing the boundaries of what’s possible. Our goal isn’t just to build great tools. it’s to build tools that help _you_ build better apps. +What excites me most about TanStack is that we’re just getting started. From isomorphic server functions to powerful caching primitives and streamlined React Server Component support, we’re constantly pushing the boundaries of what’s possible. Our goal isn’t just to build great tools—it’s to build tools that help _you_ build better apps. ### Settle for “Good Enough”? -Other frameworks have their strengths, but if you’re looking for tools that are innovative, flexible, and deeply integrated, TanStack Router and Start are in a league of their own. They’re not just solving today’s problems. They’re helping you build apps that are ready for tomorrow. +Other frameworks have their strengths, but if you’re looking for tools that are innovative, flexible, and deeply integrated, TanStack Router and Start are in a league of their own. They’re not just solving today’s problems—they’re helping you build apps that are ready for tomorrow. So why wait? Explore [TanStack Router](https://tanstack.com/router) and [TanStack Start](https://tanstack.com/start) today, and see how much better app development can be. diff --git a/src/builder/api/compile.ts b/src/builder/api/compile.ts deleted file mode 100644 index 1d629f823..000000000 --- a/src/builder/api/compile.ts +++ /dev/null @@ -1,373 +0,0 @@ -import { - createApp, - createMemoryEnvironment, - finalizeAddOns, - populateAddOnOptionsDefaults, - computeAttribution, - type AddOn, - type Starter, - type LineAttribution as CtaLineAttribution, - type AttributedFile as CtaAttributedFile, -} from '@tanstack/create' - -type AddOnType = 'add-on' | 'example' | 'starter' | 'toolchain' | 'deployment' -type AddOnPhase = 'setup' | 'add-on' - -export interface AddOnCompiled { - id: string - name: string - description: string - type: AddOnType - phase: AddOnPhase - modes: Array - files: Record - deletedFiles: Array - dependsOn?: Array - options?: Record - link?: string - tailwind: boolean - requiresTailwind?: boolean - warning?: string - priority?: number - author?: string - version?: string - license?: string - category?: string - packageAdditions?: { - dependencies?: Record - devDependencies?: Record - scripts?: Record - } -} - -export interface StarterCompiled { - id: string - name: string - description: string - type: AddOnType - phase: AddOnPhase - modes: Array - files: Record - deletedFiles: Array - framework: string - mode: string - typescript: boolean - tailwind: boolean - banner?: string - dependsOn?: Array -} -import { getFramework, DEFAULT_MODE, DEFAULT_REQUIRED_ADDONS, type FrameworkId } from './config' - -export interface ProjectDefinition { - name: string - framework?: FrameworkId - tailwind?: boolean - features: Array - featureOptions: Record> - selectedExample?: string - customIntegrations?: Array - customTemplate?: StarterCompiled | null -} - -export interface CompileRequest { - definition: ProjectDefinition - format?: 'full' | 'summary' -} - -export interface CompileResponse { - files: Record - packages: { - dependencies: Record - devDependencies: Record - scripts: Record - } - envVars: Array<{ - name: string - description: string - required?: boolean - example?: string - }> - commands: Array<{ - command: string - args?: Array - }> - warnings: Array -} - -export interface CompileHandlerOptions { - format?: 'full' | 'summary' -} - -async function resolveAddOns( - featureIds: Array, - customAddOns: Array, - frameworkId: FrameworkId = 'react-cra', -): Promise> { - const framework = getFramework(frameworkId) - const allFrameworkAddOns = framework.getAddOns() - - const customIds = new Set(customAddOns.map((a: AddOnCompiled) => a.id)) - - const frameworkFeatureIds = featureIds.filter((id) => !customIds.has(id)) - - const resolvedFramework = await finalizeAddOns( - framework, - DEFAULT_MODE, - [...DEFAULT_REQUIRED_ADDONS, ...frameworkFeatureIds], - ) - - const customAsAddOns = customAddOns.map((compiled: AddOnCompiled) => ({ - ...compiled, - getFiles: () => Promise.resolve(Object.keys(compiled.files)), - getFileContents: (path: string) => Promise.resolve(compiled.files[path] ?? ''), - getDeletedFiles: () => Promise.resolve(compiled.deletedFiles || []), - })) as unknown as Array - - for (const custom of customAsAddOns) { - if (custom.dependsOn) { - for (const depId of custom.dependsOn) { - if (!resolvedFramework.some((a: AddOn) => a.id === depId)) { - const depAddOn = allFrameworkAddOns.find((a: AddOn) => a.id === depId) - if (depAddOn && !resolvedFramework.some((a: AddOn) => a.id === depId)) { - resolvedFramework.push(depAddOn) - } - } - } - } - } - - return [...resolvedFramework, ...customAsAddOns] -} - -function extractEnvVars( - addOns: Array, -): Array<{ name: string; description: string; required?: boolean; example?: string }> { - const envVars: Array<{ name: string; description: string; required?: boolean; example?: string }> = [] - const seen = new Set() - - for (const addOn of addOns) { - const files = addOn.files || {} - for (const [path, content] of Object.entries(files) as Array<[string, string]>) { - if (path.endsWith('.env') || path.endsWith('.env.example') || path.endsWith('.env.local.example')) { - const lines = content.split('\n') - for (const line of lines) { - const match = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/) - if (match && !seen.has(match[1])) { - seen.add(match[1]) - envVars.push({ - name: match[1], - description: `Environment variable from ${addOn.name}`, - example: match[2] || undefined, - }) - } - } - } - } - } - - return envVars -} - -function extractWarnings(addOns: Array): Array { - return addOns - .filter((a) => a.warning) - .map((a) => `${a.name}: ${a.warning}`) -} - -function _convertToStarter(template: StarterCompiled): Starter { - return { - ...template, - getFiles: () => Promise.resolve(Object.keys(template.files)), - getFileContents: (path: string) => Promise.resolve(template.files[path] ?? ''), - getDeletedFiles: () => Promise.resolve(template.deletedFiles || []), - } as unknown as Starter -} - -function mergeOptionsWithDefaults( - chosenAddOns: Array, - userOptions: Record>, -): Record> { - const defaults = populateAddOnOptionsDefaults(chosenAddOns) - const merged: Record> = { ...defaults } - - for (const [addonId, options] of Object.entries(userOptions)) { - merged[addonId] = { ...merged[addonId], ...options } - } - - return merged -} - -export async function compileHandler( - definition: ProjectDefinition, - options: CompileHandlerOptions = {}, -): Promise { - const frameworkId = definition.framework ?? 'react-cra' - const framework = getFramework(frameworkId) - - // Merge selectedExample into features (CTA treats examples as add-ons) - const allFeatures = definition.selectedExample - ? [...definition.features, definition.selectedExample] - : definition.features - - // Custom integrations disabled until stable launch - const chosenAddOns = await resolveAddOns(allFeatures, [], frameworkId) - - const { environment, output } = createMemoryEnvironment( - `/project/${definition.name}`, - ) - - // Custom starters disabled until stable launch - await createApp(environment, { - projectName: definition.name, - targetDir: `/project/${definition.name}`, - framework, - mode: DEFAULT_MODE, - typescript: true, - tailwind: definition.tailwind ?? true, - packageManager: 'pnpm', - git: false, - install: false, - chosenAddOns, - addOnOptions: mergeOptionsWithDefaults(chosenAddOns, definition.featureOptions), - }) - - const packageJson = output.files['package.json'] - ? JSON.parse(output.files['package.json']) - : { dependencies: {}, devDependencies: {}, scripts: {} } - - return { - files: options.format === 'summary' ? {} : output.files, - packages: { - dependencies: packageJson.dependencies || {}, - devDependencies: packageJson.devDependencies || {}, - scripts: packageJson.scripts || {}, - }, - envVars: extractEnvVars(chosenAddOns), - commands: output.commands, - warnings: extractWarnings(chosenAddOns), - } -} - -// Line attribution interface (used by the UI) -export interface LineAttribution { - lineNumber: number - featureId: string - featureName: string - type?: 'original' | 'injected' -} - -export interface AttributedFile { - path: string - content: string - attributions: Array -} - -export interface AttributedCompileOutput extends CompileResponse { - attributedFiles: Record - dependencies?: Array<{ - name: string - version: string - type: 'dependency' | 'devDependency' - sourceId: string - sourceName: string - }> -} - -export async function compileWithAttributionHandler( - definition: ProjectDefinition, -): Promise { - const frameworkId = definition.framework ?? 'react-cra' - const framework = getFramework(frameworkId) - - // Merge selectedExample into features (CTA treats examples as add-ons) - const allFeatures = definition.selectedExample - ? [...definition.features, definition.selectedExample] - : definition.features - - // Custom integrations disabled until stable launch - const chosenAddOns = await resolveAddOns(allFeatures, [], frameworkId) - - const { environment, output } = createMemoryEnvironment( - `/project/${definition.name}`, - ) - - // Custom starters disabled until stable launch - await createApp(environment, { - projectName: definition.name, - targetDir: `/project/${definition.name}`, - framework, - mode: DEFAULT_MODE, - typescript: true, - tailwind: definition.tailwind ?? true, - packageManager: 'pnpm', - git: false, - install: false, - chosenAddOns, - addOnOptions: mergeOptionsWithDefaults(chosenAddOns, definition.featureOptions), - }) - - const packageJson = output.files['package.json'] - ? JSON.parse(output.files['package.json']) - : { dependencies: {}, devDependencies: {}, scripts: {} } - - // Compute attribution using the new cta-engine attribution system - const attribution = await computeAttribution({ - framework, - chosenAddOns, - starter: undefined, - files: output.files, - }) - - // Convert cta-engine attribution format to our UI format - // Baseline sources (framework + required addons) get mapped to 'base' - const baselineSourceIds = new Set([frameworkId, ...DEFAULT_REQUIRED_ADDONS]) - const attributedFiles: Record = {} - - for (const [filePath, ctaFile] of Object.entries(attribution.attributedFiles)) { - const file = ctaFile as CtaAttributedFile - attributedFiles[filePath] = { - path: filePath, - content: file.content, - attributions: file.lineAttributions.map((attr: CtaLineAttribution) => { - const isBaseline = baselineSourceIds.has(attr.sourceId) - return { - lineNumber: attr.line, - featureId: isBaseline ? 'base' : attr.sourceId, - featureName: isBaseline ? 'Base Template' : attr.sourceName, - type: attr.type, - } - }), - } - } - - // For files that weren't in the attribution (e.g., generated files), use base attribution - for (const [filePath, content] of Object.entries(output.files)) { - if (!attributedFiles[filePath]) { - const lines = (content as string).split('\n') - attributedFiles[filePath] = { - path: filePath, - content: content as string, - attributions: lines.map((_, i) => ({ - lineNumber: i + 1, - featureId: 'base', - featureName: 'Base Template', - type: 'original' as const, - })), - } - } - } - - return { - files: output.files, - packages: { - dependencies: packageJson.dependencies || {}, - devDependencies: packageJson.devDependencies || {}, - scripts: packageJson.scripts || {}, - }, - envVars: extractEnvVars(chosenAddOns), - commands: output.commands, - warnings: extractWarnings(chosenAddOns), - attributedFiles, - dependencies: attribution.dependencies, - } -} diff --git a/src/builder/api/config.ts b/src/builder/api/config.ts deleted file mode 100644 index 8d056ee66..000000000 --- a/src/builder/api/config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { getFrameworkById } from '@tanstack/create' -import type { FrameworkId } from '../frameworks' - -export { type FrameworkId, FRAMEWORKS } from '../frameworks' - -export function getFramework(id: FrameworkId = 'react-cra') { - const framework = getFrameworkById(id) - if (!framework) { - throw new Error(`${id} framework not found`) - } - return framework -} - -export const DEFAULT_MODE = 'file-router' -export const DEFAULT_REQUIRED_ADDONS = ['start'] diff --git a/src/builder/api/feature-artifacts.ts b/src/builder/api/feature-artifacts.ts deleted file mode 100644 index 905c22c35..000000000 --- a/src/builder/api/feature-artifacts.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { type AddOnCompiled } from './compile' -import { compileWithAttributionHandler, type ProjectDefinition } from './compile' -import { type FrameworkId } from './config' - -export interface FeatureArtifactsRequest { - features: Array - projectName?: string - framework?: FrameworkId - tailwind?: boolean - featureOptions?: Record> - customIntegrations?: Array -} - -export interface FeatureArtifact { - files: Record - injections: Record }> - packages: { - dependencies?: Record - devDependencies?: Record - } - envVars?: Array<{ - name: string - description: string - }> -} - -export interface FeatureArtifactsResponse { - artifacts: Record -} - -export async function featureArtifactsHandler( - request: FeatureArtifactsRequest, -): Promise { - if (!request.features || request.features.length === 0) { - return { artifacts: {} } - } - - const projectName = request.projectName || 'my-app' - const tailwind = request.tailwind ?? true - - const definition: ProjectDefinition = { - name: projectName, - framework: request.framework, - tailwind, - features: request.features, - featureOptions: request.featureOptions ?? {}, - customIntegrations: request.customIntegrations, - } - - const output = await compileWithAttributionHandler(definition) - - const artifacts: Record = {} - - for (const featureId of request.features) { - artifacts[featureId] = { - files: {}, - injections: {}, - packages: { - dependencies: {}, - devDependencies: {}, - }, - envVars: [], - } - } - - for (const [path, fileData] of Object.entries(output.attributedFiles)) { - const content = output.files[path] - if (!content || !fileData.attributions) continue - - const linesByFeature = new Map>() - let hasBaseLines = false - - for (const attr of fileData.attributions) { - if (attr.featureId === 'base') { - hasBaseLines = true - continue - } - - if (!linesByFeature.has(attr.featureId)) { - linesByFeature.set(attr.featureId, []) - } - linesByFeature.get(attr.featureId)!.push(attr.lineNumber) - } - - for (const [featureId, lines] of linesByFeature) { - if (!artifacts[featureId]) continue - - if (hasBaseLines) { - artifacts[featureId].injections[path] = { - content, - highlightedLines: lines, - } - } else { - const allLinesFromThis = fileData.attributions.every( - (a) => a.featureId === featureId, - ) - if (allLinesFromThis) { - artifacts[featureId].files[path] = content - } else { - artifacts[featureId].injections[path] = { - content, - highlightedLines: lines, - } - } - } - } - } - - return { artifacts } -} diff --git a/src/builder/api/features.ts b/src/builder/api/features.ts deleted file mode 100644 index 58acd6006..000000000 --- a/src/builder/api/features.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { getAllAddOns, type AddOn, type AddOnOption } from '@tanstack/create' -import { getFramework, DEFAULT_MODE, DEFAULT_REQUIRED_ADDONS, type FrameworkId } from './config' -import { partners } from '~/utils/partners' - -// Set of active partner IDs for matching addons to partners -const activePartnerIds = new Set( - partners.filter((p) => p.status === 'active').map((p) => p.id), -) - -const isDev = process.env.NODE_ENV !== 'production' - -function normalizeUrl(url: string | undefined) { - if (!url) return url - if (isDev) { - return url.replace(/^https?:\/\/tanstack\.com/, '') - } - return url -} - -export interface FeatureOption { - key: string - type: 'select' | 'boolean' | 'string' - label: string - description?: string - default: string | boolean | number | null - choices?: Array<{ value: string; label: string }> -} - -export interface FeatureInfo { - id: string - name: string - description: string - category: string - requires: Array - exclusive: Array - hasOptions: boolean - options?: Array - link?: string - color?: string - partnerId?: string - requiresTailwind?: boolean -} - -export interface FeaturesResponse { - features: Array - examples: Array - version: string -} - -function mapAddOnOptions(addOn: AddOn): Array | undefined { - if (!addOn.options) return undefined - - return Object.entries(addOn.options).map(([key, opt]) => { - const option = opt as AddOnOption - return { - key, - type: option.type, - label: option.label, - description: option.description, - default: option.default, - choices: option.type === 'select' ? option.options : undefined, - } - }) -} - -function getCategoryFromType(type: string): string { - switch (type) { - case 'deployment': - return 'deploy' - case 'toolchain': - return 'tooling' - case 'example': - return 'example' - default: - return 'other' - } -} - -function toFeatureInfo(addOn: AddOn): FeatureInfo { - // Type assertion for new fields that may not be in the cta-engine types yet - const addon = addOn as AddOn & { - category?: string - exclusive?: Array - color?: string - } - - return { - id: addon.id, - name: addon.name, - description: addon.description, - category: addon.category ?? getCategoryFromType(addon.type), - requires: addon.dependsOn ?? [], - exclusive: addon.exclusive ?? [], - hasOptions: !!addon.options, - options: mapAddOnOptions(addon), - link: normalizeUrl(addon.link), - color: addon.color, - partnerId: activePartnerIds.has(addon.id) ? addon.id : undefined, - requiresTailwind: addon.tailwind === true ? undefined : !addon.tailwind, - } -} - -export async function getFeaturesHandler( - frameworkId: FrameworkId = 'react-cra', -): Promise { - const framework = getFramework(frameworkId) - const allAddOns = getAllAddOns(framework, DEFAULT_MODE) - - const features = allAddOns - .filter((addOn: AddOn) => { - if (DEFAULT_REQUIRED_ADDONS.includes(addOn.id)) return false - return ['add-on', 'deployment', 'toolchain'].includes(addOn.type) - }) - .map(toFeatureInfo) - - const examples = allAddOns - .filter((addOn: AddOn) => addOn.type === 'example') - .map(toFeatureInfo) - - return { - features, - examples, - version: '1.0.0', - } -} diff --git a/src/builder/api/index.ts b/src/builder/api/index.ts deleted file mode 100644 index 17c0b5fd4..000000000 --- a/src/builder/api/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -export { - getFeaturesHandler, - type FeaturesResponse, - type FeatureInfo, - type FeatureOption, -} from './features' - -export { - compileHandler, - compileWithAttributionHandler, - type ProjectDefinition, - type CompileRequest, - type CompileResponse, - type CompileHandlerOptions, - type AttributedCompileOutput, - type AttributedFile, - type LineAttribution, -} from './compile' - -export { - validateHandler, - type ValidationError, - type ValidationSuggestion, - type ValidateResponse, -} from './validate' - -export { - suggestHandler, - type SuggestRequest, - type SuggestResponse, - type FeatureSuggestion, -} from './suggest' - -export { - featureArtifactsHandler, - type FeatureArtifactsRequest, - type FeatureArtifactsResponse, - type FeatureArtifact, -} from './feature-artifacts' - -export { - loadRemoteIntegrationHandler, - loadRemoteTemplateHandler, - type RemoteIntegrationResponse, - type RemoteTemplateResponse, -} from './remote' - -export type { AddOnCompiled as IntegrationCompiled, StarterCompiled as CustomTemplateCompiled } from './compile' - -export type FeatureId = string - -export { type FrameworkId, FRAMEWORKS } from './config' diff --git a/src/builder/api/remote.ts b/src/builder/api/remote.ts deleted file mode 100644 index 96d8d7424..000000000 --- a/src/builder/api/remote.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { loadRemoteAddOn, loadStarter } from '@tanstack/create' -import { type AddOnCompiled, type StarterCompiled } from './compile' -import { validateRemoteUrl } from '~/utils/url-validation.server' - -export interface RemoteIntegrationResponse { - integration?: AddOnCompiled - error?: string -} - -export interface RemoteTemplateResponse { - template?: StarterCompiled - error?: string -} - -export async function loadRemoteIntegrationHandler( - url: string, -): Promise { - if (!url) { - return { error: 'URL is required' } - } - - const validation = validateRemoteUrl(url) - if (!validation.valid) { - return { error: validation.error } - } - - try { - const addOn = await loadRemoteAddOn(validation.normalizedUrl!) - const integration: AddOnCompiled = { - ...addOn, - files: addOn.files || {}, - deletedFiles: [], - } - return { integration } - } catch (error) { - return { - error: - error instanceof Error ? error.message : 'Failed to load integration', - } - } -} - -export async function loadRemoteTemplateHandler( - url: string, -): Promise { - if (!url) { - return { error: 'URL is required' } - } - - const validation = validateRemoteUrl(url) - if (!validation.valid) { - return { error: validation.error } - } - - try { - const starter = await loadStarter(validation.normalizedUrl!) - const template = { - ...starter, - files: starter.files || {}, - deletedFiles: starter.deletedFiles || [], - phase: 'setup' as const, - modes: [starter.mode || 'file-router'], - } as unknown as StarterCompiled - return { template } - } catch (error) { - return { - error: - error instanceof Error ? error.message : 'Failed to load template', - } - } -} diff --git a/src/builder/api/suggest.ts b/src/builder/api/suggest.ts deleted file mode 100644 index 56598453f..000000000 --- a/src/builder/api/suggest.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { getAllAddOns, type AddOn } from '@tanstack/create' -import type { ProjectDefinition } from './compile' -import { getFramework, DEFAULT_MODE } from './config' - -export interface SuggestRequest { - description?: string - current?: Partial - intent?: 'full-stack' | 'api-only' | 'static' | 'database' | 'auth' | 'deploy' -} - -export interface FeatureSuggestion { - id: string - name: string - reason: string - confidence: 'high' | 'medium' | 'low' - category: string -} - -export interface SuggestResponse { - suggestions: Array - reasoning: string - recommendedTemplate?: string -} - -const FEATURE_KEYWORDS: Record< - string, - Array<{ keyword: string; weight: number }> -> = { - 'tanstack-query': [ - { keyword: 'data fetching', weight: 1 }, - { keyword: 'api', weight: 0.7 }, - { keyword: 'server state', weight: 1 }, - { keyword: 'cache', weight: 0.8 }, - { keyword: 'react query', weight: 1 }, - { keyword: 'tanstack query', weight: 1 }, - ], - form: [ - { keyword: 'form', weight: 1 }, - { keyword: 'validation', weight: 0.8 }, - { keyword: 'input', weight: 0.5 }, - ], - drizzle: [ - { keyword: 'database', weight: 0.9 }, - { keyword: 'sql', weight: 0.8 }, - { keyword: 'postgres', weight: 0.9 }, - { keyword: 'orm', weight: 0.8 }, - { keyword: 'drizzle', weight: 1 }, - ], - prisma: [ - { keyword: 'prisma', weight: 1 }, - { keyword: 'database', weight: 0.7 }, - { keyword: 'orm', weight: 0.7 }, - ], - clerk: [ - { keyword: 'auth', weight: 0.8 }, - { keyword: 'authentication', weight: 0.9 }, - { keyword: 'login', weight: 0.8 }, - { keyword: 'clerk', weight: 1 }, - ], - 'better-auth': [ - { keyword: 'auth', weight: 0.7 }, - { keyword: 'self-hosted', weight: 1 }, - { keyword: 'better-auth', weight: 1 }, - ], - ai: [ - { keyword: 'ai', weight: 1 }, - { keyword: 'llm', weight: 0.9 }, - { keyword: 'chatbot', weight: 0.9 }, - { keyword: 'openai', weight: 0.8 }, - ], - shadcn: [ - { keyword: 'ui', weight: 0.6 }, - { keyword: 'components', weight: 0.6 }, - { keyword: 'shadcn', weight: 1 }, - ], - sentry: [ - { keyword: 'error tracking', weight: 1 }, - { keyword: 'monitoring', weight: 0.8 }, - { keyword: 'sentry', weight: 1 }, - ], -} - -const INTENT_FEATURES: Record> = { - 'full-stack': ['drizzle', 'shadcn'], - 'api-only': ['drizzle'], - database: ['drizzle'], - auth: ['clerk'], - deploy: [], -} - -function getCategoryFromType(type: string): string { - switch (type) { - case 'deployment': - return 'deploy' - case 'toolchain': - return 'tooling' - default: - return 'other' - } -} - -export async function suggestHandler( - request: SuggestRequest, -): Promise { - const framework = getFramework() - const allAddOns = getAllAddOns(framework, DEFAULT_MODE) - const addOnMap = new Map(allAddOns.map((a: AddOn) => [a.id, a] as const)) - - const suggestions: Array = [] - const reasons: Array = [] - - const currentFeatures = new Set(request.current?.features || []) - - if (request.description) { - const description = request.description.toLowerCase() - - for (const [featureId, keywords] of Object.entries(FEATURE_KEYWORDS)) { - if (currentFeatures.has(featureId)) continue - - let score = 0 - const matchedKeywords: Array = [] - - for (const { keyword, weight } of keywords) { - if (description.includes(keyword.toLowerCase())) { - score += weight - matchedKeywords.push(keyword) - } - } - - if (score > 0) { - const addOn = addOnMap.get(featureId) as AddOn | undefined - if (addOn) { - suggestions.push({ - id: featureId, - name: addOn.name, - reason: `Matches: ${matchedKeywords.join(', ')}`, - confidence: score >= 1 ? 'high' : score >= 0.5 ? 'medium' : 'low', - category: getCategoryFromType(addOn.type), - }) - } - } - } - - if (suggestions.length > 0) { - reasons.push( - `Based on your description, I identified ${suggestions.length} relevant features.`, - ) - } - } - - if (request.intent && INTENT_FEATURES[request.intent]) { - const intentFeatures = INTENT_FEATURES[request.intent] - - for (const featureId of intentFeatures) { - if (currentFeatures.has(featureId)) continue - if (suggestions.some((s) => s.id === featureId)) continue - - const addOn = addOnMap.get(featureId) as AddOn | undefined - if (addOn) { - suggestions.push({ - id: featureId, - name: addOn.name, - reason: `Recommended for ${request.intent} projects`, - confidence: 'high', - category: getCategoryFromType(addOn.type), - }) - } - } - - reasons.push(`Added recommendations for ${request.intent} development.`) - } - - const confidenceOrder = { high: 0, medium: 1, low: 2 } - suggestions.sort( - (a, b) => confidenceOrder[a.confidence] - confidenceOrder[b.confidence], - ) - - for (const suggestion of [...suggestions]) { - const addOn = addOnMap.get(suggestion.id) as AddOn | undefined - if (addOn?.dependsOn) { - for (const required of addOn.dependsOn) { - if ( - !currentFeatures.has(required) && - !suggestions.some((s) => s.id === required) - ) { - const requiredAddOn = addOnMap.get(required) as AddOn | undefined - if (requiredAddOn) { - suggestions.push({ - id: required, - name: requiredAddOn.name, - reason: `Required by ${suggestion.name}`, - confidence: 'high', - category: getCategoryFromType(requiredAddOn.type), - }) - } - } - } - } - } - - return { - suggestions: suggestions.slice(0, 10), - reasoning: reasons.join(' '), - } -} diff --git a/src/builder/api/validate.ts b/src/builder/api/validate.ts deleted file mode 100644 index 144bc528d..000000000 --- a/src/builder/api/validate.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Validate API Handler (v2) - * - * Uses cta-engine to validate project definitions. - */ - -import { getAllAddOns, type AddOn } from '@tanstack/create' -import type { ProjectDefinition } from './compile' -import { getFramework, DEFAULT_MODE } from './config' - -export interface ValidationError { - field: string - message: string -} - -export interface ValidationSuggestion { - type: 'add' | 'remove' | 'change' - feature?: string - option?: string - value?: unknown - reason: string -} - -export interface ValidateResponse { - valid: boolean - errors: Array - suggestions: Array -} - -export async function validateHandler( - definition: ProjectDefinition, -): Promise { - const framework = getFramework() - const allAddOns = getAllAddOns(framework, DEFAULT_MODE) - - const errors: Array = [] - const suggestions: Array = [] - - const addOnMap = new Map(allAddOns.map((a: AddOn) => [a.id, a])) - - if (!definition.name || definition.name.trim() === '') { - errors.push({ - field: 'name', - message: 'Project name is required', - }) - } else if (!/^[a-z0-9-_]+$/.test(definition.name)) { - errors.push({ - field: 'name', - message: - 'Project name can only contain lowercase letters, numbers, hyphens, and underscores', - }) - } - - for (const featureId of definition.features) { - if (!addOnMap.has(featureId)) { - errors.push({ - field: 'features', - message: `Unknown feature: ${featureId}`, - }) - } - } - - for (const featureId of definition.features) { - const addOn = addOnMap.get(featureId) as AddOn | undefined - if (addOn?.dependsOn) { - for (const requiredId of addOn.dependsOn) { - if (!definition.features.includes(requiredId)) { - suggestions.push({ - type: 'add', - feature: requiredId, - reason: `'${featureId}' requires '${requiredId}'`, - }) - } - } - } - } - - return { - valid: errors.length === 0, - errors, - suggestions, - } -} diff --git a/src/builder/frameworks.ts b/src/builder/frameworks.ts deleted file mode 100644 index c64309ae8..000000000 --- a/src/builder/frameworks.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Framework metadata for the builder UI. - * This file is safe to import on the client (no cta-engine dependencies). - */ - -export type FrameworkId = 'react-cra' | 'solid' - -export const FRAMEWORKS: Array<{ - id: FrameworkId - name: string - description: string -}> = [ - { - id: 'react-cra', - name: 'React', - description: 'Full-stack React with TanStack Router', - }, - { - id: 'solid', - name: 'Solid', - description: 'Full-stack Solid with TanStack Router', - }, -] diff --git a/src/builder/templates.ts b/src/builder/templates.ts deleted file mode 100644 index 02e35b5cc..000000000 --- a/src/builder/templates.ts +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Template Presets - * - * Hardcoded preset configurations for common app types. - * Users can select a template to pre-populate features, then modify freely. - */ - -import type { LucideIcon } from 'lucide-react' -import { - Rocket, - Bot, - LayoutDashboard, - FileText, - Server, - Radio, - Globe, - HardDrive, - Plus, -} from 'lucide-react' - -export interface Template { - id: string - name: string - description: string - icon: LucideIcon - color: string - features: Array -} - -export const TEMPLATES: Array