diff --git a/.agents/index.md b/.agents/index.md deleted file mode 100644 index 660f03c42..000000000 --- a/.agents/index.md +++ /dev/null @@ -1,18 +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](.claude/typescript.md). -- **No emdashes.** Use periods, commas, colons, or parentheses instead. - -## Topic Guides - -- [TypeScript Conventions](.claude/typescript.md): Type inference, casting rules, generic naming -- [TanStack Patterns](.claude/tanstack-patterns.md): Loaders, server functions, environment shaking -- [UI Style Guide](.claude/ui-style.md): Visual design principles for 2026 -- [Workflow](.claude/workflow.md): Build commands, debugging, Playwright diff --git a/.claude/tanstack-patterns.md b/.claude/tanstack-patterns.md deleted file mode 100644 index d0ff4e278..000000000 --- a/.claude/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/.claude/typescript.md b/.claude/typescript.md deleted file mode 100644 index e63301ec4..000000000 --- a/.claude/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/.claude/ui-style.md b/.claude/ui-style.md deleted file mode 100644 index d696b3346..000000000 --- a/.claude/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/.claude/workflow.md b/.claude/workflow.md deleted file mode 100644 index 344ed7951..000000000 --- a/.claude/workflow.md +++ /dev/null @@ -1,26 +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. - -## 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 Testing - -Preferred method for verifying visual changes: - -- Navigate to the relevant page -- Take snapshots/screenshots to verify UI -- Interact with elements to test functionality 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.yml deleted file mode 100644 index 60f23f758..000000000 --- a/.github/workflows/update-tanstack-deps.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: Update TanStack Dependencies - -on: - workflow_dispatch: - schedule: - # Run weekly on Sundays at 10:00 AM UTC - - cron: '0 10 * * 0' - -jobs: - update-deps: - name: Update TanStack Dependencies - runs-on: ubuntu-latest - steps: - - name: Git Checkout - uses: actions/checkout@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - - 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: Update TanStack Dependencies - run: pnpm up "@tanstack/*" --latest - - - name: Check for Changes - id: git-check - run: | - git status --porcelain . - if [[ -z $(git status --porcelain .) ]]; then - echo "No changes detected" - echo "changes=false" >> $GITHUB_OUTPUT - else - echo "Changes detected" - echo "changes=true" >> $GITHUB_OUTPUT - fi - - - name: Run Lint - if: steps.git-check.outputs.changes == 'true' - run: pnpm lint - - - name: Run Build - if: steps.git-check.outputs.changes == 'true' - run: pnpm build - - - name: Commit and Push Changes - if: steps.git-check.outputs.changes == 'true' - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git add . - git commit -m "chore: update @tanstack/* dependencies" - git push diff --git a/.gitignore b/.gitignore index 0f36f54fa..851c25acf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,14 @@ node_modules package-lock.json yarn.lock -drizzle/migrations -.tanstack .DS_Store .cache .env .vercel .output .vinxi -.tanstack-start/build -.nitro/* -.netlify/* +.netlify /build/ /api/ @@ -28,8 +24,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..b40caf3a5 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,8 +3,5 @@ **/public pnpm-lock.yaml routeTree.gen.ts -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 +convex/_generated +convex/README.md \ 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/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/app.config.ts b/app.config.ts new file mode 100644 index 000000000..f4295a5a1 --- /dev/null +++ b/app.config.ts @@ -0,0 +1,54 @@ +import { sentryVitePlugin } from '@sentry/vite-plugin' +import { defineConfig } from '@tanstack/start/config' +import contentCollections from '@content-collections/vite' +import tsConfigPaths from 'vite-tsconfig-paths' + +export default defineConfig({ + server: { + preset: 'netlify', + }, + vite: { + plugins: [ + tsConfigPaths(), + (() => { + const replacements = [ + // replace `throw Error(p(418))` with `console.error(p(418))` + ['throw Error(p(418))', 'console.error(p(418))'], + // replace `throw new Error('Hydration failed` with `console.error('Hydration failed')` + [ + `throw new Error('Hydration failed`, + `console.error('Hydration failed`, + ], + ] as const + + return { + name: 'tanner-test', + enforce: 'post', + transform(code, id) { + replacements.forEach(([search, replacement]) => { + if (code.includes(search)) { + code = code.replaceAll(search, replacement) + } + }) + + return code + }, + } + })(), + ], + }, + routers: { + client: { + vite: { + plugins: [ + sentryVitePlugin({ + authToken: process.env.SENTRY_AUTH_TOKEN, + org: 'tanstack', + project: 'tanstack-com', + }), + contentCollections(), + ], + }, + }, + }, +}) diff --git a/app/auth/auth.ts b/app/auth/auth.ts new file mode 100644 index 000000000..7cf126840 --- /dev/null +++ b/app/auth/auth.ts @@ -0,0 +1,76 @@ +import { createCookie } from '@remix-run/node' +import { redirect } from '@tanstack/react-router' + +let secret = process.env.COOKIE_SECRET || 'default' +if (secret === 'default') { + console.warn( + '🚨 No COOKIE_SECRET environment variable set, using default. The app is insecure in production.' + ) + secret = 'default-secret' +} + +let cookie = createCookie('auth', { + secrets: [secret], + // 30 days + maxAge: 30 * 24 * 60 * 60, + httpOnly: true, + secure: process.env.NODE_ENV === 'production', + sameSite: 'lax', +}) + +export async function getAuthFromRequest( + request: Request +): Promise { + const c = request.headers.get('Cookie') + let userId = await cookie.parse(c) + return userId ?? null +} + +export async function setAuthOnResponse( + response: Response, + userId: string +): Promise { + let header = await cookie.serialize(userId) + response.headers.append('Set-Cookie', header) + return response +} + +export async function requireAuthCookie(request: Request) { + let userId = await getAuthFromRequest(request) + if (!userId) { + throw redirect({ + to: '/login', + headers: { + 'Set-Cookie': await cookie.serialize('', { + maxAge: 0, + }), + }, + }) + } + return userId +} + +export async function redirectIfLoggedInLoader({ + request, +}: { + request: Request +}) { + let userId = await getAuthFromRequest(request) + if (userId) { + throw redirect({ + to: '/', + }) + } + return null +} + +export async function redirectWithClearedCookie() { + return redirect({ + to: '/', + headers: { + 'Set-Cookie': await cookie.serialize(null, { + expires: new Date(0), + }), + }, + }) +} diff --git a/src/blog/ag-grid-partnership.md b/app/blog/ag-grid-partnership.md similarity index 100% rename from src/blog/ag-grid-partnership.md rename to app/blog/ag-grid-partnership.md diff --git a/src/blog/announcing-tanstack-form-v1.md b/app/blog/announcing-tanstack-form-v1.md similarity index 99% rename from src/blog/announcing-tanstack-form-v1.md rename to app/blog/announcing-tanstack-form-v1.md index 9e89d163d..e55750ffa 100644 --- a/src/blog/announcing-tanstack-form-v1.md +++ b/app/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-query-v4.md b/app/blog/announcing-tanstack-query-v4.md similarity index 100% rename from src/blog/announcing-tanstack-query-v4.md rename to app/blog/announcing-tanstack-query-v4.md diff --git a/src/blog/announcing-tanstack-query-v5.md b/app/blog/announcing-tanstack-query-v5.md similarity index 100% rename from src/blog/announcing-tanstack-query-v5.md rename to app/blog/announcing-tanstack-query-v5.md diff --git a/src/blog/netlify-partnership.md b/app/blog/netlify-partnership.md similarity index 87% rename from src/blog/netlify-partnership.md rename to app/blog/netlify-partnership.md index ae8f94b19..f3740959d 100644 --- a/src/blog/netlify-partnership.md +++ b/app/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/tanstack-router-typescript-performance.md b/app/blog/tanstack-router-typescript-performance.md similarity index 98% rename from src/blog/tanstack-router-typescript-performance.md rename to app/blog/tanstack-router-typescript-performance.md index 06b31a140..8c3d754dc 100644 --- a/src/blog/tanstack-router-typescript-performance.md +++ b/app/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/app/blog/why-tanstack-start-and-router.md similarity index 57% rename from src/blog/why-tanstack-start-and-router.md rename to app/blog/why-tanstack-start-and-router.md index 602622441..008cc83d4 100644 --- a/src/blog/why-tanstack-start-and-router.md +++ b/app/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/blog/why-tanstack-start-is-ditching-adapters.md b/app/blog/why-tanstack-start-is-ditching-adapters.md similarity index 99% rename from src/blog/why-tanstack-start-is-ditching-adapters.md rename to app/blog/why-tanstack-start-is-ditching-adapters.md index dcbad5963..5ee6e9908 100644 --- a/src/blog/why-tanstack-start-is-ditching-adapters.md +++ b/app/blog/why-tanstack-start-is-ditching-adapters.md @@ -42,7 +42,7 @@ By using Nitro, all of TanStack Start’s adapter problems were gone. I never ev In fact, to deploy to Vercel, it was even easier than I had initially planned: just pass a `vercel` target to our `defineConfig`’s `server.preset` option, which is passed to Nitro: ```jsx -import { defineConfig } from '@tanstack/react-start/config' +import { defineConfig } from '@tanstack/start/config' export default defineConfig({ server: { diff --git a/app/client.tsx b/app/client.tsx new file mode 100644 index 000000000..41f74b4a3 --- /dev/null +++ b/app/client.tsx @@ -0,0 +1,9 @@ +/// +import { hydrateRoot } from 'react-dom/client' +import { StartClient } from '@tanstack/start' +import { createRouter } from './router' +import './utils/sentry' + +const router = createRouter() + +hydrateRoot(document, ) diff --git a/app/components/BackgroundAnimation.tsx b/app/components/BackgroundAnimation.tsx new file mode 100644 index 000000000..29037a28f --- /dev/null +++ b/app/components/BackgroundAnimation.tsx @@ -0,0 +1,231 @@ +import * as React from 'react' +import { usePrefersReducedMotion } from '~/utils/usePrefersReducedMotion' +import { twMerge } from 'tailwind-merge' +import { useMounted } from '~/hooks/useMounted' +import { useRouterState } from '@tanstack/react-router' + +export function BackgroundAnimation() { + const canvasRef = React.useRef(null) + const prefersReducedMotion = usePrefersReducedMotion() + const mounted = useMounted() + const isHomePage = useRouterState({ + select: (s) => s.location.pathname === '/', + }) + + React.useEffect(() => { + if (prefersReducedMotion !== false) { + return + } + + const canvas = canvasRef.current + + let morphDuration = 2000 + const waitDuration = 1000 * 60 * 2 + + const easingFn = cubicBezier(0.645, 0.045, 0.355, 1.0) + + if (canvas) { + const ctx = canvas.getContext('2d')! + + let rafId: ReturnType | null = null + let timeout: ReturnType | null = null + let startTime = performance.now() + + function createBlobs() { + return shuffle([ + { + color: { h: 10, s: 100, l: 50 }, + }, + { + color: { h: 40, s: 100, l: 50 }, + }, + { + color: { h: 150, s: 100, l: 50 }, + }, + { + color: { h: 200, s: 100, l: 50 }, + }, + ]).map((blob) => ({ + ...blob, + x: Math.random() * canvas!.width, + y: Math.random() * canvas!.height, + r: Math.random() * 500 + 700, + colorH: blob.color.h, + colorS: blob.color.s, + colorL: blob.color.l, + })) + } + + function shuffle(array: T[]) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)) + ;[array[i], array[j]] = [array[j], array[i]] + } + return array + } + + let startBlobs = createBlobs() + let currentBlobs = startBlobs + let targetBlobs: ReturnType = [] + + function resizeHandler() { + // Create an offscreen canvas and copy the current content + const offscreen = document.createElement('canvas') + offscreen.width = canvas!.width + offscreen.height = canvas!.height + offscreen.getContext('2d')!.drawImage(canvas!, 0, 0) + + // Resize the main canvas + canvas!.width = window.innerWidth + canvas!.height = window.innerHeight + + // Stretch and redraw the saved content to fill the new size + ctx.drawImage(offscreen, 0, 0, canvas!.width, canvas!.height) + } + + function start() { + if (timeout) { + clearTimeout(timeout) + } + if (rafId) { + cancelAnimationFrame(rafId) + } + + startBlobs = JSON.parse(JSON.stringify(currentBlobs)) + targetBlobs = createBlobs() + startTime = performance.now() + animate() + } + + function animate() { + ctx.clearRect(0, 0, canvas!.width, canvas!.height) + + const time = performance.now() - startTime + const progress = time / morphDuration + const easedProgress = easingFn(progress) + + // Draw the blobs + startBlobs.forEach((startBlob, i) => { + const targetBlob = targetBlobs[i] + + currentBlobs[i].x = interpolate( + startBlob.x, + targetBlob.x, + easedProgress + ) + currentBlobs[i].y = interpolate( + startBlob.y, + targetBlob.y, + easedProgress + ) + + const gradient = ctx.createRadialGradient( + currentBlobs[i].x, + currentBlobs[i].y, + 0, + currentBlobs[i].x, + currentBlobs[i].y, + currentBlobs[i].r + ) + + currentBlobs[i].colorH = interpolate( + startBlob.colorH, + targetBlob.colorH, + easedProgress + ) + currentBlobs[i].colorS = interpolate( + startBlob.colorS, + targetBlob.colorS, + easedProgress + ) + currentBlobs[i].colorL = interpolate( + startBlob.colorL, + targetBlob.colorL, + easedProgress + ) + + gradient.addColorStop( + 0, + `hsla(${currentBlobs[i].colorH}, ${currentBlobs[i].colorS}%, ${currentBlobs[i].colorL}%, 1)` + ) + gradient.addColorStop( + 1, + `hsla(${currentBlobs[i].colorH}, ${currentBlobs[i].colorS}%, ${currentBlobs[i].colorL}%, 0)` + ) + + ctx.fillStyle = gradient + ctx.beginPath() + ctx.arc( + currentBlobs[i].x, + currentBlobs[i].y, + currentBlobs[i].r, + 0, + Math.PI * 2 + ) + ctx.fill() + }) + + if (progress < 1) { + rafId = requestAnimationFrame(animate) + } else { + timeout = setTimeout(() => { + morphDuration = 4000 + start() + }, waitDuration) + } + } + + resizeHandler() + start() + window.addEventListener('resize', resizeHandler) + + return () => { + if (rafId) { + cancelAnimationFrame(rafId) + } + if (timeout) { + clearTimeout(timeout) + } + window.removeEventListener('resize', resizeHandler) + } + } + }, [prefersReducedMotion]) + + return ( +
+ +
+ ) +} + +function cubicBezier(p1x: number, p1y: number, p2x: number, p2y: number) { + return function (t: number) { + const cx = 3 * p1x + const bx = 3 * (p2x - p1x) - cx + const ax = 1 - cx - bx + + const cy = 3 * p1y + const by = 3 * (p2y - p1y) - cy + const ay = 1 - cy - by + + const x = ((ax * t + bx) * t + cx) * t + const y = ((ay * t + by) * t + cy) * t + + return y + } +} + +function interpolate(start: number, end: number, progress: number) { + return start + (end - start) * progress +} diff --git a/src/components/BytesForm.tsx b/app/components/BytesForm.tsx similarity index 64% rename from src/components/BytesForm.tsx rename to app/components/BytesForm.tsx index 3e79d33c9..ae12b2622 100644 --- a/src/components/BytesForm.tsx +++ b/app/components/BytesForm.tsx @@ -1,36 +1,8 @@ import useBytesSubmit from '~/components/useBytesSubmit' import bytesImage from '~/images/bytes.svg' -import { useToast } from '~/components/ToastProvider' -import { useEffect } from 'react' export default function BytesForm() { const { state, handleSubmit, error } = useBytesSubmit() - const { notify } = useToast() - useEffect(() => { - if (state === 'submitted') { - notify( -
-
Thanks for subscribing
-
- Check your email to confirm your subscription -
-
, - ) - } - }, [state, notify]) - - useEffect(() => { - if (error) { - notify( -
-
Subscription failed
-
- Please try again in a moment -
-
, - ) - } - }, [error, notify]) if (state === 'submitted') { return (

Success! Please, check your email to confirm your subscription.

diff --git a/app/components/Carbon.tsx b/app/components/Carbon.tsx new file mode 100644 index 000000000..25f99957c --- /dev/null +++ b/app/components/Carbon.tsx @@ -0,0 +1,15 @@ +import * as React from 'react' + +export function Carbon() { + const ref = React.useRef(null!) + + React.useEffect(() => { + ref.current.innerHTML = '' + const s = document.createElement('script') + s.id = '_carbonads_js' + s.src = `//cdn.carbonads.com/carbon.js?serve=CE7DEKQI&placement=react-tannerlinsleycom` + ref.current.appendChild(s) + }, []) + + return
+} diff --git a/src/components/CodeExplorer.tsx b/app/components/CodeExplorer.tsx similarity index 91% rename from src/components/CodeExplorer.tsx rename to app/components/CodeExplorer.tsx index 9bf364fa8..c97fbf7c9 100644 --- a/src/components/CodeExplorer.tsx +++ b/app/components/CodeExplorer.tsx @@ -1,11 +1,10 @@ import React from 'react' -import { CodeBlock } from '~/components/markdown' +import { CodeBlock } from '~/components/Markdown' import { FileExplorer } from './FileExplorer' import { InteractiveSandbox } from './InteractiveSandbox' import { CodeExplorerTopBar } from './CodeExplorerTopBar' import type { GitHubFileNode } from '~/utils/documents.server' import type { Library } from '~/libraries' -import { twMerge } from 'tailwind-merge' function overrideExtension(ext: string | undefined) { if (!ext) return 'txt' @@ -88,9 +87,7 @@ export function CodeExplorer({ return (
{currentCode} diff --git a/src/components/CodeExplorerTopBar.tsx b/app/components/CodeExplorerTopBar.tsx similarity index 71% rename from src/components/CodeExplorerTopBar.tsx rename to app/components/CodeExplorerTopBar.tsx index a76ebfe0b..b998ca205 100644 --- a/src/components/CodeExplorerTopBar.tsx +++ b/app/components/CodeExplorerTopBar.tsx @@ -1,11 +1,6 @@ import React from 'react' -import { - ArrowLeftFromLine, - ArrowRightFromLine, - Maximize, - Minimize, - TextAlignStart, -} from 'lucide-react' +import { FaExpand, FaCompress } from 'react-icons/fa' +import { CgMenuLeft } from 'react-icons/cg' interface CodeExplorerTopBarProps { activeTab: 'code' | 'sandbox' @@ -28,26 +23,16 @@ export function CodeExplorerTopBar({
{activeTab === 'code' ? ( - isSidebarOpen ? ( - - ) : ( - - ) + ) : (
- +
)}
diff --git a/src/components/CookieConsent.tsx b/app/components/CookieConsent.tsx similarity index 80% rename from src/components/CookieConsent.tsx rename to app/components/CookieConsent.tsx index 9feb11f3f..86ae3b58d 100644 --- a/src/components/CookieConsent.tsx +++ b/app/components/CookieConsent.tsx @@ -1,6 +1,5 @@ import { Link } from '@tanstack/react-router' import { useEffect, useState } from 'react' -import { Button } from '~/ui' declare global { interface Window { @@ -45,68 +44,10 @@ const EU_COUNTRIES = [ export default function CookieConsent() { const [showBanner, setShowBanner] = useState(false) const [showSettings, setShowSettings] = useState(false) - const consentSettings = (() => { - if (typeof document === 'undefined') { - return { analytics: false, ads: false } - } - try { - const stored = localStorage.getItem('cookie_consent') - if (!stored) return { analytics: false, ads: false } - return JSON.parse(stored) as { analytics: boolean; ads: boolean } - } catch { - return { analytics: false, ads: false } - } - })() - - const blockGoogleScripts = () => { - document.querySelectorAll('script').forEach((script) => { - if ( - script.src?.includes('googletagmanager.com') || - script.textContent?.includes('gtag(') - ) { - script.remove() - } - }) - document.cookie = - '_ga=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.google.com' - document.cookie = - '_gid=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.google.com' - } - - const restoreGoogleScripts = () => { - if (!document.querySelector("script[src*='googletagmanager.com']")) { - const script = document.createElement('script') - script.src = 'https://www.googletagmanager.com/gtag/js?id=GTM-5N57KQT4' - script.async = true - document.body.appendChild(script) - } - } - - const updateGTMConsent = (settings: { analytics: boolean; ads: boolean }) => { - window.dataLayer = window.dataLayer || [] - window.dataLayer.push({ - event: 'cookie_consent', - consent: { - analytics_storage: settings.analytics ? 'granted' : 'denied', - ad_storage: settings.ads ? 'granted' : 'denied', - ad_personalization: settings.ads ? 'granted' : 'denied', - }, - }) - - if (typeof window.gtag === 'function') { - window.gtag('consent', 'update', { - analytics_storage: settings.analytics ? 'granted' : 'denied', - ad_storage: settings.ads ? 'granted' : 'denied', - ad_personalization: settings.ads ? 'granted' : 'denied', - }) - } - - if (settings.analytics || settings.ads) { - restoreGoogleScripts() - } else { - blockGoogleScripts() - } - } + const consentSettings = + typeof document !== 'undefined' + ? JSON.parse(localStorage.getItem('cookie_consent') || '{}') + : { analytics: false, ads: false } useEffect(() => { const checkLocationAndSetConsent = async () => { @@ -114,7 +55,7 @@ export default function CookieConsent() { if (!consentSettings.analytics && !consentSettings.ads) { try { const response = await fetch( - 'https://www.cloudflare.com/cdn-cgi/trace', + 'https://www.cloudflare.com/cdn-cgi/trace' ) const data = await response.text() const country = data.match(/loc=(\w+)/)?.[1] @@ -143,9 +84,34 @@ export default function CookieConsent() { } checkLocationAndSetConsent() - // eslint-disable-next-line react-hooks/exhaustive-deps }, []) + const updateGTMConsent = (settings: { analytics: boolean; ads: boolean }) => { + window.dataLayer = window.dataLayer || [] + window.dataLayer.push({ + event: 'cookie_consent', + consent: { + analytics_storage: settings.analytics ? 'granted' : 'denied', + ad_storage: settings.ads ? 'granted' : 'denied', + ad_personalization: settings.ads ? 'granted' : 'denied', + }, + }) + + if (typeof window.gtag === 'function') { + window.gtag('consent', 'update', { + analytics_storage: settings.analytics ? 'granted' : 'denied', + ad_storage: settings.ads ? 'granted' : 'denied', + ad_personalization: settings.ads ? 'granted' : 'denied', + }) + } + + if (settings.analytics || settings.ads) { + restoreGoogleScripts() + } else { + blockGoogleScripts() + } + } + const acceptAllCookies = () => { const consent = { analytics: true, ads: true } localStorage.setItem('cookie_consent', JSON.stringify(consent)) @@ -163,6 +129,30 @@ export default function CookieConsent() { const openSettings = () => setShowSettings(true) const closeSettings = () => setShowSettings(false) + const blockGoogleScripts = () => { + document.querySelectorAll('script').forEach((script) => { + if ( + script.src?.includes('googletagmanager.com') || + script.textContent?.includes('gtag(') + ) { + script.remove() + } + }) + document.cookie = + '_ga=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.google.com' + document.cookie = + '_gid=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.google.com' + } + + const restoreGoogleScripts = () => { + if (!document.querySelector("script[src*='googletagmanager.com']")) { + const script = document.createElement('script') + script.src = 'https://www.googletagmanager.com/gtag/js?id=GTM-5N57KQT4' + script.async = true + document.body.appendChild(script) + } + } + return ( <> {showBanner && ( @@ -183,16 +173,25 @@ export default function CookieConsent() { {' '} for details. -
- - + - + +
)} @@ -202,10 +201,9 @@ export default function CookieConsent() {

Cookie Settings

-
+
+
- +
diff --git a/app/components/CountdownTimer.tsx b/app/components/CountdownTimer.tsx new file mode 100644 index 000000000..1969e0576 --- /dev/null +++ b/app/components/CountdownTimer.tsx @@ -0,0 +1,92 @@ +import { Fragment, useEffect, useState } from 'react' + +interface CountdownProps { + targetDate: string // YYYY-MM-DD format +} + +interface TimeLeft { + days: number + hours: number + minutes: number + seconds: number +} + +function calculateTimeLeft(targetDate: string): TimeLeft { + const target = new Date(`${targetDate}T00:00:00-08:00`) + const now = new Date() + const difference = +target - +now + + if (difference <= 0) { + return { + days: 0, + hours: 0, + minutes: 0, + seconds: 0, + } + } + + return { + days: Math.floor(difference / (1000 * 60 * 60 * 24)), + hours: Math.floor((difference / (1000 * 60 * 60)) % 24), + minutes: Math.floor((difference / 1000 / 60) % 60), + seconds: Math.floor((difference / 1000) % 60), + } +} + +const formatNumber = (number: number) => number.toString().padStart(2, '0') + +const Countdown: React.FC = ({ targetDate }) => { + const [timeLeft, setTimeLeft] = useState( + calculateTimeLeft(targetDate) + ) + + useEffect(() => { + const timer = setInterval(() => { + const newTimeLeft = calculateTimeLeft(targetDate) + setTimeLeft(newTimeLeft) + if ( + newTimeLeft.days === 0 && + newTimeLeft.hours === 0 && + newTimeLeft.minutes === 0 && + newTimeLeft.seconds === 0 + ) { + clearInterval(timer) + } + }, 1000) + + return () => clearInterval(timer) + }, [targetDate]) + + if ( + timeLeft.days === 0 && + timeLeft.hours === 0 && + timeLeft.minutes === 0 && + timeLeft.seconds === 0 + ) { + return null + } + + return ( +
+ {['days', 'hours', 'minutes', 'seconds'].map((unit, index) => ( + + {index > 0 && ( + : + )} + +
+ + {formatNumber(timeLeft[unit as keyof TimeLeft]).charAt(0)} + + + {formatNumber(timeLeft[unit as keyof TimeLeft]).charAt(1)} + +

{unit}

+
+
+ ))} +
+ ) +} + +export default Countdown diff --git a/app/components/CountdownTimerSmall.tsx b/app/components/CountdownTimerSmall.tsx new file mode 100644 index 000000000..8693b2cbc --- /dev/null +++ b/app/components/CountdownTimerSmall.tsx @@ -0,0 +1,83 @@ +import { Fragment, useEffect, useState } from 'react' + +interface CountdownProps { + targetDate: string // YYYY-MM-DD format +} + +interface TimeLeft { + days: number + hours: number + minutes: number +} + +function calculateTimeLeft(targetDate: string): TimeLeft { + const target = new Date(`${targetDate}T00:00:00-08:00`) + const now = new Date() + const difference = +target - +now + + if (difference <= 0) { + return { + days: 0, + hours: 0, + minutes: 0, + } + } + + return { + days: Math.floor(difference / (1000 * 60 * 60 * 24)), + hours: Math.floor((difference / (1000 * 60 * 60)) % 24), + minutes: Math.floor((difference / 1000 / 60) % 60), + } +} + +const formatNumber = (number: number) => number.toString().padStart(2, '0') + +const Countdown: React.FC = ({ targetDate }) => { + const [timeLeft, setTimeLeft] = useState( + calculateTimeLeft(targetDate) + ) + + useEffect(() => { + const timer = setInterval(() => { + const newTimeLeft = calculateTimeLeft(targetDate) + setTimeLeft(newTimeLeft) + if ( + newTimeLeft.days === 0 && + newTimeLeft.hours === 0 && + newTimeLeft.minutes === 0 + ) { + clearInterval(timer) + } + }, 1000) + + return () => clearInterval(timer) + }, [targetDate]) + + if (timeLeft.days === 0 && timeLeft.hours === 0 && timeLeft.minutes === 0) { + return null + } + + return ( +
+ {['days', 'hours', 'minutes'].map((unit, index) => ( + + {index > 0 && ( + : + )} + +
+ + {formatNumber(timeLeft[unit as keyof TimeLeft]).charAt(0)} + + + {formatNumber(timeLeft[unit as keyof TimeLeft]).charAt(1)} + +

{unit}

+
+
+ ))} +
+ ) +} + +export default Countdown diff --git a/app/components/DefaultCatchBoundary.tsx b/app/components/DefaultCatchBoundary.tsx new file mode 100644 index 000000000..1c5747f2f --- /dev/null +++ b/app/components/DefaultCatchBoundary.tsx @@ -0,0 +1,66 @@ +import { + ErrorComponent, + ErrorComponentProps, + Link, + rootRouteId, + useMatch, + useRouter, +} from '@tanstack/react-router' + +// type DefaultCatchBoundaryType = { +// status: number +// statusText: string +// data: string +// isRoot?: boolean +// } + +export function DefaultCatchBoundary({ error }: ErrorComponentProps) { + const router = useRouter() + const isRoot = useMatch({ + strict: false, + select: (state) => state.id === rootRouteId, + }) + + console.error(error) + + return ( +
+

+ {/*
{status}
+ {statusText ? ( +
{statusText}
+ ) : null} */} +

+ +
+ + {isRoot ? ( + + TanStack Home + + ) : ( + { + e.preventDefault() + window.history.back() + }} + > + Go Back + + )} +
+
+ ) +} diff --git a/app/components/Doc.tsx b/app/components/Doc.tsx new file mode 100644 index 000000000..5615f5893 --- /dev/null +++ b/app/components/Doc.tsx @@ -0,0 +1,150 @@ +import * as React from 'react' +import { FaEdit } from 'react-icons/fa' +import { marked } from 'marked' +import markedAlert from 'marked-alert' +import { gfmHeadingId, getHeadingList } from 'marked-gfm-heading-id' +import { DocTitle } from '~/components/DocTitle' +import { Markdown } from '~/components/Markdown' +import { Toc } from './Toc' +import { twMerge } from 'tailwind-merge' +import { TocMobile } from './TocMobile' +import { GadLeader } from './GoogleScripts' + +type DocProps = { + title: string + content: string + repo: string + branch: string + filePath: string + shouldRenderToc?: boolean + colorFrom?: string + colorTo?: string +} + +export function Doc({ + title, + content, + repo, + branch, + filePath, + shouldRenderToc = false, + colorFrom, + colorTo, +}: DocProps) { + const { markup, headings } = React.useMemo(() => { + const markup = marked.use( + { gfm: true }, + gfmHeadingId(), + markedAlert() + )(content) as string + + const headings = getHeadingList() + + return { markup, headings } + }, [content]) + + const isTocVisible = shouldRenderToc && headings && headings.length > 1 + + const markdownContainerRef = React.useRef(null) + const [activeHeadings, setActiveHeadings] = React.useState>([]) + + const headingElementRefs = React.useRef< + Record + >({}) + + React.useEffect(() => { + const callback = (headingsList: Array) => { + headingElementRefs.current = headingsList.reduce( + (map, headingElement) => { + map[headingElement.target.id] = headingElement + return map + }, + headingElementRefs.current + ) + + const visibleHeadings: Array = [] + Object.keys(headingElementRefs.current).forEach((key) => { + const headingElement = headingElementRefs.current[key] + if (headingElement.isIntersecting) { + visibleHeadings.push(headingElement) + } + }) + + if (visibleHeadings.length >= 1) { + setActiveHeadings(visibleHeadings.map((h) => h.target.id)) + } + } + + const observer = new IntersectionObserver(callback, { + rootMargin: '0px', + threshold: 0.2, + }) + + const headingElements = Array.from( + markdownContainerRef.current?.querySelectorAll( + 'h2[id], h3[id], h4[id], h5[id], h6[id]' + ) ?? [] + ) + headingElements.forEach((el) => observer.observe(el)) + + return () => observer.disconnect() + }, []) + + return ( + + {shouldRenderToc ? : null} +
+
+ + {title ? {title} : null} +
+
+
+
+ +
+
+
+ +
+
+ + {isTocVisible && ( +
+ +
+ )} +
+ + ) +} diff --git a/src/components/DocContainer.tsx b/app/components/DocContainer.tsx similarity index 63% rename from src/components/DocContainer.tsx rename to app/components/DocContainer.tsx index 6d6228fe1..10943b9f3 100644 --- a/src/components/DocContainer.tsx +++ b/app/components/DocContainer.tsx @@ -6,7 +6,13 @@ export function DocContainer({ ...props }: { children: React.ReactNode } & HTMLProps) { return ( -
+
{children}
) diff --git a/src/components/DocTitle.tsx b/app/components/DocTitle.tsx similarity index 100% rename from src/components/DocTitle.tsx rename to app/components/DocTitle.tsx diff --git a/src/components/DocsCalloutBytes.tsx b/app/components/DocsCalloutBytes.tsx similarity index 78% rename from src/components/DocsCalloutBytes.tsx rename to app/components/DocsCalloutBytes.tsx index 5fd6945bd..2fdeaa4a9 100644 --- a/src/components/DocsCalloutBytes.tsx +++ b/app/components/DocsCalloutBytes.tsx @@ -8,8 +8,8 @@ export function DocsCalloutBytes(props: React.HTMLProps) { Subscribe to Bytes

- Your weekly dose of JavaScript news. Delivered every Tuesday and - Friday to over 200,000 devs, for free. + Your weekly dose of JavaScript news. Delivered every Monday to over + 100,000 devs, for free.

diff --git a/src/components/DocsCalloutQueryGG.tsx b/app/components/DocsCalloutQueryGG.tsx similarity index 58% rename from src/components/DocsCalloutQueryGG.tsx rename to app/components/DocsCalloutQueryGG.tsx index c3c02eca7..818180a1c 100644 --- a/src/components/DocsCalloutQueryGG.tsx +++ b/app/components/DocsCalloutQueryGG.tsx @@ -1,4 +1,5 @@ -import { LogoQueryGG } from '~/ui' +import { LogoQueryGGSmall } from '~/components/LogoQueryGGSmall' +import CountdownTimerSmall from '~/components/CountdownTimerSmall' import { useQueryGGPPPDiscount } from '~/hooks/useQueryGGPPPDiscount' export function DocsCalloutQueryGG() { @@ -15,15 +16,24 @@ export function DocsCalloutQueryGG() {
Want to Skip the Docs?
- + -
- “If you’re serious about *really* understanding React Query, there’s + {/*
+ “If you're serious about *really* understanding React Query, there's no better way than with query.gg” —Tanner Linsley -
+
*/} -
+ {/*
*/} +
+

+ Launch week sale +

+

+ Up to 30% off through May 17th +

+ +
{ppp && ( <> diff --git a/app/components/DocsLayout.tsx b/app/components/DocsLayout.tsx new file mode 100644 index 000000000..9b5168bc5 --- /dev/null +++ b/app/components/DocsLayout.tsx @@ -0,0 +1,741 @@ +import * as React from 'react' +import { CgClose, CgMenuLeft } from 'react-icons/cg' +import { + FaArrowLeft, + FaArrowRight, + FaDiscord, + FaGithub, + FaTimes, +} from 'react-icons/fa' +import { + Link, + useMatches, + useNavigate, + useParams, +} from '@tanstack/react-router' +import { FrameworkSelect } from '~/components/FrameworkSelect' +import { useLocalStorage } from '~/utils/useLocalStorage' +import { DocsLogo } from '~/components/DocsLogo' +import { last, capitalize } from '~/utils/utils' +import type { SelectOption } from '~/components/FrameworkSelect' +import type { ConfigSchema, MenuItem } from '~/utils/config' +import { create } from 'zustand' +import { Framework, getFrameworkOptions } from '~/libraries' +import { DocsCalloutQueryGG } from '~/components/DocsCalloutQueryGG' +import { DocsCalloutBytes } from '~/components/DocsCalloutBytes' +import { twMerge } from 'tailwind-merge' +import { partners } from '~/utils/partners' +import { useThemeStore } from './ThemeToggle' +import { + GadFooter, + GadLeftRailSquare, + GadRightRailSquare, +} from './GoogleScripts' +import { SearchButton } from './SearchButton' + +// Let's use zustand to wrap the local storage logic. This way +// we'll get subscriptions for free and we can use it in other +// components if we need to. +const useLocalCurrentFramework = create<{ + currentFramework?: string + setCurrentFramework: (framework: string) => void +}>((set) => ({ + currentFramework: + typeof document !== 'undefined' + ? localStorage.getItem('framework') || undefined + : undefined, + setCurrentFramework: (framework: string) => { + localStorage.setItem('framework', framework) + set({ currentFramework: framework }) + }, +})) + +/** + * Use framework in URL path + * Otherwise use framework in localStorage if it exists for this project + * Otherwise fallback to react + */ +function useCurrentFramework(frameworks: Framework[]) { + const navigate = useNavigate() + + const { framework: paramsFramework } = useParams({ + strict: false, + }) + + const localCurrentFramework = useLocalCurrentFramework() + + let framework = (paramsFramework || + localCurrentFramework.currentFramework || + 'react') as Framework + + framework = frameworks.includes(framework) ? framework : 'react' + + const setFramework = React.useCallback( + (framework: string) => { + navigate({ + params: (prev) => ({ + ...prev, + framework, + }), + }) + localCurrentFramework.setCurrentFramework(framework) + }, + [localCurrentFramework, navigate] + ) + + React.useEffect(() => { + // Set the framework in localStorage if it doesn't exist + if (!localCurrentFramework.currentFramework) { + localCurrentFramework.setCurrentFramework(framework) + } + + // Set the framework in localStorage if it doesn't match the URL + if ( + paramsFramework && + paramsFramework !== localCurrentFramework.currentFramework + ) { + localCurrentFramework.setCurrentFramework(paramsFramework) + } + }) + + return { + framework, + setFramework, + } +} + +// Let's use zustand to wrap the local storage logic. This way +// we'll get subscriptions for free and we can use it in other +// components if we need to. +const useLocalCurrentVersion = create<{ + currentVersion?: string + setCurrentVersion: (version: string) => void +}>((set) => ({ + currentVersion: + typeof document !== 'undefined' + ? localStorage.getItem('version') || undefined + : undefined, + setCurrentVersion: (version: string) => { + localStorage.setItem('version', version) + set({ currentVersion: version }) + }, +})) + +/** + * Use framework in URL path + * Otherwise use framework in localStorage if it exists for this project + * Otherwise fallback to react + */ +function useCurrentVersion(versions: string[]) { + const navigate = useNavigate() + + const { version: paramsVersion } = useParams({ + strict: false, + }) + + const localCurrentVersion = useLocalCurrentVersion() + + let version = paramsVersion || localCurrentVersion.currentVersion || 'latest' + + version = versions.includes(version) ? version : 'latest' + + const setVersion = React.useCallback( + (version: string) => { + navigate({ + params: (prev: Record) => ({ + ...prev, + version, + }), + }) + localCurrentVersion.setCurrentVersion(version) + }, + [localCurrentVersion, navigate] + ) + + React.useEffect(() => { + // Set the version in localStorage if it doesn't exist + if (!localCurrentVersion.currentVersion) { + localCurrentVersion.setCurrentVersion(version) + } + + // Set the version in localStorage if it doesn't match the URL + if (paramsVersion && paramsVersion !== localCurrentVersion.currentVersion) { + localCurrentVersion.setCurrentVersion(paramsVersion) + } + }) + + return { + version, + setVersion, + } +} + +const useMenuConfig = ({ + config, + repo, + frameworks, +}: { + config: ConfigSchema + repo: string + frameworks: Framework[] +}): MenuItem[] => { + const currentFramework = useCurrentFramework(frameworks) + + const localMenu: MenuItem = { + label: 'Menu', + children: [ + { + label: 'Home', + to: '..', + }, + ...(frameworks.length > 1 + ? [ + { + label: 'Frameworks', + to: './framework', + }, + ] + : []), + { + label: ( +
+ GitHub +
+ ), + to: `https://github.com/${repo}`, + }, + { + label: ( +
+ Discord +
+ ), + to: 'https://tlinz.com/discord', + }, + ], + } + + return [ + localMenu, + // Merge the two menus together based on their group labels + ...config.sections.map((section): MenuItem | undefined => { + const frameworkDocs = section.frameworks?.find( + (f) => f.label === currentFramework.framework + ) + const frameworkItems = frameworkDocs?.children ?? [] + + const children = [ + ...section.children.map((d) => ({ ...d, badge: 'core' })), + ...frameworkItems.map((d) => ({ + ...d, + badge: currentFramework.framework, + })), + ] + + if (children.length === 0) { + return undefined + } + + return { + label: section.label, + children, + collapsible: section.collapsible ?? false, + defaultCollapsed: section.defaultCollapsed ?? false, + } + }), + ].filter((item) => item !== undefined) +} + +const useFrameworkConfig = ({ frameworks }: { frameworks: Framework[] }) => { + const currentFramework = useCurrentFramework(frameworks) + + const frameworkConfig = React.useMemo(() => { + return { + label: 'Framework', + selected: frameworks.includes(currentFramework.framework) + ? currentFramework.framework + : 'react', + available: getFrameworkOptions(frameworks), + onSelect: (option: { label: string; value: string }) => { + currentFramework.setFramework(option.value) + }, + } + }, [frameworks, currentFramework]) + + return frameworkConfig +} + +const useVersionConfig = ({ versions }: { versions: string[] }) => { + const currentVersion = useCurrentVersion(versions) + + const versionConfig = React.useMemo(() => { + const available = versions.reduce( + (acc: SelectOption[], version) => { + acc.push({ + label: version, + value: version, + }) + return acc + }, + [ + { + label: 'Latest', + value: 'latest', + }, + ] + ) + + return { + label: 'Version', + selected: versions.includes(currentVersion.version) + ? currentVersion.version + : 'latest', + available, + onSelect: (option: { label: string; value: string }) => { + currentVersion.setVersion(option.value) + }, + } + }, [currentVersion, versions]) + + return versionConfig +} + +type DocsLayoutProps = { + name: string + version: string + colorFrom: string + colorTo: string + textColor: string + config: ConfigSchema + frameworks: Framework[] + versions: string[] + repo: string + children: React.ReactNode +} + +export function DocsLayout({ + name, + version, + colorFrom, + colorTo, + textColor, + config, + frameworks, + versions, + repo, + children, +}: DocsLayoutProps) { + const { libraryId } = useParams({ + from: '/$libraryId/$version/docs', + }) + const { _splat } = useParams({ strict: false }) + const frameworkConfig = useFrameworkConfig({ frameworks }) + const versionConfig = useVersionConfig({ versions }) + const menuConfig = useMenuConfig({ config, frameworks, repo }) + + const matches = useMatches() + const lastMatch = last(matches) + + const isExample = matches.some((d) => d.pathname.includes('/examples/')) + + const detailsRef = React.useRef(null!) + + const flatMenu = React.useMemo( + () => menuConfig.flatMap((d) => d?.children), + [menuConfig] + ) + + const docsMatch = matches.find((d) => d.pathname.includes('/docs')) + + const relativePathname = lastMatch.pathname.replace( + docsMatch!.pathname + '/', + '' + ) + + const index = flatMenu.findIndex((d) => d?.to === relativePathname) + const prevItem = flatMenu[index - 1] + const nextItem = flatMenu[index + 1] + + const [showBytes, setShowBytes] = useLocalStorage('showBytes', true) + + const [mounted, setMounted] = React.useState(false) + + React.useEffect(() => { + setMounted(true) + }, []) + + const menuItems = menuConfig.map((group, i) => { + const WrapperComp = group.collapsible ? 'details' : 'div' + const LabelComp = group.collapsible ? 'summary' : 'div' + + const isChildActive = group.children.some((d) => d.to === _splat) + const configGroupOpenState = + typeof group.defaultCollapsed !== 'undefined' + ? !group.defaultCollapsed // defaultCollapsed is true means the group is closed + : undefined + const isOpen = isChildActive ? true : configGroupOpenState ?? false + + const detailsProps = group.collapsible ? { open: isOpen } : {} + + return ( + + + {group?.label} + +
+
    + {group?.children?.map((child, i) => { + const linkClasses = `cursor-pointer flex gap-2 items-center justify-between group px-2 py-[.1rem] rounded-lg hover:bg-gray-500 hover:bg-opacity-10` + + return ( +
  • + {child.to.startsWith('http') ? ( + + {child.label} + + ) : ( + { + detailsRef.current.removeAttribute('open') + }} + activeOptions={{ + exact: true, + includeHash: false, + includeSearch: false, + }} + className="!cursor-pointer relative" + > + {(props) => { + return ( +
    +
    + {/*
    */} + {child.label} + {/*
    */} +
    + {child.badge ? ( +
    + {child.badge} +
    + ) : null} +
    + ) + }} + + )} +
  • + ) + })} +
+ + ) + }) + + const logo = ( + + ) + + const smallMenu = ( +
+
+ +
+ + + {logo} +
+
+
+
+ + +
+ + {menuItems} +
+
+
+ ) + + const largeMenu = ( +
+
{logo}
+
+ +
+
+ + +
+
+ {menuItems} +
+
+ ) + + return ( +
+ {smallMenu} + {largeMenu} +
+
+ {children} +
+
+ +
+
+
+ {prevItem ? ( + +
+ + {prevItem.label} +
+ + ) : null} +
+
+ {nextItem ? ( + +
+ + {nextItem.label} + {' '} + +
+ + ) : null} +
+
+
+
+
+
+
+ Our Partners +
+ {!partners.some((d) => d.libraries?.includes(libraryId as any)) ? ( + + ) : ( + partners + .filter((d) => d.sidebarImgLight) + .filter((d) => d.libraries?.includes(libraryId as any)) + .map((partner) => { + return ( +
+ +
+ {partner.name} + {partner.name} +
+
+ {partner.sidebarAfterImg || null} +
+ ) + }) + )} +
+ {libraryId === 'query' ? ( +
+ +
+ ) : null} + +
+ +
+ +
+ +
+ + {/*
+ +
*/} + + {libraryId !== 'query' ? ( +
+ +
+ ) : null} +
+
+ {showBytes ? ( +
+
+ {libraryId === 'query' ? ( + + ) : ( + + )} + +
+
+ ) : ( + + )} +
+ ) +} diff --git a/app/components/DocsLogo.tsx b/app/components/DocsLogo.tsx new file mode 100644 index 000000000..8e261c2b3 --- /dev/null +++ b/app/components/DocsLogo.tsx @@ -0,0 +1,41 @@ +import { Link } from '@tanstack/react-router' +import { ThemeToggle } from './ThemeToggle' +import { I18nToggle } from '@tanstack-dev/components' + +type Props = { + name: string + libraryId: string + version: string + colorFrom: string + colorTo: string +} + +export const DocsLogo = ({ + name, + version, + colorFrom, + colorTo, + libraryId, +}: Props) => { + const gradientText = `inline-block text-transparent bg-clip-text bg-gradient-to-r ${colorFrom} ${colorTo}` + + return ( + <> + + TanStack + + + {name}{' '} + {version} + + +
+ +
+ + ) +} diff --git a/src/components/FileExplorer.tsx b/app/components/FileExplorer.tsx similarity index 92% rename from src/components/FileExplorer.tsx rename to app/components/FileExplorer.tsx index 8e77b1d5a..dbb85812e 100644 --- a/src/components/FileExplorer.tsx +++ b/app/components/FileExplorer.tsx @@ -8,7 +8,6 @@ import svelteIconUrl from '~/images/file-icons/svelte.svg?url' import vueIconUrl from '~/images/file-icons/vue.svg?url' import textIconUrl from '~/images/file-icons/txt.svg?url' import type { GitHubFileNode } from '~/utils/documents.server' -import { twMerge } from 'tailwind-merge' const getFileIconPath = (filename: string) => { const ext = filename.split('.').pop()?.toLowerCase() || '' @@ -135,7 +134,7 @@ export function FileExplorer({ } } return expanded - }, + } ) const startResizeRef = React.useRef({ @@ -211,7 +210,7 @@ export function FileExplorer({ width: isSidebarOpen ? sidebarWidth : 0, paddingRight: isSidebarOpen ? '0.5rem' : 0, }} - className={`shrink-0 overflow-y-auto bg-linear-to-r from-gray-50 via-gray-50 to-transparent dark:from-gray-800/50 dark:via-gray-800/50 dark:to-transparent shadow-sm ${ + className={`flex-shrink-0 overflow-y-auto bg-gradient-to-r from-gray-50 via-gray-50 to-transparent dark:from-gray-800/50 dark:via-gray-800/50 dark:to-transparent shadow-sm ${ isResizing ? '' : 'transition-all duration-300' }`} > @@ -229,7 +228,6 @@ export function FileExplorer({
) : null}
- {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}
- {props.files.map((file) => ( + {props.files.map((file, index) => (
  • {/* Tree lines */} {file.depth > 0 && ( @@ -291,14 +289,16 @@ const RenderFileTree = (props: { onMouseEnter={() => file.type !== 'dir' && props.prefetchFileContent(file.path) } - className={twMerge( - `px-2 py-1.5 text-left w-full flex items-center gap-2 text-sm rounded transition-colors duration-200 min-w-0`, + className={`px-2 py-1.5 text-left w-full flex items-center gap-2 text-sm rounded transition-colors duration-200 min-w-0 ${ props.currentPath === file.path - ? `${props.libraryColor}/20 text-gray-900 dark:text-white shadow-sm` - : 'hover:bg-gray-200 dark:hover:bg-gray-700 text-gray-600 dark:text-gray-400', - )} + ? `${props.libraryColor.replace( + 'bg-', + 'bg-opacity-20 bg-' + )} text-gray-900 dark:text-white shadow-sm` + : 'hover:bg-gray-200 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300' + }`} > - + {file.type === 'dir' ? ( ) : ( @@ -319,7 +319,7 @@ const RenderFileTree = (props: { function recursiveFlattenGithubContents( nodes: Array, - bannedDirs: Set = new Set(), + bannedDirs: Set = new Set() ): Array { return nodes.flatMap((node) => { if (node.type === 'dir' && node.children && !bannedDirs.has(node.name)) { @@ -330,7 +330,7 @@ function recursiveFlattenGithubContents( } function flattedOnlyToDirs( - nodes: Array, + nodes: Array ): Array { return nodes.flatMap((node) => { if (node.type === 'dir' && node.children) { diff --git a/src/components/Footer.tsx b/app/components/Footer.tsx similarity index 70% rename from src/components/Footer.tsx rename to app/components/Footer.tsx index 6e24299a3..dd4835582 100644 --- a/src/components/Footer.tsx +++ b/app/components/Footer.tsx @@ -1,11 +1,10 @@ import { Link } from '@tanstack/react-router' -import { Card } from './Card' const footerLinks = [ { label: 'Blog', to: '/blog' }, - { label: '@Tan_Stack on X.com', to: 'https://x.com/tan_stack' }, + { label: '@Tan_Stack Twitter', to: 'https://twitter.com/tan_stack' }, { - label: '@TannerLinsley on X.com', + label: '@TannerLinsley Twitter', to: 'https://twitter.com/tannerlinsley', }, { label: 'GitHub', to: 'https://github.com/tanstack' }, @@ -17,14 +16,6 @@ const footerLinks = [ label: 'Nozzle.io - Keyword Rank Tracker', to: 'https://nozzle.io', }, - { - label: 'Ethos', - to: '/ethos', - }, - { - label: 'Tenets', - to: '/tenets', - }, { label: 'Privacy Policy', to: '/privacy', @@ -37,9 +28,10 @@ const footerLinks = [ export function Footer() { return ( -
    {footerLinks.map((item) => ( @@ -54,9 +46,9 @@ export function Footer() {
    ))}
  • -
    +
    © {new Date().getFullYear()} TanStack LLC
    - +
    ) } diff --git a/app/components/FrameworkSelect.tsx b/app/components/FrameworkSelect.tsx new file mode 100644 index 000000000..97cf8d4f4 --- /dev/null +++ b/app/components/FrameworkSelect.tsx @@ -0,0 +1,120 @@ +import { Fragment } from 'react' +import { Listbox, Transition } from '@headlessui/react' + +import { HiCheck, HiChevronDown } from 'react-icons/hi' + +export type SelectOption = { + label: string + value: string + logo?: string +} + +export type SelectProps = { + className?: string + label: string + selected: string + available: T[] + onSelect: (selected: T) => void +} + +export function FrameworkSelect({ + className = '', + label, + selected, + available, + onSelect, +}: SelectProps) { + if (available.length === 0) { + return null + } + + const selectedOption = available.find(({ value }) => selected === value) + + if (!selectedOption) { + return null + } + + return ( +
    +
    {label}
    +
    { + e.preventDefault() + }} + > + +
    + + {selectedOption.logo ? ( +
    + {`${selectedOption.label} +
    + ) : null} + {selectedOption.label} + + +
    + + + {Object.values(available).map((option) => ( + + `relative cursor-default select-none py-2 pr-10 ${ + active + ? 'bg-gray-100 dark:bg-gray-700' + : 'text-gray-900 dark:text-gray-300' + } ${option.logo ? 'pl-10' : 'pl-2'}` + } + value={option} + > + {({ selected }) => ( + <> + {option.logo ? ( +
    + {`${option.label} +
    + ) : null} + + {option.label} + + {selected ? ( + + + ) : null} + + )} +
    + ))} +
    +
    +
    +
    +
    +
    + ) +} diff --git a/app/components/GoogleScripts.tsx b/app/components/GoogleScripts.tsx new file mode 100644 index 000000000..254e5a2e2 --- /dev/null +++ b/app/components/GoogleScripts.tsx @@ -0,0 +1,240 @@ +import { Link } from '@tanstack/react-router' +import React from 'react' +import { twMerge } from 'tailwind-merge' +import { getLibrary, libraries } from '~/libraries' + +declare global { + interface Window { + googletag: + | undefined + | Partial<{ + cmd: { + push: (fn: () => void) => void + } + pubads: () => { + enableSingleRequest: () => void + refresh: (slots: any[]) => void + } + enableServices: () => void + display: (id: string) => void + defineSlot: ( + path: string, + sizes: [number, number][], + id: string + ) => { + addService: (pubads: any) => { + setTargeting: (key: string, value: string[]) => void + } + } + }> + } +} + +const adSlots = { + leaderboard: { + id: 'div-gpt-ad-1738811978953-leaderboard', + sizes: [[728, 90]], + targeting: 'leaderboard', + refreshInterval: 45_000, + }, + footer: { + id: 'div-gpt-ad-1738811978953-footer', + sizes: [[728, 90]], + targeting: 'footer', + refreshInterval: 45_000, + }, + rightRail: { + id: 'div-gpt-ad-1738811978953-right-rail', + sizes: [[300, 250]], + targeting: 'right-side-rail', + refreshInterval: 45_000, + }, + leftRail: { + id: 'div-gpt-ad-1738811978953-left-rail', + sizes: [[300, 250]], + targeting: 'left-side-rail', + refreshInterval: 45_000, + }, +} satisfies Record< + string, + { + id: string + sizes: [number, number][] + targeting: string + refreshInterval: number + } +> + +export function GoogleScripts() { + return ( + <> + + + ) +} + +function Gad({ + name, + children, + ...props +}: { name: keyof typeof adSlots } & React.HTMLAttributes) { + const adSlot = adSlots[name]! + const adId = adSlot.id + + React.useEffect(() => { + const googletag = window.googletag + if (!googletag) return + + const cmd = googletag.cmd + if (!cmd) return + + cmd.push(function () { + // Define all ad slots + const slot = googletag + .defineSlot?.('/23278945940/TopLevel', adSlot.sizes, adSlot.id) + .addService(googletag.pubads?.()) + .setTargeting(adSlot.targeting, [adSlot.targeting]) + + googletag.pubads?.().enableSingleRequest() + googletag.enableServices?.() + googletag.display?.(adId) + + // Set individual refresh intervals for each ad + const interval = setInterval(function () { + cmd.push(function () { + googletag.pubads?.().refresh([slot]) + }) + }, adSlot.refreshInterval) + + return () => clearInterval(interval) + }) + }, []) + + return ( +
    + {/*
    */} +
    {children}
    +
    + ) +} + +export function GadLeader() { + // return ( + //
    + // + //
    + // ) + + return null +} + +export function GadFooter() { + return ( + + ) +} + +const libraryHalfIndex = Math.ceil(libraries.length / 2) + +export function GadRightRailSquare() { + const randomLibrary = React.useMemo(() => { + const sampledLibraries = libraries.slice(0, libraryHalfIndex) + const seed = Math.floor(Date.now() / (1000 * 60 * 5)) // Change seed every 5 minutes + return sampledLibraries[seed % sampledLibraries.length] + }, []) + + return ( + + +
    + TanStack + + {randomLibrary.name.replace('TanStack ', '')} + +
    +
    {randomLibrary.description}
    +
    + +
    + +
    + ) +} + +export function GadLeftRailSquare() { + const randomRemainingLibrary = React.useMemo(() => { + const remainingLibraries = libraries.slice(libraryHalfIndex) + const seed = Math.floor(Date.now() / (1000 * 60 * 5)) // Change seed every 5 minutes + return remainingLibraries[seed % remainingLibraries.length] + }, []) + + return ( + + +
    + TanStack + + {randomRemainingLibrary.name.replace('TanStack ', '')} + +
    +
    + {randomRemainingLibrary.description} +
    +
    + +
    + +
    + ) +} diff --git a/src/components/InteractiveSandbox.tsx b/app/components/InteractiveSandbox.tsx similarity index 94% rename from src/components/InteractiveSandbox.tsx rename to app/components/InteractiveSandbox.tsx index b5c2cdabe..e8cd1fddb 100644 --- a/src/components/InteractiveSandbox.tsx +++ b/app/components/InteractiveSandbox.tsx @@ -28,7 +28,7 @@ export function InteractiveSandbox({ src={embedEditor === 'codesandbox' ? codeSandboxUrl : stackBlitzUrl} title={`${libraryName} | ${examplePath}`} sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts" - className="w-full h-full min-h-[80dvh] overflow-hidden shadow-lg bg-white dark:bg-black" + className="w-full h-full min-h-[80dvh] overflow-hidden shadow-xl shadow-gray-700/20 bg-white dark:bg-black" />
    ) diff --git a/app/components/LandingPageGad.tsx b/app/components/LandingPageGad.tsx new file mode 100644 index 000000000..8c87c1e36 --- /dev/null +++ b/app/components/LandingPageGad.tsx @@ -0,0 +1,38 @@ +import { Link } from '@tanstack/react-router' +import { GadFooter } from './GoogleScripts' + +export default function LandingPageGad() { + return ( +
    +
    +
    + +
    +
    +
    + + An ad on an open source project? + {' '} + What is this, 1999? +
    +
    + Please... TanStack is + 100% privately owned, with no paid products, venture capital, or + acquisition plans. We're a small team dedicated to creating software + used by millions daily. What did you expect? +
    +
    + + Check out our ethos + {' '} + to learn more about how we plan on sticking around (and staying + relevant) for the long-haul. +
    +
    +
    +
    + ) +} diff --git a/src/components/LibraryFeatureHighlights.tsx b/app/components/LibraryFeatureHighlights.tsx similarity index 70% rename from src/components/LibraryFeatureHighlights.tsx rename to app/components/LibraryFeatureHighlights.tsx index 02a132802..eeff2ba19 100644 --- a/src/components/LibraryFeatureHighlights.tsx +++ b/app/components/LibraryFeatureHighlights.tsx @@ -1,5 +1,4 @@ import { Library } from '~/libraries' -import { Card } from './Card' export function LibraryFeatureHighlights({ featureHighlights, @@ -14,22 +13,22 @@ export function LibraryFeatureHighlights({ > {featureHighlights?.map((featureHighlight) => { return ( - - +
    {featureHighlight.icon} - +

    {featureHighlight.title}

    -
    +

    {featureHighlight.description} -

    +

    -
    +
    ) })}
    diff --git a/src/components/Logo.tsx b/app/components/Logo.tsx similarity index 99% rename from src/components/Logo.tsx rename to app/components/Logo.tsx index 509aade55..ee17d86ff 100644 --- a/src/components/Logo.tsx +++ b/app/components/Logo.tsx @@ -1,8 +1,6 @@ -import { BrandContextMenu } from '~/components/BrandContextMenu' - export function Logo(props: React.HTMLProps) { return ( - +
    ) { - +
    ) } diff --git a/src/components/LogoColor.tsx b/app/components/LogoColor.tsx similarity index 99% rename from src/components/LogoColor.tsx rename to app/components/LogoColor.tsx index 48175d645..4cfb79f07 100644 --- a/src/components/LogoColor.tsx +++ b/app/components/LogoColor.tsx @@ -1,8 +1,6 @@ -import { BrandContextMenu } from '~/components/BrandContextMenu' - export function LogoColor(props: React.HTMLProps) { return ( - +
    ) { - +
    ) } diff --git a/src/components/LogoQueryGG.tsx b/app/components/LogoQueryGG.tsx similarity index 98% rename from src/components/LogoQueryGG.tsx rename to app/components/LogoQueryGG.tsx index bfc3c6070..207f4e681 100644 --- a/src/components/LogoQueryGG.tsx +++ b/app/components/LogoQueryGG.tsx @@ -213,7 +213,7 @@ export function LogoQueryGG(props: React.HTMLProps) {
    diff --git a/src/components/LogoQueryGGSmall.tsx b/app/components/LogoQueryGGSmall.tsx similarity index 97% rename from src/components/LogoQueryGGSmall.tsx rename to app/components/LogoQueryGGSmall.tsx index 56d00f537..0ff66c196 100644 --- a/src/components/LogoQueryGGSmall.tsx +++ b/app/components/LogoQueryGGSmall.tsx @@ -220,7 +220,7 @@ export function LogoQueryGGSmall(props: React.HTMLProps) {
    diff --git a/app/components/Markdown.tsx b/app/components/Markdown.tsx new file mode 100644 index 000000000..85c6795c3 --- /dev/null +++ b/app/components/Markdown.tsx @@ -0,0 +1,257 @@ +import * as React from 'react' +import { FaRegCopy } from 'react-icons/fa' +import { MarkdownLink } from '~/components/MarkdownLink' +import type { HTMLProps } from 'react' +import { createHighlighter as shikiGetHighlighter } from 'shiki/bundle-web.mjs' +import { transformerNotationDiff } from '@shikijs/transformers' +import parse, { + attributesToProps, + domToReact, + Element, + HTMLReactParserOptions, +} from 'html-react-parser' +import { marked } from 'marked' +import { gfmHeadingId } from 'marked-gfm-heading-id' +import markedAlert from 'marked-alert' + +const CustomHeading = ({ + Comp, + id, + ...props +}: HTMLProps & { + Comp: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' +}) => { + if (id) { + return ( + *]:scroll-my-[5rem] [&>*]:lg:scroll-my-4`} + > + + + ) + } + return +} + +const makeHeading = + (type: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6') => + (props: HTMLProps) => + ( + + ) + +const markdownComponents: Record = { + a: MarkdownLink, + pre: CodeBlock, + h1: makeHeading('h1'), + h2: makeHeading('h2'), + h3: makeHeading('h3'), + h4: makeHeading('h4'), + h5: makeHeading('h5'), + h6: makeHeading('h6'), + code: function Code({ className, ...rest }: HTMLProps) { + return ( + + ) + }, + iframe: (props) => ( + +
    + +
    +
    + Wow, you've come a long way! +
    +
    + Only one thing left to do... +
    +
    + + Get Started! + +
    +
    +
    +
    + + ) +} diff --git a/app/routes/_libraries/index.tsx b/app/routes/_libraries/index.tsx new file mode 100644 index 000000000..df1d6b07a --- /dev/null +++ b/app/routes/_libraries/index.tsx @@ -0,0 +1,507 @@ +import { + Await, + Link, + MatchRoute, + createFileRoute, + getRouteApi, +} from '@tanstack/react-router' +import { Carbon } from '~/components/Carbon' +import { twMerge } from 'tailwind-merge' +import { CgSpinner } from 'react-icons/cg' +import { Footer } from '~/components/Footer' +import SponsorPack from '~/components/SponsorPack' +import discordImage from '~/images/discord-logo-white.svg' +import { useMutation } from '~/hooks/useMutation' +import { sample } from '~/utils/utils' +import { librariesByGroup, librariesGroupNamesMap, Library } from '~/libraries' +import bytesImage from '~/images/bytes.svg' +import { partners } from '../../utils/partners' +import OpenSourceStats from '~/components/OpenSourceStats' +import splashLightImg from '~/images/splash-light.png' +import splashDarkImg from '~/images/splash-dark.png' +import { GadFooter } from '~/components/GoogleScripts' +import LandingPageGad from '~/components/LandingPageGad' + +export const textColors = [ + `text-rose-500`, + `text-yellow-500`, + `text-teal-500`, + `text-blue-500`, +] + +export const gradients = [ + `from-rose-500 to-yellow-500`, + `from-yellow-500 to-teal-500`, + `from-teal-500 to-violet-500`, + `from-blue-500 to-pink-500`, +] + +const courses = [ + { + name: 'The Official TanStack React Query Course', + cardStyles: `border-t-4 border-red-500 hover:(border-green-500)`, + href: 'https://query.gg/?s=tanstack', + description: `Learn how to build enterprise quality apps with TanStack's React Query the easy way with our brand new course.`, + }, +] + +export const Route = createFileRoute('/_libraries/')({ + loader: () => { + return { + randomNumber: Math.random(), + } + }, + component: Index, +}) + +async function bytesSignupServerFn({ email }: { email: string }) { + 'use server' + + return fetch(`https://bytes.dev/api/bytes-optin-cors`, { + method: 'POST', + body: JSON.stringify({ + email, + influencer: 'tanstack', + }), + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + }) +} + +const librariesRouteApi = getRouteApi('/_libraries') + +function Index() { + const bytesSignupMutation = useMutation({ + fn: bytesSignupServerFn, + }) + + const { randomNumber } = Route.useLoaderData() + const { sponsorsPromise } = librariesRouteApi.useLoaderData() + const gradient = sample(gradients, randomNumber) + + return ( + <> + {/* + */} +
    +
    + TanStack Logo + TanStack Logo +
    +
    +

    + + TanStack + +

    +
    +

    + High-quality open-source software for{' '} + + web developers. + +

    +

    + Headless, type-safe, & powerful utilities for Web Applications, + Routing, State Management, Data Visualization, Datagrids/Tables, + and more. +

    +
    +
    +
    +
    + +
    +
    +
    +

    Open Source Libraries

    + + {Object.entries(librariesByGroup).map( + ([groupName, groupLibraries]: [string, Library[]]) => ( +
    +

    + { + librariesGroupNamesMap[ + groupName as keyof typeof librariesGroupNamesMap + ] + } +

    + {/* Library Cards */} +
    + {groupLibraries.map((library, i: number) => { + return ( + + {/* Background content that will blur on hover */} +
    +
    + { + return ( +
    + + + TanStack + + + + {library.name.replace('TanStack ', '')} + +
    + ) + }} + /> +
    +
    + {library.tagline} +
    + + {/* Description preview with ellipsis */} +
    + {library.description} +
    +
    + + {/* Foreground content that appears on hover */} +
    +
    + {library.description} +
    +
    + + Click to learn more + + + + +
    +
    + {/* Badge */} + {library.badge ? ( +
    +
    + 4 + ? 'absolute top-[16px] right-[-2px]' + : 'absolute top-[14px] right-[5px]' + )} + > + {library.badge} + +
    + ) : null} + + ) + })} +
    +
    + ) + )} +
    +
    +
    +

    Partners

    +
    + {partners.map((partner) => { + return ( + +
    + {partner.homepageImg} +
    +
    + {partner.content} +
    +
    + ) + })} +
    +
    +
    +
    +

    Courses

    + +
    +
    +
    +

    OSS Sponsors

    +
    +
    + } + children={(sponsors) => { + return + }} + /> +
    +
    +
    + +
    +

    + Sponsors get special perks like{' '} + + private discord channels, priority issue requests, direct + support and even course vouchers + + ! +

    +
    +
    +
    + +
    +
    +
    +
    + Discord Logo +
    +
    +

    TanStack on Discord

    +

    + The official TanStack community to ask questions, network and + make new friends and get lightning fast news about what's coming + next for TanStack! +

    +
    + +
    +
    +
    +
    +
    + {!bytesSignupMutation.submittedAt ? ( +
    { + e.preventDefault() + const formData = new FormData(e.currentTarget) + + bytesSignupMutation.mutate({ + email: formData.get('email_address')?.toString() || '', + }) + }} + > +
    +
    +

    Subscribe to Bytes

    +
    + Bytes Logo +
    +
    + +

    + The Best JavaScript Newsletter +

    +
    +
    + + +
    + {bytesSignupMutation.error ? ( +

    + Looks like something went wrong. Please try again. +

    + ) : ( +

    + Join over 100,000 devs +

    + )} +
    + ) : ( +

    🎉 Thank you! Please confirm your email

    + )} +
    +
    +
    +
    +
    + + ) +} diff --git a/app/routes/_libraries/learn.tsx b/app/routes/_libraries/learn.tsx new file mode 100644 index 000000000..1ee464273 --- /dev/null +++ b/app/routes/_libraries/learn.tsx @@ -0,0 +1,131 @@ +import { createFileRoute, Link } from '@tanstack/react-router' +import { seo } from '~/utils/seo' +import { FaCheckCircle } from 'react-icons/fa' +import { LogoQueryGG } from '~/components/LogoQueryGG' + +export const Route = createFileRoute('/_libraries/learn')({ + component: LoginComp, + head: () => ({ + meta: seo({ + title: 'Learn | TanStack', + description: `Education and learning resources for TanStack libraries and projects`, + keywords: `learn,course,education,learning,resources,training`, + }), + }), +}) + +function LoginComp() { + return ( +
    +
    +
    +
    +

    +
    + Educational Resources +
    +
    + for TanStack Libraries +
    +

    +

    + Whether you're just getting started or looking to level up as an + individual or team, we have resources that will help you succeed. +

    +
    +
    + + +
    +
    +
    + Created by{' '} + Dominik Dorfmeister and{' '} + ui.dev +
    +
    + +
    + “This is the best way to learn how to use React Query in + real-world applications.” +
    —Tanner Linsley
    +
    + +
    +
    + + + +
    Save time by learning with a guided approach
    +
    +
    + + + +
    + Get hands-on experience building a real-world application +
    +
    +
    + + + +
    Never worry about data fetching again
    +
    +
    +
    + +
    +
    + More Coming Soon! +
    +
    + {/* +
    + GitHub +
    +
    + {['Bug Reports', 'Feature Requests', 'Source Code'].map((d) => ( +
    + {d} +
    + ))} +
    + + +
    + Dedicated Support +
    +
    + {['Consulting', 'Enterprise Support Contracts'].map((d) => ( +
    +
    + {d} +
    +
    + ))} +
    + */} +
    +
    +
    +
    + ) +} diff --git a/app/routes/_libraries/pacer.$version.index.tsx b/app/routes/_libraries/pacer.$version.index.tsx new file mode 100644 index 000000000..e1e688193 --- /dev/null +++ b/app/routes/_libraries/pacer.$version.index.tsx @@ -0,0 +1,242 @@ +import { CgSpinner } from 'react-icons/cg' +import * as React from 'react' +import { Link, createFileRoute, getRouteApi } from '@tanstack/react-router' +import { Carbon } from '~/components/Carbon' +import { Footer } from '~/components/Footer' +import { TbHeartHandshake } from 'react-icons/tb' +import { FaCheckCircle } from 'react-icons/fa' +import SponsorPack from '~/components/SponsorPack' +import { pacerProject } from '~/libraries/pacer' +import { Await } from '@tanstack/react-router' +import { seo } from '~/utils/seo' +import { twMerge } from 'tailwind-merge' +import { getLibrary } from '~/libraries' +import { LibraryFeatureHighlights } from '~/components/LibraryFeatureHighlights' +import { partners } from '~/utils/partners' +import LandingPageGad from '~/components/LandingPageGad' + +export const Route = createFileRoute('/_libraries/pacer/$version/')({ + component: PacerVersionIndex, + head: () => ({ + meta: seo({ + title: pacerProject.name, + description: pacerProject.description, + }), + }), +}) + +const librariesRouteApi = getRouteApi('/_libraries') +const library = getLibrary('pacer') + +export default function PacerVersionIndex() { + const { sponsorsPromise } = librariesRouteApi.useLoaderData() + const { version } = Route.useParams() + + const gradientText = `pr-1 inline-block text-transparent bg-clip-text bg-gradient-to-r ${pacerProject.colorFrom} ${pacerProject.colorTo}` + + return ( + <> +
    +
    +

    + TanStack + Pacer +

    +

    + + Framework agnostic + {' '} + type-safe rate-limiting and queueing utilities +

    +

    + Take control of your application's timing with TanStack Pacer's{' '} + rate limiting, throttling, and debouncing utilities + . Manage complex async workflows using{' '} + intelligent queuing and concurrency controls while + maintaining full control with built-in pause, resume, and cancel + capabilities. +

    + + Get Started + +
    + + +
    +
    +

    + Framework Agnostic & Feature Rich +

    +

    + TanStack Pacer's API is highly modular and framework-independent + while still prioritizing ergonomics. Behold, the obligatory + feature-list: +

    +
    +
    + {[ + 'Lightweight', + 'Tree-Shaking', + 'Type-Safe', + 'Rate Limiting', + 'Throttling', + 'Debouncing', + 'Queueing', + 'LIFO/FIFO/Dequeue Ordering', + 'Concurrency Control', + 'Queue Prioritization', + 'Pause/Resume Controls', + 'Cancellation', + 'Abort Controller Support', + 'Promise Integration', + 'Multiple Layers of Abstraction', + ].map((d, i) => { + return ( + + {d} + + ) + })} +
    +
    + +
    +

    + Partners +

    +
    +
    + {partners + .filter((d) => d.libraries?.includes('pacer')) + .map((partner) => { + return ( + +
    + {partner.homepageImg} +
    +
    + {partner.content} +
    +
    + ) + })} +
    +
    + +
    +

    + Sponsors +

    +
    + } + children={(sponsors) => { + return + }} + /> +
    + +
    + + + + {/*
    +
    +

    + Take it for a spin! +

    +

    + With just a few lines of code, you can start using powerful rate + limiting, throttling, debouncing, and queueing utilities. +

    +
    + {( + [ + { label: 'React', value: 'react' }, + // More adapters coming soon + // { label: 'Solid', value: 'solid' }, + // { label: 'Svelte', value: 'svelte' }, + // { label: 'Vue', value: 'vue' }, + // { label: 'Vanilla', value: 'vanilla' }, + ] as const + ).map((item) => ( + + ))} +
    +
    +
    + +
    + +
    */} + +
    +
    + Wow, you've come a long way! +
    +
    + Only one thing left to do... +
    +
    + + Get Started! + +
    +
    +
    +
    + + ) +} diff --git a/src/routes/privacy.tsx b/app/routes/_libraries/privacy.tsx similarity index 98% rename from src/routes/privacy.tsx rename to app/routes/_libraries/privacy.tsx index c05b9a9a7..ed00d8aa8 100644 --- a/src/routes/privacy.tsx +++ b/app/routes/_libraries/privacy.tsx @@ -2,7 +2,7 @@ import { createFileRoute } from '@tanstack/react-router' import { Footer } from '~/components/Footer' import { seo } from '~/utils/seo' -export const Route = createFileRoute('/privacy')({ +export const Route = createFileRoute('/_libraries/privacy')({ component: RouteComp, head: () => ({ meta: seo({ @@ -12,7 +12,7 @@ export const Route = createFileRoute('/privacy')({ }), }) -function RouteComp() { +export default function RouteComp() { return (
    diff --git a/app/routes/_libraries/query.$version.index.tsx b/app/routes/_libraries/query.$version.index.tsx new file mode 100644 index 000000000..f54bcf80d --- /dev/null +++ b/app/routes/_libraries/query.$version.index.tsx @@ -0,0 +1,352 @@ +import * as React from 'react' + +import { CgSpinner } from 'react-icons/cg' +import { FaCheckCircle } from 'react-icons/fa' +import { Await, Link, getRouteApi } from '@tanstack/react-router' +import { Carbon } from '~/components/Carbon' +import { Footer } from '~/components/Footer' +import { TbHeartHandshake } from 'react-icons/tb' +import SponsorPack from '~/components/SponsorPack' +// import { QueryGGBanner } from '~/components/QueryGGBanner' +import { QueryGGBannerSale } from '~/components/QueryGGBannerSale' +import { queryProject } from '~/libraries/query' +import { createFileRoute } from '@tanstack/react-router' +import { Framework, getBranch, getLibrary } from '~/libraries' +import { seo } from '~/utils/seo' +import { twMerge } from 'tailwind-merge' +import { LibraryFeatureHighlights } from '~/components/LibraryFeatureHighlights' +import { partners } from '~/utils/partners' +import LandingPageGad from '~/components/LandingPageGad' +export const Route = createFileRoute('/_libraries/query/$version/')({ + component: VersionIndex, + head: () => ({ + meta: seo({ + title: queryProject.name, + description: queryProject.description, + }), + }), +}) + +const librariesRouteApi = getRouteApi('/_libraries') + +const library = getLibrary('query') + +export default function VersionIndex() { + const { sponsorsPromise } = librariesRouteApi.useLoaderData() + const { version } = Route.useParams() + const branch = getBranch(queryProject, version) + const [framework, setFramework] = React.useState('react') + const [isDark, setIsDark] = React.useState(true) + + React.useEffect(() => { + setIsDark(window.matchMedia?.(`(prefers-color-scheme: dark)`).matches) + }, []) + + const gradientText = `pr-1 inline-block leading-snug text-transparent bg-clip-text bg-gradient-to-r ${queryProject.colorFrom} ${queryProject.colorTo}` + + return ( +
    +
    +
    +
    + +

    + TanStack + Query +

    +

    + Powerful{' '} + + asynchronous state management + {' '} + for TS/JS, React, Solid, Vue, Svelte and Angular +

    +

    + Toss out that granular state management, manual refetching and + endless bowls of async-spaghetti code. TanStack Query gives you + declarative, always-up-to-date auto-managed queries and mutations + that{' '} + + directly improve both your developer and user experiences + + . +

    +
    + + Read the Docs + +

    + (or{' '} + + check out our official course + + . It’s on sale!) +

    +
    + {/* */} +
    + + +
    +
    +

    + No dependencies. All the Features. +

    +

    + With zero dependencies, TanStack Query is extremely lean given + the dense feature set it provides. From weekend hobbies all the + way to enterprise e-commerce systems (Yes, I'm lookin' at you + Walmart! 😉), TanStack Query is the battle-hardened tool to help + you succeed at the speed of your creativity. +

    +
    +
    + {[ + 'Backend agnostic', + 'Dedicated Devtools', + 'Auto Caching', + 'Auto Refetching', + 'Window Focus Refetching', + 'Polling/Realtime Queries', + 'Parallel Queries', + 'Dependent Queries', + 'Mutations API', + 'Automatic Garbage Collection', + 'Paginated/Cursor Queries', + 'Load-More/Infinite Scroll Queries', + 'Scroll Recovery', + 'Request Cancellation', + 'Suspense Ready!', + 'Render-as-you-fetch', + 'Prefetching', + 'Variable-length Parallel Queries', + 'Offline Support', + 'SSR Support', + 'Data Selectors', + ].map((d, i) => { + return ( + + {d} + + ) + })} +
    +
    + +
    +
    + Trusted in Production by +
    + {/* @ts-ignore */} + +
    + {(new Array(4) as string[]) + .fill('') + .reduce( + (all) => [...all, ...all], + [ + 'Google', + 'Walmart', + 'Facebook', + 'PayPal', + 'Amazon', + 'American Express', + 'Microsoft', + 'Target', + 'Ebay', + 'Autodesk', + 'CarFAX', + 'Docusign', + 'HP', + 'MLB', + 'Volvo', + 'Ocado', + 'UPC.ch', + 'EFI.com', + 'ReactBricks', + 'Nozzle.io', + 'Uber', + ] + ) + .map((d, i) => ( + + {d} + + ))} +
    + {/* @ts-ignore */} +
    +
    + +
    +

    + Partners +

    +
    +
    + {partners + .filter((d) => d.libraries?.includes('query')) + .map((partner) => { + return ( + +
    + {partner.homepageImg} +
    +
    + {partner.content} +
    +
    + ) + })} +
    +
    + +
    +

    + Sponsors +

    +
    + } + children={(sponsors) => { + return + }} + /> +
    + +
    + + + +
    +
    +

    + Less code, fewer edge cases. +

    +

    + Instead of writing reducers, caching logic, timers, retry logic, + complex async/await scripting (I could keep going...), you + literally write a tiny fraction of the code you normally would. + You will be surprised at how little code you're writing or how + much code you're deleting when you use TanStack Query. Try it + out with one of the examples below! +

    +
    + {( + [ + { label: 'Angular', value: 'angular' }, + { label: 'React', value: 'react' }, + { label: 'Solid', value: 'solid' }, + { label: 'Svelte', value: 'svelte' }, + { label: 'Vue', value: 'vue' }, + ] as const + ).map((item) => ( + + ))} +
    +
    +
    + + {[''].includes(framework) ? ( +
    +
    + Looking for the @tanstack/{framework}-query{' '} + example? We could use your help to build the{' '} + @tanstack/{framework}-query adapter! Join the{' '} + + TanStack Discord Server + {' '} + and let's get to work! +
    +
    + ) : ( +
    + +
    + )} + +
    +
    + Wow, you've come a long way! +
    +
    + Only one thing left to do... +
    +
    + + Read the Docs! + +
    +
    +
    +
    +
    +
    + ) +} diff --git a/app/routes/_libraries/ranger.$version.index.tsx b/app/routes/_libraries/ranger.$version.index.tsx new file mode 100644 index 000000000..34dc7d646 --- /dev/null +++ b/app/routes/_libraries/ranger.$version.index.tsx @@ -0,0 +1,158 @@ +import * as React from 'react' +import { CgSpinner } from 'react-icons/cg' +import { Await, Link } from '@tanstack/react-router' +import { rangerProject } from '~/libraries/ranger' +import { Carbon } from '~/components/Carbon' +import { Footer } from '~/components/Footer' +import SponsorPack from '~/components/SponsorPack' +import { createFileRoute } from '@tanstack/react-router' +import { getRouteApi } from '@tanstack/react-router' +import { Framework, getBranch, getLibrary } from '~/libraries' +import { seo } from '~/utils/seo' +import { twMerge } from 'tailwind-merge' +import { LibraryFeatureHighlights } from '~/components/LibraryFeatureHighlights' +import LandingPageGad from '~/components/LandingPageGad' + +export const Route = createFileRoute('/_libraries/ranger/$version/')({ + component: VersionIndex, + head: () => ({ + meta: seo({ + title: rangerProject.name, + description: rangerProject.description, + }), + }), +}) + +const librariesRouteApi = getRouteApi('/_libraries') +const library = getLibrary('ranger') + +export default function VersionIndex() { + const { sponsorsPromise } = librariesRouteApi.useLoaderData() + const { version } = Route.useParams() + const branch = getBranch(rangerProject, version) + const [framework] = React.useState('react') + const [isDark, setIsDark] = React.useState(true) + + React.useEffect(() => { + setIsDark(window.matchMedia?.(`(prefers-color-scheme: dark)`).matches) + }, []) + + const gradientText = `pr-1 inline-block leading-snug text-transparent bg-clip-text bg-gradient-to-r ${rangerProject.colorFrom} ${rangerProject.colorTo}` + + return ( + <> +
    +
    +

    + TanStack + Ranger +

    +

    + + Headless + {' '} + Modern and headless Range Selector UI Library +

    +

    + A fully typesafe hooks for building range and multi-range sliders in + React. +

    + + Get Started + +
    + + +
    +

    + Sponsors +

    +
    + } + children={(sponsors) => { + return + }} + /> +
    + +
    + + + +
    +
    +

    + Take it for a spin! +

    +

    + Let's see it in action! +

    +
    +
    + +
    + +
    +
    +
    + Wow, you've come a long way! +
    +
    + Only one thing left to do... +
    +
    + + Get Started! + +
    +
    +
    +
    + + ) +} diff --git a/app/routes/_libraries/route.tsx b/app/routes/_libraries/route.tsx new file mode 100644 index 000000000..aed7e71f4 --- /dev/null +++ b/app/routes/_libraries/route.tsx @@ -0,0 +1,325 @@ +import * as React from 'react' +import { + Link, + Outlet, + createFileRoute, + useLocation, +} from '@tanstack/react-router' +import { CgClose, CgMenuLeft, CgMusicSpeaker } from 'react-icons/cg' +import { MdLibraryBooks, MdLineAxis, MdSupport } from 'react-icons/md' +import { twMerge } from 'tailwind-merge' +import { sortBy } from '~/utils/utils' +import logoColor100w from '~/images/logo-color-100w.png' +import { FaDiscord, FaGithub, FaInstagram, FaTshirt } from 'react-icons/fa' +import { getSponsorsForSponsorPack } from '~/server/sponsors' +import { libraries } from '~/libraries' +import { Scarf } from '~/components/Scarf' +import { ThemeToggle, useThemeStore } from '~/components/ThemeToggle' +import { TbBrandBluesky, TbBrandTwitter } from 'react-icons/tb' +import { BiSolidCheckShield } from 'react-icons/bi' +import { SearchButton } from '~/components/SearchButton' +import {I18nToggle} from '@tanstack-dev/components' + +export const Route = createFileRoute('/_libraries')({ + staleTime: Infinity, + loader: async (ctx) => { + return { + sponsorsPromise: getSponsorsForSponsorPack(), + } + }, + component: LibrariesLayout, +}) + +function LibrariesLayout() { + const activeLibrary = useLocation({ + select: (location) => { + return libraries.find((library) => { + return location.pathname.startsWith(library.to) + }) + }, + }) + const href = useLocation().href; + + const detailsRef = React.useRef(null!) + const linkClasses = `flex items-center justify-between group px-2 py-1 rounded-lg hover:bg-gray-500 hover:bg-opacity-10 font-black` + + const items = ( + <> + {sortBy(libraries, (d) => !d.name.includes('TanStack')).map( + (library, i) => { + const [prefix, name] = library.name.split(' ') + + return ( +
    + {library.to.startsWith('http') ? ( + + + + {prefix} + {' '} + {name} + + + ) : ( +
    + { + detailsRef.current.removeAttribute('open') + }} + > + {(props) => { + return ( +
    + + + {prefix} + {' '} + + {name} + + + {library.badge ? ( + + {library.badge} + + ) : null} +
    + ) + }} + +
    + {library.menu?.map((item, i) => { + return ( + + {item.icon} + {item.label} + + ) + })} +
    +
    + )} +
    + ) + } + )} +
    +
    +
    + {[ + { + label: 'Support', + icon: , + to: '/support', + }, + { + label: 'Learn', + icon: , + to: '/learn', + }, + { + label: ( + + Stats + + BETA + + + ), + icon: , + to: '/stats/npm', + }, + { + label: 'Discord', + icon: , + to: 'https://tlinz.com/discord', + target: '_blank', + }, + { + label: 'Merch', + icon: , + to: 'https://cottonbureau.com/people/tanstack', + }, + { + label: 'Blog', + icon: , + to: '/blog', + }, + { + label: 'GitHub', + icon: , + to: 'https://github.com/tanstack', + }, + { + label: 'Ethos', + icon: , + to: '/ethos', + }, + ].map((item, i) => { + return ( + +
    +
    + {item.icon} +
    +
    {item.label}
    +
    + + ) + })} + + ) + + const logo = ( +
    + + +
    TanStack
    + + +
    + +
    +
    + ) + + const smallMenu = ( +
    +
    + +
    + + + {logo} +
    +
    +
    +
    + +
    +
    + {items} +
    +
    +
    +
    + ) + + const largeMenu = ( + <> +
    +
    + {logo} +
    +
    + +
    +
    +
    + {items} +
    +
    +
    + + ) + + return ( +
    + {smallMenu} + {largeMenu} +
    + +
    + {activeLibrary?.scarfId ? : null} +
    + ) +} diff --git a/app/routes/_libraries/router.$version.index.tsx b/app/routes/_libraries/router.$version.index.tsx new file mode 100644 index 000000000..cd310be2a --- /dev/null +++ b/app/routes/_libraries/router.$version.index.tsx @@ -0,0 +1,267 @@ +import * as React from 'react' +import { CgSpinner } from 'react-icons/cg' +import { FaCheckCircle } from 'react-icons/fa' +import { + Await, + Link, + createFileRoute, + getRouteApi, +} from '@tanstack/react-router' +import { routerProject } from '~/libraries/router' +import { Footer } from '~/components/Footer' +import SponsorPack from '~/components/SponsorPack' +import { Framework, getBranch, getLibrary } from '~/libraries' +import { seo } from '~/utils/seo' +import { partners } from '~/utils/partners' +import { twMerge } from 'tailwind-merge' +import { LibraryFeatureHighlights } from '~/components/LibraryFeatureHighlights' +import LandingPageGad from '~/components/LandingPageGad' + +export const Route = createFileRoute('/_libraries/router/$version/')({ + component: RouterVersionIndex, + head: () => ({ + meta: seo({ + title: routerProject.name, + description: routerProject.description, + }), + }), +}) + +const librariesRouteApi = getRouteApi('/_libraries') + +const library = getLibrary('router') + +function RouterVersionIndex() { + const { sponsorsPromise } = librariesRouteApi.useLoaderData() + const { version } = Route.useParams() + const branch = getBranch(routerProject, version) + const [framework] = React.useState('react') + const [isDark, setIsDark] = React.useState(true) + + React.useEffect(() => { + setIsDark(window.matchMedia?.(`(prefers-color-scheme: dark)`).matches) + }, []) + + const gradientText = `pr-1 inline-block text-transparent bg-clip-text bg-gradient-to-r ${routerProject.colorFrom} ${routerProject.colorTo}` + + return ( +
    +
    +

    + TanStack + Router +

    +

    + + Modern and scalable + {' '} + routing for React and Solid applications +

    +

    + A fully type-safe router with built-in data fetching, stale-while + revalidate caching and first-class search-param APIs. +

    + + Get Started + +
    + +
    +

    + Partners +

    +
    +
    + {partners + .filter((d) => d.libraries?.includes('router')) + .map((partner) => { + return ( + +
    + {partner.homepageImg} +
    +
    + {partner.content} +
    +
    + ) + })} +
    +
    + +
    +
    +

    + Feature Rich and Lightweight +

    +

    + Behold, the obligatory feature-list: +

    +
    +
    + {[ + '100% Typesafe', + 'Parallel Route Loaders', + '1st-class Search Param APIs', + 'Nested/Layout Routes', + 'Lightweight (12kb)', + 'Suspense + Transitions', + 'Strict Navigation', + 'Auto-completed Paths', + 'Search Param Schemas', + 'Search Param Validation', + 'Search Param Parsing + Serialization', + 'Search Param Pre/Post Processing', + 'Structural Sharing', + 'Automatic Prefetching', + 'Asynchronous Elements', + 'Pending Elements', + 'Error Boundaries', + ].map((d, i) => { + return ( + + {d} + + ) + })} +
    +
    + +
    +

    + Sponsors +

    +
    + } + children={(sponsors) => { + return + }} + /> +
    + +
    + + + +
    +
    +
    +

    + Take it for a spin! +

    +

    + Create a route, pop in a Router, and start slingin' some code! +

    + {/*
    + {( + [ + { label: 'React', value: 'react' }, + { label: 'Preact', value: 'preact' }, + { label: 'Solid', value: 'solid' }, + { label: 'Vue', value: 'vue' }, + { label: 'Svelte', value: 'svelte' }, + ] as const + ).map((item) => ( + + ))} +
    */} +
    +
    + + {/* {['preact', 'vue', 'solid', 'svelte'].includes(framework) ? ( +
    +
    + Looking for the @tanstack/{framework}-router{' '} + example? The @tanstack/{framework}-router adapter + is currently under development! Join the{' '} + + TanStack Discord Server + {' '} + and help us make routing in {framework} a better place! +
    +
    + ) : ( */} +
    + +
    +
    + +
    +
    + Wow, you've come a long way! +
    +
    + Only one thing left to do... +
    +
    + + Get Started! + +
    +
    +
    +
    + ) +} diff --git a/app/routes/_libraries/start.$version.index.tsx b/app/routes/_libraries/start.$version.index.tsx new file mode 100644 index 000000000..f0e8dfedc --- /dev/null +++ b/app/routes/_libraries/start.$version.index.tsx @@ -0,0 +1,452 @@ +import * as React from 'react' + +import { CgSpinner } from 'react-icons/cg' +import { FaBook, FaGithub, FaTwitter } from 'react-icons/fa' +import { Await, Link, getRouteApi } from '@tanstack/react-router' +import { Carbon } from '~/components/Carbon' +import { Footer } from '~/components/Footer' +import SponsorPack from '~/components/SponsorPack' +import { startProject } from '~/libraries/start' +import { createFileRoute } from '@tanstack/react-router' +import { seo } from '~/utils/seo' +import { partners } from '~/utils/partners' +import { VscPreview } from 'react-icons/vsc' +import { twMerge } from 'tailwind-merge' +import { getLibrary } from '~/libraries' +import { LibraryFeatureHighlights } from '~/components/LibraryFeatureHighlights' +import LandingPageGad from '~/components/LandingPageGad' + +export const Route = createFileRoute('/_libraries/start/$version/')({ + component: VersionIndex, + head: () => ({ + meta: seo({ + title: startProject.name, + description: startProject.description, + }), + }), +}) + +const librariesRouteApi = getRouteApi('/_libraries') + +const library = getLibrary('start') + +export default function VersionIndex() { + const { sponsorsPromise } = librariesRouteApi.useLoaderData() + const [isDark, setIsDark] = React.useState(true) + + React.useEffect(() => { + if (isDark) { + // + } + setIsDark(window.matchMedia?.(`(prefers-color-scheme: dark)`).matches) + }, [isDark]) + + const gradientText = `pr-1 text-transparent bg-clip-text bg-gradient-to-r ${startProject.colorFrom} ${startProject.colorTo}` + + return ( +
    +
    +

    + TanStack + Start +

    + {/*
    */} +
    + STATUS: BETA + {/* {version === 'latest' ? latestVersion : version} */} +
    + {/*
    */} +

    + Full-stack React and Solid framework{' '} + + powered by TanStack Router + {' '} +

    +

    + SSR, Streaming, Server Functions, API Routes, bundling and more + powered by TanStack Router and Vite. + Ready to deploy to your favorite hosting provider. +

    +
    + + Try it in 60 seconds + + + Get Started + +
    +
    + +
    +
    + When can I use it? +
    +
    +
    + You can use TanStack Start BETA today! Although + currently in active development, we do not expect any more breaking + changes. We invite you to provide feedback to help us on the journey + to 1.0! If you choose to ship a BETA Start app to production, we + recommend locking your dependencies to a specific version and + keeping up with the latest releases. +
    +
    +
    + + See an Example + + + Try the BETA + + + TanStack.com Source + + + Tweet about it! + {' '} +
    +
    + + {/*
    +
    + +
    +

    + Built on TanStack Router +

    +

    + Writing your data fetching logic by hand is over. Tell TanStack + Query where to get your data and how fresh you need it to be and + the rest is automatic. It handles{' '} + + caching, background updates and stale data out of the box with + zero-configuration + + . +

    +
    +
    +
    +
    + +
    +
    +

    + Simple & Familiar +

    +

    + If you know how to work with promises or async/await, then you + already know how to use TanStack Query. There's{' '} + + no global state to manage, reducers, normalization systems or + heavy configurations to understand + + . Simply pass a function that resolves your data (or throws an + error) and the rest is history. +

    +
    +
    +
    +
    + +
    +
    +

    + Extensible +

    +

    + TanStack Query is configurable down to each observer instance of a + query with knobs and options to fit every use-case. It comes wired + up with{' '} + + dedicated devtools, infinite-loading APIs, and first class + mutation tools that make updating your data a breeze + + . Don't worry though, everything is pre-configured for success! +

    +
    +
    +
    */} + + {/*
    +
    +

    + No dependencies. All the Features. +

    +

    + With zero dependencies, TanStack Query is extremely lean given the + dense feature set it provides. From weekend hobbies all the way to + enterprise e-commerce systems (Yes, I'm lookin' at you Walmart! 😉), + TanStack Query is the battle-hardened tool to help you succeed at + the speed of your creativity. +

    +
    +
    + {[ + 'Backend agnostic', + 'Dedicated Devtools', + 'Auto Caching', + 'Auto Refetching', + 'Window Focus Refetching', + 'Polling/Realtime Queries', + 'Parallel Queries', + 'Dependent Queries', + 'Mutations API', + 'Automatic Garbage Collection', + 'Paginated/Cursor Queries', + 'Load-More/Infinite Scroll Queries', + 'Scroll Recovery', + 'Request Cancellation', + 'Suspense Ready!', + 'Render-as-you-fetch', + 'Prefetching', + 'Variable-length Parallel Queries', + 'Offline Support', + 'SSR Support', + 'Data Selectors', + ].map((d, i) => { + return ( + + {d} + + ) + })} +
    +
    */} + + {/*
    +
    + Trusted in Production by +
    + +
    + {(new Array(4) as string[]) + .fill('') + .reduce( + (all) => [...all, ...all], + [ + 'Google', + 'Walmart', + 'Facebook', + 'PayPal', + 'Amazon', + 'American Express', + 'Microsoft', + 'Target', + 'Ebay', + 'Autodesk', + 'CarFAX', + 'Docusign', + 'HP', + 'MLB', + 'Volvo', + 'Ocado', + 'UPC.ch', + 'EFI.com', + 'ReactBricks', + 'Nozzle.io', + 'Uber', + ] + ) + .map((d, i) => ( + + {d} + + ))} +
    +
    +
    */} + +
    +

    + Partners +

    +
    +
    + {partners + .filter((d) => d.libraries?.includes('router')) + .map((partner) => { + return ( + +
    + {partner.homepageImg} +
    +
    + {partner.content} +
    +
    + ) + })} +
    +
    + +
    +

    + Sponsors +

    +
    + } + children={(sponsors) => { + return + }} + /> +
    + +
    + + + + {/*
    +
    +

    + Less code, fewer edge cases. +

    +

    + Instead of writing reducers, caching logic, timers, retry logic, + complex async/await scripting (I could keep going...), you literally + write a tiny fraction of the code you normally would. You will be + surprised at how little code you're writing or how much code you're + deleting when you use TanStack Query. Try it out with one of the + examples below! +

    +
    + {( + [ + { label: 'Angular', value: 'angular' }, + { label: 'React', value: 'react' }, + { label: 'Solid', value: 'solid' }, + { label: 'Svelte', value: 'svelte' }, + { label: 'Vue', value: 'vue' }, + ] as const + ).map((item) => ( + + ))} +
    +
    +
    */} + + {/* {[''].includes(framework) ? ( +
    +
    + Looking for the @tanstack/{framework}-query{' '} + example? We could use your help to build the{' '} + @tanstack/{framework}-query adapter! Join the{' '} + + TanStack Discord Server + {' '} + and let's get to work! +
    +
    + ) : ( +
    + +
    + )} */} + +
    +
    + Wow, you've come a long way! +
    +
    + Only one thing left to do... +
    +
    + + Get Started! + +
    +
    +
    +
    + ) +} diff --git a/app/routes/_libraries/store.$version.index.tsx b/app/routes/_libraries/store.$version.index.tsx new file mode 100644 index 000000000..900d7cfcd --- /dev/null +++ b/app/routes/_libraries/store.$version.index.tsx @@ -0,0 +1,229 @@ +import { CgSpinner } from 'react-icons/cg' +import { Link, createFileRoute, getRouteApi } from '@tanstack/react-router' +import { Carbon } from '~/components/Carbon' +import { Footer } from '~/components/Footer' +import { TbHeartHandshake } from 'react-icons/tb' +import SponsorPack from '~/components/SponsorPack' +import { storeProject } from '~/libraries/store' +import { Await } from '@tanstack/react-router' +import { seo } from '~/utils/seo' +import { twMerge } from 'tailwind-merge' +import { getLibrary } from '~/libraries' +import { LibraryFeatureHighlights } from '~/components/LibraryFeatureHighlights' +import LandingPageGad from '~/components/LandingPageGad' + +export const Route = createFileRoute('/_libraries/store/$version/')({ + component: StoreVersionIndex, + head: () => ({ + meta: seo({ + title: storeProject.name, + description: storeProject.description, + }), + }), +}) + +const librariesRouteApi = getRouteApi('/_libraries') +const library = getLibrary('store') + +export default function StoreVersionIndex() { + const { sponsorsPromise } = librariesRouteApi.useLoaderData() + const { version } = Route.useParams() + + const gradientText = `pr-1inline-block text-transparent bg-clip-text bg-gradient-to-r ${storeProject.colorFrom} ${storeProject.colorTo}` + + return ( + <> +
    +
    +

    + TanStack + Store +

    +

    + + Framework agnostic + {' '} + type-safe store w/ reactive framework adapters +

    +

    + Level up your state management with TanStack Store – the + framework-agnostic, type-safe store. Enjoy{' '} + + minimal setup, granular APIs, and seamless adaptability across + frameworks + + . Simplify your development and boost efficiency with TanStack + Store. +

    + + Get Started + +
    + +
    +

    + Partners +

    +
    +
    + + Store You? + +
    +
    + We're looking for a TanStack Store OSS Partner to go above and + beyond the call of sponsorship. Are you as invested in TanStack + Store as we are? Let's push the boundaries of Store together! +
    + + Let's chat + +
    +
    +
    + +
    +

    + Sponsors +

    +
    + } + children={(sponsors) => { + return + }} + /> +
    + +
    + + + + {/*
    +
    +

    + Less code, fewer edge cases. +

    +

    + Instead of encouraging hasty abstractions and hook-focused APIs, + TanStack Form embraces composition where it counts by giving you + headless APIs via components (and hooks if you want them of + course). TanStack Form is designed to be used directly in your + components and UI. This means less code, fewer edge cases, and + deeper control over your UI. Try it out with one of the examples + below! +

    +
    + {( + [ + { label: 'React', value: 'react' }, + { label: 'Solid', value: 'solid' }, + { label: 'Svelte', value: 'svelte' }, + { label: 'Vue', value: 'vue' }, + ] as const + ).map((item) => ( + + ))} +
    +
    +
    + + {['solid', 'vue', 'svelte'].includes(framework) ? ( +
    +
    + Looking for the @tanstack/{framework}-form{' '} + example? We could use your help to build the{' '} + @tanstack/{framework}-form adapter! Join the{' '} + + TanStack Discord Server + {' '} + and let's get to work! +
    +
    + ) : ( +
    + +
    + )} */} + +
    +
    + Wow, you've come a long way! +
    +
    + Only one thing left to do... +
    +
    + + Get Started! + +
    +
    +
    +
    + + ) +} diff --git a/app/routes/_libraries/support.tsx b/app/routes/_libraries/support.tsx new file mode 100644 index 000000000..cb6d51014 --- /dev/null +++ b/app/routes/_libraries/support.tsx @@ -0,0 +1,100 @@ +import { createFileRoute, Link } from '@tanstack/react-router' +import { seo } from '~/utils/seo' + +export const Route = createFileRoute('/_libraries/support')({ + component: LoginComp, + head: () => ({ + meta: seo({ + title: 'Support | TanStack', + description: `Help and support for TanStack libraries and projects`, + keywords: `tanstack,react,reactjs,react query,react table,open source,open source software,oss,software,help,support`, + }), + }), +}) + +function LoginComp() { + return ( +
    +
    +
    +
    +

    +
    + Support +
    +
    + for TanStack Libraries +
    +

    +

    + Whether you're a solo developer or a large enterprise, we have + solutions that will fit your needs like a glove! +

    +
    +
    + +
    + Discord +
    +
    + {['Community Support', 'Q&A', 'General Chat', 'Networking'].map( + (d) => ( +
    + {d} +
    + ) + )} +
    + + +
    + GitHub +
    +
    + {['Bug Reports', 'Feature Requests', 'Source Code'].map((d) => ( +
    + {d} +
    + ))} +
    + + +
    + Dedicated Support +
    +
    + {['Consulting', 'Enterprise Support Contracts'].map((d) => ( +
    +
    + {d} +
    +
    + ))} +
    + +
    +
    +
    +
    + ) +} diff --git a/app/routes/_libraries/table.$version.index.tsx b/app/routes/_libraries/table.$version.index.tsx new file mode 100644 index 000000000..084ce97e4 --- /dev/null +++ b/app/routes/_libraries/table.$version.index.tsx @@ -0,0 +1,312 @@ +import * as React from 'react' +import { CgSpinner } from 'react-icons/cg' +import { FaCheckCircle } from 'react-icons/fa' +import { Link, createFileRoute, getRouteApi } from '@tanstack/react-router' +import { tableProject } from '~/libraries/table' +import { Carbon } from '~/components/Carbon' +import { Footer } from '~/components/Footer' +import SponsorPack from '~/components/SponsorPack' +import { Await } from '@tanstack/react-router' +import { Framework, getBranch, getLibrary } from '~/libraries' +import { seo } from '~/utils/seo' +import { getExampleStartingPath } from '~/utils/sandbox' +import { partners } from '~/utils/partners' +import { twMerge } from 'tailwind-merge' +import { LibraryFeatureHighlights } from '~/components/LibraryFeatureHighlights' +import LandingPageGad from '~/components/LandingPageGad' + +export const Route = createFileRoute('/_libraries/table/$version/')({ + component: TableVersionIndex, + head: () => ({ + meta: seo({ + title: tableProject.name, + description: tableProject.description, + }), + }), +}) + +const librariesRouteApi = getRouteApi('/_libraries') + +const library = getLibrary('table') + +export default function TableVersionIndex() { + const { sponsorsPromise } = librariesRouteApi.useLoaderData() + const { version } = Route.useParams() + const branch = getBranch(tableProject, version) + const [framework, setFramework] = React.useState('react') + const [isDark, setIsDark] = React.useState(true) + + const sandboxFirstFileName = getExampleStartingPath(framework) + + React.useEffect(() => { + setIsDark(window.matchMedia?.(`(prefers-color-scheme: dark)`).matches) + }, []) + + const gradientText = `pr-1 inline-block text-transparent bg-clip-text bg-gradient-to-r ${tableProject.colorFrom} ${tableProject.colorTo}` + + return ( +
    +
    +

    + TanStack + Table +

    +

    + + Headless + {' '} + UI for building powerful tables & datagrids +

    +

    + Supercharge your tables or build a datagrid from scratch for TS/JS, + React, Vue, Solid, Svelte & Lit while retaining 100% control over + markup and styles. +

    + + Get Started + +
    + + + +
    +
    +

    + Framework Agnostic & Feature Rich +

    +

    + TanStack Table's API and engine are highly modular and + framework-independent while still prioritizing ergonomics. Behold, + the obligatory feature-list: +

    +
    +
    + {[ + 'Lightweight (10 - 15kb)', + 'Tree-Shaking', + 'Headless', + 'Cell Formatters', + 'Auto-managed internal state', + 'Opt-in fully controlled state', + 'Sorting', + 'Multi Sort', + 'Global Filters', + 'Columns Filters', + 'Pagination', + 'Row Grouping', + 'Aggregation', + 'Row Selection', + 'Row Expansion', + 'Column Ordering', + 'Column Visibility', + 'Column Resizing', + 'Virtualizable', + 'Server-side/external Data', + 'Nested/Grouped Headers', + 'Footers', + ].map((d, i) => { + return ( + + {d} + + ) + })} +
    +
    + +
    +
    + Trusted in Production by +
    + {/* @ts-ignore */} + +
    + {(new Array(4) as string[]) + .fill('') + .reduce( + (all) => [...all, ...all], + [ + 'Intuit', + 'Google', + 'Amazon', + 'Apple', + 'AutoZone', + 'Microsoft', + 'Cisco', + 'Uber', + 'Salesforce', + 'Walmart', + 'Wix', + 'HP', + 'Docusign', + 'Tripwire', + 'Yahoo!', + 'Ocado', + 'Nordstrom', + 'TicketMaster', + 'Comcast Business', + 'Nozzle.io', + ] + ) + .map((d, i) => ( + + {d} + + ))} +
    + {/* @ts-ignore */} +
    +
    + +
    +

    + Partners +

    +
    +
    + {partners + .filter((d) => d.libraries?.includes('table')) + .map((partner) => { + return ( + +
    + {partner.homepageImg} +
    +
    + {partner.content} +
    +
    + ) + })} +
    +
    + +
    +

    + Sponsors +

    +
    + } + children={(sponsors) => { + return + }} + /> +
    + +
    + + + +
    +
    +

    + Take it for a spin! +

    +

    + With some basic styles, some table markup and few columns, you're + already well on your way to creating a drop-dead powerful table. +

    +
    + {( + [ + { label: 'Angular', value: 'angular' }, + { label: 'Lit', value: 'lit' }, + { label: 'Qwik', value: 'qwik' }, + { label: 'React', value: 'react' }, + { label: 'Solid', value: 'solid' }, + { label: 'Svelte', value: 'svelte' }, + { label: 'Vue', value: 'vue' }, + { label: 'Vanilla', value: 'vanilla' }, + ] as const + ).map((item) => ( + + ))} +
    +
    +
    + +
    + +
    + +
    +
    + Wow, you've come a long way! +
    +
    + Only one thing left to do... +
    +
    + + Get Started! + +
    +
    +
    +
    + ) +} diff --git a/src/routes/terms.tsx b/app/routes/_libraries/terms.tsx similarity index 98% rename from src/routes/terms.tsx rename to app/routes/_libraries/terms.tsx index 16242db69..70470ff91 100644 --- a/src/routes/terms.tsx +++ b/app/routes/_libraries/terms.tsx @@ -2,7 +2,7 @@ import { createFileRoute } from '@tanstack/react-router' import { Footer } from '~/components/Footer' import { seo } from '~/utils/seo' -export const Route = createFileRoute('/terms')({ +export const Route = createFileRoute('/_libraries/terms')({ component: RouteComp, head: () => ({ meta: seo({ @@ -12,7 +12,7 @@ export const Route = createFileRoute('/terms')({ }), }) -function RouteComp() { +export default function RouteComp() { return (
    diff --git a/app/routes/_libraries/virtual.$version.index.tsx b/app/routes/_libraries/virtual.$version.index.tsx new file mode 100644 index 000000000..264c6ea85 --- /dev/null +++ b/app/routes/_libraries/virtual.$version.index.tsx @@ -0,0 +1,315 @@ +import * as React from 'react' + +import { CgSpinner } from 'react-icons/cg' +import { FaCheckCircle } from 'react-icons/fa' +import { + Await, + Link, + createFileRoute, + getRouteApi, +} from '@tanstack/react-router' +import { virtualProject } from '~/libraries/virtual' +import { getLibrary } from '~/libraries' +import { LibraryFeatureHighlights } from '~/components/LibraryFeatureHighlights' +import { Carbon } from '~/components/Carbon' +import { Footer } from '~/components/Footer' +import SponsorPack from '~/components/SponsorPack' +import { TbHeartHandshake } from 'react-icons/tb' +import { Framework, getBranch } from '~/libraries' +import { seo } from '~/utils/seo' +import { twMerge } from 'tailwind-merge' +import LandingPageGad from '~/components/LandingPageGad' + +export const Route = createFileRoute('/_libraries/virtual/$version/')({ + component: RouteComp, + head: () => ({ + meta: seo({ + title: virtualProject.name, + description: virtualProject.description, + }), + }), +}) + +const librariesRouteApi = getRouteApi('/_libraries') + +const library = getLibrary('virtual') + +export default function RouteComp() { + const { sponsorsPromise } = librariesRouteApi.useLoaderData() + const { version } = Route.useParams() + const [framework, setFramework] = React.useState('react') + const branch = getBranch(virtualProject, version) + const [isDark, setIsDark] = React.useState(true) + + React.useEffect(() => { + setIsDark(window.matchMedia?.(`(prefers-color-scheme: dark)`).matches) + }, []) + + const gradientText = `pr-1 inline-block text-transparent bg-clip-text bg-gradient-to-r ${virtualProject.colorFrom} ${virtualProject.colorTo}` + + return ( +
    +
    +

    + TanStack + Virtual +

    +

    + + Headless + {' '} + UI for Virtualizing Large Element Lists +

    +

    + Virtualize only the visible DOM nodes within massive scrollable + elements at 60FPS in TS/JS, React, Vue, Solid, Svelte, Lit & Angular + while retaining 100% control over markup and styles. +

    + + Get Started + +
    + + + +
    +
    +

    + Framework Agnostic & Feature Rich +

    +

    + TanStack Virtual's API and engine are highly modular and + framework-independent while still prioritizing ergonomics. Behold, + the obligatory feature-list: +

    +
    +
    + {[ + 'Lightweight (10 - 15kb)', + 'Tree-Shaking', + 'Headless', + 'Vertical/Column Virtualization', + 'Horizontal/Row Virtualization', + 'Grid Virtualization', + 'Window-Scrolling', + 'Fixed Sizing', + 'Variable Sizing', + 'Dynamic/Measured Sizing', + 'Scrolling Utilities', + 'Sticky Items', + ].map((d, i) => { + return ( + + {d} + + ) + })} +
    +
    + + {/*
    +
    + Trusted in Production by +
    + +
    + {(new Array(4) as string[]) + .fill('') + .reduce( + (all) => [...all, ...all], + [ + 'Intuit', + 'Google', + 'Amazon', + 'Apple', + 'AutoZone', + 'Microsoft', + 'Cisco', + 'Uber', + 'Salesforce', + 'Walmart', + 'Wix', + 'HP', + 'Docusign', + 'Tripwire', + 'Yahoo!', + 'Ocado', + 'Nordstrom', + 'TicketMaster', + 'Comcast Business', + 'Nozzle.io', + ] + ) + .map((d, i) => ( + + {d} + + ))} +
    +
    +
    */} + +
    +

    + Partners +

    +
    +
    + + Virtual You? + +
    +
    + We're looking for a TanStack Virtual OSS Partner to go above and + beyond the call of sponsorship. Are you as invested in TanStack + Virtual as we are? Let's push the boundaries of Virtual together! +
    + + Let's chat + +
    +
    +
    + +
    +

    + Sponsors +

    +
    + } + children={(sponsors) => { + return + }} + /> +
    + +
    + + + +
    +
    +

    + Take it for a spin! +

    +

    + With just a few divs and some inline styles, you're already well on + your way to creating an extremely powerful virtualization + experience. +

    +
    + {( + [ + { label: 'React', value: 'react' }, + { label: 'Solid', value: 'solid' }, + { label: 'Lit', value: 'lit' }, + { label: 'Svelte', value: 'svelte' }, + { label: 'Vue', value: 'vue' }, + { label: 'Angular', value: 'angular' }, + ] as const + ).map((item) => ( + + ))} +
    +
    +
    + + {['vue', 'solid', 'svelte'].includes(framework) ? ( +
    +
    + Looking for the @tanstack/{framework}-virtual{' '} + example? We could use your help to build the{' '} + @tanstack/{framework}-virtual adapter! Join the{' '} + + TanStack Discord Server + {' '} + and let's get to work! +
    +
    + ) : ( +
    + +
    + )} + +
    +
    + Wow, you've come a long way! +
    +
    + Only one thing left to do... +
    +
    + + Get Started! + +
    +
    +
    +
    + ) +} diff --git a/app/routes/dashboard.tsx b/app/routes/dashboard.tsx new file mode 100644 index 000000000..ffb67e84a --- /dev/null +++ b/app/routes/dashboard.tsx @@ -0,0 +1,56 @@ +import { createFileRoute } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/start' +import { redirectWithClearedCookie, requireAuthCookie } from '~/auth/auth' +import { useMutation } from '~/hooks/useMutation' +import { getWebRequest } from 'vinxi/http' + +const loadDashboard = createServerFn({ method: 'GET' }).handler(async () => { + const userId = await requireAuthCookie(getWebRequest()) + + return { + userId, + } +}) + +const logoutFn = createServerFn({ method: 'POST' }).handler(async () => { + return redirectWithClearedCookie() +}) + +export const Route = createFileRoute('/dashboard')({ + loader: () => loadDashboard(), + component: LoginComp, +}) + +function LoginComp() { + const { userId } = Route.useLoaderData() + + const mutation = useMutation({ + fn: logoutFn, + }) + + return ( +
    +

    Dashboard

    +
    + Welcome! Your userId is "{userId}" This is an experiment to test: +
    +
      +
    • + Our ability to access original document request headers and cookies in + server functions +
    • +
    • Our ability to clear cookies in server functions
    • +
    • Our ability to redirect from server functions
    • +
    • Our ability to use a custom hook to manage mutations
    • +
    +
    + +
    +
    + ) +} diff --git a/app/routes/login.tsx b/app/routes/login.tsx new file mode 100644 index 000000000..e3b5922f2 --- /dev/null +++ b/app/routes/login.tsx @@ -0,0 +1,100 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' +import { createServerFn, json } from '@tanstack/start' +import { setAuthOnResponse } from '~/auth/auth' +import { useMutation } from '~/hooks/useMutation' + +const loginFn = createServerFn({ method: 'POST' }) + .validator( + ( + d: TypedFormData<{ + username: string + password: string + }> + ) => d + ) + .handler(async ({ data }) => { + const username = data.get('username') as string + const password = data.get('password') as string + + if (username !== 'admin') { + return { errors: { username: 'Invalid username. Try "admin"' } } + } + + if (password !== 'password') { + return { errors: { password: 'Invalid password. Try "password"' } } + } + + throw await setAuthOnResponse(json(redirect({ to: '/dashboard' })), '1234') + }) + +export const Route = createFileRoute('/login')({ + component: LoginComp, +}) + +function LoginComp() { + const mutation = useMutation({ + fn: loginFn, + }) + + return ( +
    +

    Login

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + ) +} + +// function useAction( +// action: (formData: TypedFormData) => Promise +// ) { +// return useMutation(action) +// } + +interface TypedFormData> extends FormData { + get: (name: TKey) => TData[TKey] +} diff --git a/app/routes/merch.tsx b/app/routes/merch.tsx new file mode 100644 index 000000000..2e3d7e29d --- /dev/null +++ b/app/routes/merch.tsx @@ -0,0 +1,10 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' + +export const Route = createFileRoute('/merch')({ + beforeLoad: () => { + throw redirect({ + href: `https://cottonbureau.com/people/tanstack`, + code: 301, + }) + }, +}) diff --git a/src/routes/sponsors-embed.tsx b/app/routes/sponsors-embed.tsx similarity index 97% rename from src/routes/sponsors-embed.tsx rename to app/routes/sponsors-embed.tsx index d7954a01d..cf705e59d 100644 --- a/src/routes/sponsors-embed.tsx +++ b/app/routes/sponsors-embed.tsx @@ -1,6 +1,6 @@ -import { createFileRoute } from '@tanstack/react-router' import SponsorPack from '~/components/SponsorPack' import { getSponsorsForSponsorPack } from '~/server/sponsors' +import { createFileRoute } from '@tanstack/react-router' const cacheHeaders = { 'Cache-Control': 'max-age=300, s-maxage=3600, stale-while-revalidate', @@ -15,7 +15,6 @@ export const Route = createFileRoute('/sponsors-embed')({ }, staticData: { baseParent: true, - showNavbar: false, }, component: SponsorsEmbed, }) diff --git a/src/routes/stats/index.tsx b/app/routes/stats/index.tsx similarity index 66% rename from src/routes/stats/index.tsx rename to app/routes/stats/index.tsx index d08c83d57..f8b7d768a 100644 --- a/src/routes/stats/index.tsx +++ b/app/routes/stats/index.tsx @@ -1,4 +1,4 @@ -import { redirect, createFileRoute } from '@tanstack/react-router' +import { createFileRoute, redirect } from '@tanstack/react-router' export const Route = createFileRoute('/stats/')({ beforeLoad: () => { diff --git a/src/routes/stats/npm/-comparisons.ts b/app/routes/stats/npm/-comparisons.ts similarity index 74% rename from src/routes/stats/npm/-comparisons.ts rename to app/routes/stats/npm/-comparisons.ts index d8606256f..cd3627797 100644 --- a/src/routes/stats/npm/-comparisons.ts +++ b/app/routes/stats/npm/-comparisons.ts @@ -1,50 +1,33 @@ -import * as v from 'valibot' +import { z } from 'zod' +import { packageComparisonSchema } from './index' -export const packageGroupSchema = v.object({ - packages: v.array( - v.object({ - name: v.string(), - hidden: v.optional(v.boolean()), - }), - ), - color: v.optional(v.nullable(v.string())), - baseline: v.optional(v.boolean()), -}) - -export const packageComparisonSchema = v.object({ - title: v.string(), - packageGroups: v.array(packageGroupSchema), - baseline: v.optional(v.string()), -}) - -// Default comparison for route validation - extracted to avoid bundling all comparisons -// This is used in validateSearch defaults and must be kept in sync with the first comparison -export const defaultPackageGroups: v.InferInput[] = [ - { - packages: [{ name: '@tanstack/react-query' }, { name: 'react-query' }], - color: '#FF4500', - }, - { - packages: [{ name: 'swr' }], - color: '#ec4899', - }, - { - packages: [{ name: '@apollo/client' }], - color: '#6B46C1', - }, - { - packages: [{ name: '@trpc/client' }], - color: '#2596BE', - }, -] - -export function getPopularComparisons(): v.InferInput< +export function getPopularComparisons(): z.input< typeof packageComparisonSchema >[] { return [ { title: 'Data Fetching', - packageGroups: defaultPackageGroups, + packageGroups: [ + { + packages: [ + { name: '@tanstack/react-query' }, + { name: 'react-query' }, + ], + color: '#FF4500', + }, + { + packages: [{ name: 'swr' }], + color: '#ec4899', + }, + { + packages: [{ name: '@apollo/client' }], + color: '#6B46C1', + }, + { + packages: [{ name: '@trpc/client' }], + color: '#2596BE', + }, + ], }, { title: 'State Management', @@ -194,10 +177,6 @@ export function getPopularComparisons(): v.InferInput< packages: [{ name: 'svelte' }], color: '#FF3E00', }, - { - packages: [{ name: 'solid-js' }], - color: '#2C4F7C', - }, { packages: [{ name: 'preact' }], color: '#673AB8', @@ -361,7 +340,7 @@ export function getPopularComparisons(): v.InferInput< color: '#FF1493', }, { - packages: [{ name: '@formkit/auto-animate' }], + packages: [{ name: 'auto-animate' }], color: '#FFD700', }, ], @@ -424,88 +403,5 @@ export function getPopularComparisons(): v.InferInput< }, ], }, - { - title: 'Documentation', - packageGroups: [ - { - packages: [{ name: 'vitepress' }], - color: '#a8b1ff', - }, - { - packages: [{ name: '@docusaurus/core' }], - color: '#21b091', - }, - { - packages: [{ name: 'vocs' }], - color: '#0090ff', - }, - { - packages: [{ name: '@astrojs/starlight' }], - color: '#f97316', - }, - { - packages: [{ name: 'nextra' }], - color: '#00CED1', - }, - { - packages: [{ name: 'fumadocs-core' }], - color: '#DA70D6', - }, - ], - }, - { - title: 'All TanStack Packages', - packageGroups: [ - { - packages: [ - { name: '@tanstack/react-query' }, - { name: 'react-query' }, - ], - color: '#FF4500', - }, - { - packages: [ - { name: '@tanstack/react-table' }, - { name: 'react-table' }, - ], - color: '#FF7043', - }, - { - packages: [{ name: '@tanstack/react-router' }], - color: '#32CD32', - }, - { - packages: [ - { name: '@tanstack/react-virtual' }, - { name: 'react-virtual' }, - ], - color: '#8B5CF6', - }, - { - packages: [{ name: '@tanstack/react-form' }], - color: '#FFD700', - }, - { - packages: [{ name: '@tanstack/start' }], - color: '#00CED1', - }, - { - packages: [{ name: '@tanstack/store' }], - color: '#FF69B4', - }, - { - packages: [{ name: '@tanstack/ranger' }], - color: '#98D8C8', - }, - { - packages: [{ name: '@tanstack/config' }], - color: '#FFA500', - }, - { - packages: [{ name: '@tanstack/react-charts' }], - color: '#4169E1', - }, - ], - }, ] as const } diff --git a/app/routes/stats/npm/index.tsx b/app/routes/stats/npm/index.tsx new file mode 100644 index 000000000..7e610d372 --- /dev/null +++ b/app/routes/stats/npm/index.tsx @@ -0,0 +1,2180 @@ +import * as React from 'react' +import { createFileRoute, Link } from '@tanstack/react-router' +import { z } from 'zod' +import { throttle } from '@tanstack/pacer' +import { useDebouncedValue } from '@tanstack/react-pacer' +import { + MdClose, + MdVisibility, + MdVisibilityOff, + MdAdd, + MdPushPin, + MdMoreVert, + MdSearch, + MdArrowDownward, + MdArrowUpward, +} from 'react-icons/md' +import { keepPreviousData, queryOptions, useQuery } from '@tanstack/react-query' +import * as Plot from '@observablehq/plot' +import { ParentSize } from '@visx/responsive' +import { Tooltip } from '~/components/Tooltip' +import * as d3 from 'd3' +import { FaAngleRight, FaSpinner } from 'react-icons/fa' +import { HexColorPicker } from 'react-colorful' +import { seo } from '~/utils/seo' +import { getPopularComparisons } from './-comparisons' +import { + GadFooter, + GadLeftRailSquare, + GadRightRailSquare, +} from '~/components/GoogleScripts' +import { twMerge } from 'tailwind-merge' +import logoColor100w from '~/images/logo-color-100w.png' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@radix-ui/react-dropdown-menu' +import { Command } from 'cmdk' + +export const packageGroupSchema = z.object({ + packages: z.array( + z.object({ + name: z.string(), + hidden: z.boolean().optional(), + }) + ), + color: z.string().nullable().optional(), + baseline: z.boolean().optional(), +}) + +export const packageComparisonSchema = z.object({ + title: z.string(), + packageGroups: z.array(packageGroupSchema), + baseline: z.string().optional(), +}) + +const transformModeSchema = z.enum(['none', 'normalize-y']) +const binTypeSchema = z.enum(['yearly', 'monthly', 'weekly', 'daily']) +const showDataModeSchema = z.enum(['all', 'complete']) +export const Route = createFileRoute('/stats/npm/')({ + validateSearch: z.object({ + packageGroups: z + .array(packageGroupSchema) + .optional() + .default(getPopularComparisons()[0].packageGroups) + .catch(getPopularComparisons()[0].packageGroups), + range: z + .enum([ + '7-days', + '30-days', + '90-days', + '180-days', + '365-days', + '730-days', + '1825-days', + 'all-time', + ]) + .optional() + .default('365-days') + .catch('365-days'), + transform: transformModeSchema.optional().default('none').catch('none'), + facetX: z.enum(['name']).optional().catch(undefined), + facetY: z.enum(['name']).optional().catch(undefined), + binType: binTypeSchema.optional().default('weekly').catch('weekly'), + showDataMode: showDataModeSchema.optional().default('all').catch('all'), + height: z.number().optional().default(400).catch(400), + }), + loaderDeps: ({ search }) => ({ + packageList: search.packageGroups + ?.map((p) => p.packages[0].name) + .join(' vs '), + }), + loader: async ({ deps }) => { + return deps + }, + head: ({ loaderData }) => ({ + meta: seo({ + title: `NPM Download Stats and Trends — Track and Compare Packages Instantly: ${loaderData.packageList}`, + description: `Get real-time npm download statistics, compare package popularity, spot trends, and make better choices for your projects. Faster and more detailed than npm-stat, npmtrends, and others.`, + }), + }), + component: RouteComponent, +}) + +const timeRanges = [ + { value: '7-days', label: '7 Days' }, + { value: '30-days', label: '30 Days' }, + { value: '90-days', label: '90 Days' }, + { value: '180-days', label: '6 Months' }, + { value: '365-days', label: '1 Year' }, + { value: '730-days', label: '2 Years' }, + { value: '1825-days', label: '5 Years' }, + { value: 'all-time', label: 'All Time' }, +] as const + +type TimeRange = + | '7-days' + | '30-days' + | '90-days' + | '180-days' + | '365-days' + | '730-days' + | '1825-days' + | 'all-time' + +type BinType = z.infer + +const binningOptions = [ + { + label: 'Yearly', + value: 'yearly', + single: 'year', + bin: d3.timeYear, + }, + { + label: 'Monthly', + value: 'monthly', + single: 'month', + bin: d3.timeMonth, + }, + { + label: 'Weekly', + value: 'weekly', + single: 'week', + bin: d3.timeSunday, + }, + { + label: 'Daily', + value: 'daily', + single: 'day', + bin: d3.timeDay, + }, +] as const + +const binningOptionsByType = binningOptions.reduce((acc, option) => { + acc[option.value] = option + return acc +}, {} as Record) + +type TransformMode = z.infer + +type NpmPackage = { + name: string + description: string + version: string + publisher: { + username: string + } + time?: { + created: string + modified: string + } +} + +const defaultColors = [ + '#1f77b4', // blue + '#ff7f0e', // orange + '#2ca02c', // green + '#d62728', // red + '#9467bd', // purple + '#8c564b', // brown + '#e377c2', // pink + '#7f7f7f', // gray + '#bcbd22', // yellow-green + '#17becf', // cyan +] as const + +// Custom number formatter for more precise control +const formatNumber = (num: number) => { + if (num >= 1_000_000) { + return `${(num / 1_000_000).toFixed(1)}M` + } + if (num >= 1_000) { + return `${(num / 1_000).toFixed(1)}k` + } + return num.toString() +} + +const dropdownButtonStyles = { + base: 'bg-gray-500/10 rounded-md px-2 py-1 text-sm flex items-center gap-1', + active: 'bg-gray-500/20', +} as const + +type NpmQueryData = { + packages: { + downloads: any[] + name: string + hidden?: boolean | undefined + }[] + baseline?: boolean + start: string + end: string + color?: string | null | undefined + error?: string | null +}[] + +function npmQueryOptions({ + packageGroups, + range, +}: { + packageGroups: z.infer[] + range: TimeRange +}) { + const now = d3.timeDay(new Date()) + // Set to start of today to avoid timezone issues + now.setHours(0, 0, 0, 0) + let endDate = now + + // Function to get package creation date + const getPackageCreationDate = async (packageName: string): Promise => { + try { + const response = await fetch(`https://registry.npmjs.org/${packageName}`) + if (!response.ok) return d3.timeDay(new Date('2010-01-12')) // Fallback date + const data = await response.json() + return d3.timeDay(new Date(data.time?.created || '2010-01-12')) + } catch (error) { + console.error(`Error fetching creation date for ${packageName}:`, error) + return d3.timeDay(new Date('2010-01-12')) // Fallback date + } + } + + // Get the earliest creation date among all packages + const getEarliestCreationDate = async () => { + const packageNames = packageGroups.flatMap((pkg) => + pkg.packages.filter((p) => !p.hidden).map((p) => p.name) + ) + + const creationDates = await Promise.all( + packageNames.map(getPackageCreationDate) + ) + return new Date(Math.min(...creationDates.map((date) => date.getTime()))) + } + + let startDate = (() => { + switch (range) { + case '7-days': + return d3.timeDay.offset(now, -7) + case '30-days': + return d3.timeDay.offset(now, -30) + case '90-days': + return d3.timeDay.offset(now, -90) + case '180-days': + return d3.timeDay.offset(now, -180) + case '365-days': + return d3.timeDay.offset(now, -365) + case '730-days': + return d3.timeDay.offset(now, -730) + case '1825-days': + return d3.timeDay.offset(now, -1825) + case 'all-time': + // We'll handle this in the queryFn + return d3.timeDay(new Date('2010-01-12')) // This will be overridden + } + })() + + const formatDate = (date: Date) => { + return date.toISOString().split('T')[0] + } + + return queryOptions({ + queryKey: ['npm-stats', packageGroups, range], + queryFn: async (): Promise => { + // For all-time range, get the earliest creation date + if (range === 'all-time') { + startDate = await getEarliestCreationDate() + } + + return Promise.all( + packageGroups.map(async (packageGroup) => { + try { + const packages = await Promise.all( + packageGroup.packages.map(async (pkg) => { + let currentEnd = endDate + let currentStart = startDate + + const chunkRanges: { start: Date; end: Date }[] = [] + + while (currentStart < currentEnd) { + const chunkEnd = d3.timeDay(new Date(currentEnd)) + const chunkStart = d3.timeDay.offset(currentEnd, -365) + + // Move the end date to the day before the start of the current chunk + currentEnd = d3.timeDay.offset(chunkStart, -1) + + chunkRanges.push({ start: chunkStart, end: chunkEnd }) + } + + const chunks = await Promise.all( + chunkRanges.map(async (chunk) => { + const url = `https://api.npmjs.org/downloads/range/${formatDate( + chunk.start + )}:${formatDate(chunk.end)}/${pkg.name}` + const response = await fetch(url) + if (!response.ok) { + if (response.status === 404) { + throw new Error('not_found') + } + throw new Error('fetch_failed') + } + return response.json() + }) + ) + + // Combine all chunks and ensure no gaps + const downloads = chunks + .flatMap((chunk) => chunk.downloads || []) + .sort( + (a, b) => + new Date(a.day).getTime() - new Date(b.day).getTime() + ) + + // Find the earliest non-zero download + const firstNonZero = downloads.find((d) => d.downloads > 0) + if (firstNonZero) { + startDate = d3.timeDay(new Date(firstNonZero.day)) + } + + return { ...pkg, downloads } + }) + ) + + return { + ...packageGroup, + packages, + start: formatDate(startDate), + end: formatDate(endDate), + error: null, + } + } catch (error) { + return { + ...packageGroup, + packages: packageGroup.packages.map((pkg) => ({ + ...pkg, + downloads: [], + })), + start: formatDate(startDate), + end: formatDate(endDate), + error: + error instanceof Error && error.message === 'not_found' + ? `Package "${packageGroup.packages[0].name}" not found on npm` + : 'Failed to fetch package data (see console for details)', + } + } + }) + ) + }, + placeholderData: keepPreviousData, + }) +} + +// Get or assign colors for packages +function getPackageColor( + packageName: string, + packages: z.infer[] +) { + // Find the package group that contains this package + const packageInfo = packages.find((pkg) => + pkg.packages.some((p) => p.name === packageName) + ) + if (packageInfo?.color) { + return packageInfo.color + } + + // Otherwise, assign a default color based on the package's position + const packageIndex = packages.findIndex((pkg) => + pkg.packages.some((p) => p.name === packageName) + ) + return defaultColors[packageIndex % defaultColors.length] +} + +function PlotFigure({ options }: { options: any }) { + const containerRef = React.useRef(null) + + React.useEffect(() => { + if (!containerRef.current) return + const plot = Plot.plot(options) + containerRef.current.append(plot) + return () => plot.remove() + }, [options]) + + return
    +} + +function Resizable({ + height, + onHeightChange, + children, +}: { + height: number + onHeightChange: (height: number) => void + children: React.ReactNode +}) { + const [isDragging, setIsDragging] = React.useState(false) + const [dragEl, setDragEl] = React.useState(null) + const startYRef = React.useRef(0) + const startHeightRef = React.useRef(height) + + const onHeightChangeRef = React.useRef(onHeightChange) + onHeightChangeRef.current = onHeightChange + + React.useEffect(() => { + if (!dragEl) return + + const handleMouseDown = (e: MouseEvent) => { + setIsDragging(true) + startYRef.current = e.clientY + startHeightRef.current = height + + const handleMouseMove = (e: MouseEvent) => { + const deltaY = e.clientY - startYRef.current + const newHeight = Math.max(300, startHeightRef.current + deltaY) + onHeightChangeRef.current(newHeight) + } + + const handleMouseUp = () => { + setIsDragging(false) + document.removeEventListener('mousemove', handleMouseMove) + document.removeEventListener('mouseup', handleMouseUp) + } + + document.addEventListener('mousemove', handleMouseMove) + document.addEventListener('mouseup', handleMouseUp) + } + + dragEl.addEventListener('mousedown', handleMouseDown) + return () => { + dragEl?.removeEventListener('mousedown', handleMouseDown) + } + }, [dragEl, height]) + + return ( +
    + {children} +
    +
    +
    +
    + ) +} + +const showDataModeOptions = [ + { value: 'all', label: 'All Data' }, + { value: 'complete', label: 'Hide Partial Data' }, +] as const + +type ShowDataMode = z.infer + +function NpmStatsChart({ + queryData, + transform, + binType, + packages, + range, + facetX, + facetY, + showDataMode, +}: { + queryData: undefined | NpmQueryData + transform: TransformMode + binType: BinType + packages: z.infer[] + range: TimeRange + facetX?: FacetValue + facetY?: FacetValue + showDataMode: ShowDataMode +}) { + if (!queryData?.length) return null + + const binOption = binningOptionsByType[binType] + const binUnit = binningOptionsByType[binType].bin + + const now = d3.timeDay(new Date()) + + let startDate = (() => { + switch (range) { + case '7-days': + return d3.timeDay.offset(now, -7) + case '30-days': + return d3.timeDay.offset(now, -30) + case '90-days': + return d3.timeDay.offset(now, -90) + case '180-days': + return d3.timeDay.offset(now, -180) + case '365-days': + return d3.timeDay.offset(now, -365) + case '730-days': + return d3.timeDay.offset(now, -730) + case '1825-days': + return d3.timeDay.offset(now, -1825) + case 'all-time': + return d3.timeDay(new Date('2010-01-12')) + } + })() + + startDate = binOption.bin.floor(startDate) + + const combinedPackageGroups = queryData.map((packageGroup) => { + // Filter out any sub packages that are hidden before + // summing them into a unified downloads count + const visiblePackages = packageGroup.packages.filter( + (p, i) => !i || !p.hidden + ) + + const downloadsByDate: Map = new Map() + + visiblePackages.forEach((pkg) => { + pkg.downloads.forEach((d) => { + // Clamp the data to the floor bin of the start date + const date = d3.timeDay(new Date(d.day)) + if (date < startDate) return + + downloadsByDate.set( + date.getTime(), + // Sum the downloads for each date + (downloadsByDate.get(date.getTime()) || 0) + d.downloads + ) + }) + }) + + return { + ...packageGroup, + downloads: Array.from(downloadsByDate.entries()).map( + ([date, downloads]) => [d3.timeDay(new Date(date)), downloads] + ) as [Date, number][], + } + }) + + // Prepare data for plotting + const binnedPackageData = combinedPackageGroups.map((packageGroup) => { + // Now apply our binning as groupings + const binned = d3.sort( + d3.rollup( + packageGroup.downloads, + (v) => d3.sum(v, (d) => d[1]), + (d) => binUnit.floor(d[0]) + ), + (d) => d[0] + ) + + const downloads = binned.map((d) => ({ + name: packageGroup.packages[0].name, + date: d3.timeDay(new Date(d[0])), + downloads: d[1], + })) + + return { + ...packageGroup, + downloads, + } + }) + + // Apply the baseline correction + + const baselinePackage = binnedPackageData.find((pkg) => { + return pkg.baseline + }) + + const baseLineCorrectionsByDate = + baselinePackage && binnedPackageData.length + ? (() => { + const firstValue = baselinePackage.downloads[0].downloads + + return new Map( + baselinePackage.downloads.map((d) => { + return [ + d.date.getTime(), + firstValue === 0 ? 1 : firstValue / d.downloads, + ] + }) + ) + })() + : undefined + + const correctedPackageData = binnedPackageData.map((packageGroup) => { + const first = packageGroup.downloads[0] + + return { + ...packageGroup, + downloads: packageGroup.downloads.map((d) => { + if (baseLineCorrectionsByDate) { + d.downloads = + d.downloads * (baseLineCorrectionsByDate.get(d.date.getTime()) || 1) + } + + return { + ...d, + change: d.downloads - first.downloads, + } + }), + } + }) + + // Filter out any top-level hidden packages + const filteredPackageData = correctedPackageData.filter( + (pkg) => !pkg.baseline && !pkg.packages[0].hidden + ) + + const plotData = filteredPackageData.flatMap((d) => d.downloads) + + let baseOptions: Plot.LineYOptions = { + x: 'date', + y: transform === 'normalize-y' ? 'change' : 'downloads', + fx: facetX, + fy: facetY, + } as const + + const partialBinEnd = binUnit.floor(now) + const partialBinStart = binUnit.offset(partialBinEnd, -1) + + // Force complete data mode when using relative change + const effectiveShowDataMode = + transform === 'normalize-y' ? 'complete' : showDataMode + + return ( + + {({ width = 1000, height }) => ( + d.date >= partialBinStart), + { + ...baseOptions, + stroke: 'name', + strokeWidth: 1.5, + strokeDasharray: '2 4', + strokeOpacity: 0.8, + curve: 'monotone-x', + } + ), + ], + Plot.lineY( + plotData.filter((d) => d.date < partialBinEnd), + { + ...baseOptions, + stroke: 'name', + strokeWidth: 2, + curve: 'monotone-x', + } + ), + Plot.tip( + effectiveShowDataMode === 'all' + ? plotData + : plotData.filter((d) => d.date < partialBinEnd), + Plot.pointer({ + ...baseOptions, + } as Plot.TipOptions) + ), + ].filter(Boolean), + x: { + label: 'Date', + labelOffset: 35, + }, + y: { + label: + transform === 'normalize-y' + ? 'Downloads Growth' + : baselinePackage + ? 'Downloads (% of baseline)' + : 'Downloads', + labelOffset: 35, + }, + grid: true, + color: { + domain: [...new Set(plotData.map((d) => d.name))], + range: [...new Set(plotData.map((d) => d.name))].map((pkg) => + getPackageColor(pkg, packages) + ), + legend: false, + }, + }} + /> + )} + + ) +} + +function PackageSearch() { + const [inputValue, setInputValue] = React.useState('') + const [open, setOpen] = React.useState(false) + const navigate = Route.useNavigate() + const containerRef = React.useRef(null) + + const [debouncedInputValue] = useDebouncedValue(inputValue, { + wait: 150, + }) + + React.useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + containerRef.current && + !containerRef.current.contains(event.target as Node) + ) { + setOpen(false) + } + } + + document.addEventListener('mousedown', handleClickOutside) + return () => { + document.removeEventListener('mousedown', handleClickOutside) + } + }, []) + + const searchQuery = useQuery({ + queryKey: ['npm-search', debouncedInputValue], + queryFn: async () => { + if (!debouncedInputValue || debouncedInputValue.length <= 2) return [] + + const response = await fetch( + `https://api.npms.io/v2/search?q=${encodeURIComponent( + debouncedInputValue + )}&size=10` + ) + const data = await response.json() + const hasInputValue = data.results.find( + (r: any) => r.package.name === debouncedInputValue + ) + + return [ + ...(hasInputValue + ? [] + : [ + { + name: debouncedInputValue, + label: `Use "${debouncedInputValue}"`, + }, + ]), + ...data.results.map((r: any) => r.package), + ] + }, + enabled: debouncedInputValue.length > 2, + placeholderData: keepPreviousData, + }) + + const handleInputChange = (value: string) => { + setInputValue(value) + } + + const handleSelect = (value: string) => { + const selectedItem = searchQuery.data?.find((item) => item.name === value) + if (!selectedItem) return + + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + packageGroups: [ + ...prev.packageGroups, + { + packages: [{ name: selectedItem.name }], + }, + ], + }), + resetScroll: false, + }) + setInputValue('') + setOpen(false) + } + + return ( +
    +
    + +
    + + setOpen(true)} + /> +
    + {searchQuery.isLoading && ( +
    + +
    + )} + {inputValue.length && open ? ( + + {inputValue.length < 3 ? ( +
    Keep typing to search...
    + ) : searchQuery.isLoading ? ( +
    + Searching... +
    + ) : !searchQuery.data?.length ? ( +
    No packages found
    + ) : null} + {searchQuery.data?.map((item) => ( + +
    {item.label || item.name}
    +
    + {item.description} +
    +
    + {item.version ? `v${item.version}• ` : ''} + {item.publisher?.username} +
    +
    + ))} +
    + ) : null} +
    +
    +
    + ) +} + +const defaultRangeBinTypes: Record = { + '7-days': 'daily', + '30-days': 'daily', + '90-days': 'weekly', + '180-days': 'weekly', + '365-days': 'weekly', + '730-days': 'monthly', + '1825-days': 'monthly', + 'all-time': 'monthly', +} + +// Add a function to check if a binning option is valid for a time range +function isBinningOptionValidForRange( + range: TimeRange, + binType: BinType +): boolean { + switch (range) { + case '7-days': + case '30-days': + return binType === 'daily' + case '90-days': + case '180-days': + return ( + binType === 'daily' || binType === 'weekly' || binType === 'monthly' + ) + case '365-days': + return ( + binType === 'daily' || binType === 'weekly' || binType === 'monthly' + ) + case '730-days': + case '1825-days': + case 'all-time': + return true + } +} + +const transformOptions = [ + { value: 'none', label: 'Actual Values' }, + { value: 'normalize-y', label: 'Relative Change' }, +] as const + +const facetOptions = [ + { value: 'name', label: 'Package' }, + // Add more options here in the future +] as const + +type FacetValue = (typeof facetOptions)[number]['value'] + +function RouteComponent() { + const { + packageGroups, + range = '7-days', + transform, + facetX, + facetY, + binType: binTypeParam, + showDataMode: showDataModeParam = 'all', + height = 400, + } = Route.useSearch() + const [combiningPackage, setCombiningPackage] = React.useState( + null + ) + const [combineSearchResults, setCombineSearchResults] = React.useState< + NpmPackage[] + >([]) + const [isCombining, setIsCombining] = React.useState(false) + const navigate = Route.useNavigate() + const [colorPickerPackage, setColorPickerPackage] = React.useState< + string | null + >(null) + const [colorPickerPosition, setColorPickerPosition] = React.useState<{ + x: number + y: number + } | null>(null) + const [openMenuPackage, setOpenMenuPackage] = React.useState( + null + ) + + const binType = binTypeParam ?? defaultRangeBinTypes[range] + const binOption = binningOptionsByType[binType] + + const handleBinnedChange = (value: BinType) => { + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + binType: value, + }), + resetScroll: false, + }) + } + + const handleBaselineChange = (packageName: string) => { + navigate({ + to: '.', + search: (prev) => { + return { + ...prev, + packageGroups: prev.packageGroups.map((pkg) => { + const baseline = + pkg.packages[0].name === packageName ? !pkg.baseline : false + + return { + ...pkg, + baseline, + } + }), + } + }, + resetScroll: false, + }) + } + + const handleShowDataModeChange = (mode: ShowDataMode) => { + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + showDataMode: mode, + }), + resetScroll: false, + }) + } + + const togglePackageVisibility = (index: number, packageName: string) => { + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + packageGroups: prev.packageGroups.map((pkg, i) => + i === index + ? { + ...pkg, + packages: pkg.packages.map((p) => + p.name === packageName ? { ...p, hidden: !p.hidden } : p + ), + } + : pkg + ), + }), + replace: true, + resetScroll: false, + }) + } + + const npmQuery = useQuery( + npmQueryOptions({ + packageGroups: packageGroups, + range, + }) + ) + + const handleCombineSelect = (selectedPackage: NpmPackage) => { + if (!combiningPackage) return + + // Find the package group that contains the combining package + const packageGroup = packageGroups.find((pkg) => + pkg.packages.some((p) => p.name === combiningPackage) + ) + + if (packageGroup) { + // Update existing package group + const newPackages = packageGroups.map((pkg) => + pkg === packageGroup + ? { + ...pkg, + packages: [ + ...pkg.packages, + { name: selectedPackage.name, hidden: true }, + ], + } + : pkg + ) + + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + packageGroups: newPackages, + }), + resetScroll: false, + }) + } else { + // Create new package group + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + packageGroups: [ + ...packageGroups, + { + packages: [ + { name: combiningPackage }, + { name: selectedPackage.name }, + ], + }, + ], + }), + resetScroll: false, + }) + } + + setCombiningPackage(null) + setCombineSearchResults([]) + } + + const handleRemoveFromGroup = (mainPackage: string, subPackage: string) => { + // Find the package group + const packageGroup = packageGroups.find((pkg) => + pkg.packages.some((p) => p.name === mainPackage) + ) + if (!packageGroup) return + + // Remove the subpackage + const updatedPackages = packageGroup.packages.filter( + (p) => p.name !== subPackage + ) + + // Update the packages array + const newPackages = packageGroups + .map((pkg) => + pkg === packageGroup ? { ...pkg, packages: updatedPackages } : pkg + ) + .filter((pkg) => pkg.packages.length > 0) + + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + packageGroups: newPackages, + }), + resetScroll: false, + }) + } + + const handleRemovePackageName = (packageGroupIndex: number) => { + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + packageGroups: prev.packageGroups.filter( + (_, i) => i !== packageGroupIndex + ), + }), + resetScroll: false, + }) + } + + const setBinningOption = (newBinningOption: BinType) => { + navigate({ + to: '.', + search: (prev) => ({ ...prev, binType: newBinningOption }), + resetScroll: false, + }) + } + + const handleRangeChange = (newRange: TimeRange) => { + // Set default binning option based on the new range + setBinningOption(defaultRangeBinTypes[newRange]) + + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + range: newRange, + }), + }) + } + + const handleTransformChange = (mode: TransformMode) => { + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + transform: mode, + }), + resetScroll: false, + }) + } + + const handleCombinePackage = (packageName: string) => { + setCombiningPackage(packageName) + setCombineSearchResults([]) + } + + const handleCombineSearch = async (query: string) => { + if (!query || query.length < 2) { + setCombineSearchResults([]) + return + } + + setIsCombining(true) + try { + const response = await fetch( + `https://api.npms.io/v2/search?q=${encodeURIComponent(query)}&size=10` + ) + const data = await response.json() + setCombineSearchResults(data.results.map((r: any) => r.package)) + } catch (error) { + console.error('Error searching packages:', error) + } finally { + setIsCombining(false) + } + } + + const handleColorClick = (packageName: string, event: React.MouseEvent) => { + const rect = event.currentTarget.getBoundingClientRect() + setColorPickerPosition({ x: rect.left, y: rect.bottom + 5 }) + setColorPickerPackage(packageName) + } + + const handleColorChange = throttle( + (packageName: string, color: string | null) => { + navigate({ + to: '.', + search: (prev) => { + const packageGroup = packageGroups.find((pkg) => + pkg.packages.some((p) => p.name === packageName) + ) + if (!packageGroup) return prev + + const newPackages = packageGroups.map((pkg) => + pkg === packageGroup + ? color === null + ? { packages: pkg.packages } + : { ...pkg, color } + : pkg + ) + + return { + ...prev, + packageGroups: newPackages, + } + }, + replace: true, + resetScroll: false, + }) + }, + { + wait: 100, + } + ) + + const onHeightChange = throttle( + (height: number) => { + navigate({ + to: '.', + search: (prev) => ({ ...prev, height }), + resetScroll: false, + }) + }, + { + wait: 16, + } + ) + + const handleMenuOpenChange = (packageName: string, open: boolean) => { + if (!open) { + setOpenMenuPackage(null) + } else { + setOpenMenuPackage(packageName) + } + } + + const handleFacetXChange = (value: FacetValue | undefined) => { + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + facetX: value, + }), + resetScroll: false, + }) + } + + const handleFacetYChange = (value: FacetValue | undefined) => { + navigate({ + to: '.', + search: (prev) => ({ + ...prev, + facetY: value, + }), + resetScroll: false, + }) + } + + return ( +
    +
    + + +
    TanStack
    + + + + NPM Stats{' '} + + BETA + + +
    +
    +
    +
    + + + + + + + + +
    + Time Range +
    + {timeRanges.map(({ value, label }) => ( + handleRangeChange(value)} + className={twMerge( + 'w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer', + value === range ? 'text-blue-500 bg-blue-500/10' : '', + 'data-[highlighted]:bg-gray-500/20 data-[highlighted]:text-blue-500' + )} + > + {label} + + ))} +
    +
    + + + + + + + +
    + Binning Interval +
    + {binningOptions.map(({ label, value }) => ( + handleBinnedChange(value)} + disabled={!isBinningOptionValidForRange(range, value)} + className={twMerge( + 'w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer', + binType === value ? 'text-blue-500 bg-blue-500/10' : '', + 'data-[highlighted]:bg-gray-500/20 data-[highlighted]:text-blue-500', + !isBinningOptionValidForRange(range, value) + ? 'opacity-50 cursor-not-allowed' + : '' + )} + > + {label} + + ))} +
    +
    + + + + + + + +
    + Y-Axis Transform +
    + {transformOptions.map(({ value, label }) => ( + + handleTransformChange(value as TransformMode) + } + className={twMerge( + 'w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer', + transform === value ? 'text-blue-500 bg-blue-500/10' : '', + 'data-[highlighted]:bg-gray-500/20 data-[highlighted]:text-blue-500' + )} + > + {label} + + ))} +
    +
    + + + + + + + +
    + Horizontal Facet +
    + handleFacetXChange(undefined)} + className={twMerge( + 'w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer', + !facetX ? 'text-blue-500 bg-blue-500/10' : '', + 'data-[highlighted]:bg-gray-500/20 data-[highlighted]:text-blue-500' + )} + > + No Facet + + {facetOptions.map(({ value, label }) => ( + handleFacetXChange(value)} + className={twMerge( + 'w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer', + facetX === value ? 'text-blue-500 bg-blue-500/10' : '', + 'data-[highlighted]:bg-gray-500/20 data-[highlighted]:text-blue-500' + )} + > + {label} + + ))} +
    +
    + + + + + + + +
    + Vertical Facet +
    + handleFacetYChange(undefined)} + className={twMerge( + 'w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer', + !facetY ? 'text-blue-500 bg-blue-500/10' : '', + 'data-[highlighted]:bg-gray-500/20 data-[highlighted]:text-blue-500' + )} + > + No Facet + + {facetOptions.map(({ value, label }) => ( + handleFacetYChange(value)} + className={twMerge( + 'w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer', + facetY === value ? 'text-blue-500 bg-blue-500/10' : '', + 'data-[highlighted]:bg-gray-500/20 data-[highlighted]:text-blue-500' + )} + > + {label} + + ))} +
    +
    + + + + + + + +
    + Data Display Mode +
    + {showDataModeOptions.map(({ value, label }) => ( + handleShowDataModeChange(value)} + disabled={transform === 'normalize-y'} + className={twMerge( + 'w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer', + showDataModeParam === value + ? 'text-blue-500 bg-blue-500/10' + : '', + 'data-[highlighted]:bg-gray-500/20 data-[highlighted]:text-blue-500', + transform === 'normalize-y' + ? 'opacity-50 cursor-not-allowed' + : '' + )} + > + {label} + + ))} +
    +
    +
    +
    + {packageGroups.map((pkg, index) => { + const mainPackage = pkg.packages[0] + const packageList = pkg.packages + const isCombined = packageList.length > 1 + const subPackages = packageList.filter( + (p) => p.name !== mainPackage.name + ) + const color = getPackageColor(mainPackage.name, packageGroups) + + // Get error for this package if any + const packageError = npmQuery.data?.[index]?.error + + return ( +
    +
    + {pkg.baseline ? ( + <> + + + + {mainPackage.name} + + ) : ( + <> + + + + + + + + )} + {isCombined ? ( + + + {subPackages.length} + + ) : null} +
    + + handleMenuOpenChange(mainPackage.name, open) + } + > + + + + + + +
    + Options +
    +
    + { + e.preventDefault() + togglePackageVisibility(index, mainPackage.name) + }} + className="w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer" + > + {mainPackage.hidden ? ( + + ) : ( + + )} + {mainPackage.hidden + ? 'Show Package' + : 'Hide Package'} + + { + e.preventDefault() + handleBaselineChange(mainPackage.name) + }} + className={twMerge( + 'w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer', + pkg.baseline ? 'text-blue-500' : '' + )} + > + + {pkg.baseline + ? 'Remove Baseline' + : 'Set as Baseline'} + + { + e.preventDefault() + handleColorClick( + mainPackage.name, + e as unknown as React.MouseEvent + ) + }} + className="w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer" + > +
    + Change Color + + {isCombined && ( + <> +
    +
    + Sub-packages +
    + {subPackages.map((subPackage) => ( + { + e.preventDefault() + togglePackageVisibility( + index, + subPackage.name + ) + }} + className="w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer" + > +
    +
    + {subPackage.hidden ? ( + + ) : ( + + )} + + {subPackage.name} + +
    + +
    +
    + ))} + + )} + { + e.preventDefault() + handleCombinePackage(mainPackage.name) + }} + className="w-full px-2 py-1.5 text-left text-sm rounded hover:bg-gray-500/20 flex items-center gap-2 outline-none cursor-pointer" + > + + Add Packages + +
    + + +
    + +
    + {packageError && ( +
    + {packageError} +
    + )} +
    + ) + })} +
    + + {/* Combine Package Dialog */} + {combiningPackage && ( +
    +
    +
    +

    + Add packages to {combiningPackage} +

    + +
    +
    + handleCombineSearch(e.target.value)} + autoFocus + /> + {isCombining && ( +
    + +
    + )} +
    +
    + {combineSearchResults.map((pkg) => ( + + ))} + {combineSearchResults.length === 0 && ( +
    + No matching packages found +
    + )} +
    +
    +
    + )} + + {/* Color Picker Popover */} + {colorPickerPackage && colorPickerPosition && ( +
    +
    + Pick a color +
    + + handleColorChange(colorPickerPackage, color) + } + /> +
    + + +
    +
    + )} + + {Object.keys(packageGroups).length ? ( +
    +
    + + + +
    + + + + + + + {/* + */} + + + + {npmQuery.data + ?.map((packageGroupDownloads, index) => { + if ( + !packageGroupDownloads.packages.some( + (p) => p.downloads.length + ) + ) { + return null + } + + // const flooredStartData = + // binOption.bin.floor(startDate) + + const firstPackage = packageGroupDownloads.packages[0] + + // const rangeFilteredDownloads = + // packageGroupDownloads.packages.map((p) => { + // return { + // ...p, + // downloads: p.downloads.filter( + // (d) => d.day >= startDate + // ), + // } + // }) + + // Sort downloads by date + const sortedDownloads = packageGroupDownloads.packages + .flatMap((p) => p.downloads) + .sort( + (a, b) => + d3.timeDay(a.day).getTime() - + d3.timeDay(b.day).getTime() + ) + + // Get the binning unit and calculate partial bin boundaries + const binUnit = binOption.bin + const now = d3.timeDay(new Date()) + const partialBinEnd = binUnit.floor(now) + + // Filter downloads based on showDataMode for total downloads + const filteredDownloads = sortedDownloads.filter( + (d) => d3.timeDay(new Date(d.day)) < partialBinEnd + ) + + // Group downloads by bin using d3 + const binnedDownloads = d3.sort( + d3.rollup( + filteredDownloads, + (v) => d3.sum(v, (d) => d.downloads), + (d) => binUnit.floor(new Date(d.day)) + ), + (d) => d[0] + ) + + const color = getPackageColor( + firstPackage.name, + packageGroups + ) + + const firstBin = binnedDownloads[0] + const lastBin = + binnedDownloads[binnedDownloads.length - 1] + + const growth = lastBin[1] - firstBin[1] + const growthPercentage = growth / firstBin[1] + + return { + package: firstPackage.name, + totalDownloads: d3.sum( + binnedDownloads, + (d) => d[1] + ), + binDownloads: lastBin[1], + growth, + growthPercentage, + color, + hidden: firstPackage.hidden, + index, + } + }) + .filter(Boolean) + .sort((a, b) => + transform === 'normalize-y' + ? b!.growth - a!.growth + : b!.binDownloads - a!.binDownloads + ) + .map((stat) => ( + + + + + {/* + */} + + ))} + +
    + Package Name + + Total Period Downloads + + Downloads last {binOption.single} + + Period Growth + + Period Growth % +
    +
    + + + +
    +
    + + + + + + +
    +
    +
    +
    + {formatNumber(stat!.totalDownloads)} + + {formatNumber(stat!.binDownloads)} + 0 + ? 'text-green-500' + : stat!.growth < 0 + ? 'text-red-500' + : 'text-gray-500' + }`} + > +
    + {stat!.growth > 0 ? ( + + ) : ( + + )} + {formatNumber(Math.abs(stat!.growth))} +
    +
    0 + ? 'text-green-500' + : stat!.growthPercentage < 0 + ? 'text-red-500' + : 'text-gray-500' + }`} + > +
    + {stat!.growthPercentage > 0 ? ( + + ) : ( + + )} + {Math.abs(stat!.growthPercentage).toFixed(1)}% +
    +
    +
    +
    +
    + ) : null} + + {/* Popular Comparisons Section */} +
    +

    Popular Comparisons

    +
    + {getPopularComparisons().map((comparison) => { + const baselinePackage = comparison.packageGroups.find( + (pg) => pg.baseline + ) + return ( + ({ + ...prev, + packageGroups: comparison.packageGroups, + baseline: comparison.packageGroups.find( + (pg) => pg.baseline + )?.packages[0].name, + })} + resetScroll={false} + onClick={(e) => { + window.scrollTo({ + top: 0, + behavior: 'smooth', + }) + }} + className="block p-4 bg-gray-500/10 hover:bg-gray-500/20 rounded-lg transition-colors space-y-4" + > +
    +
    +

    {comparison.title}

    +
    +
    + {comparison.packageGroups + .filter((d) => !d.baseline) + .map((packageGroup) => ( +
    +
    + {packageGroup.packages[0].name} +
    + ))} +
    +
    + {baselinePackage && ( +
    +
    Baseline:
    +
    + {baselinePackage.packages[0].name} +
    +
    + )} + + ) + })} +
    +
    +
    + +
    +
    + +
    +
    + ) +} diff --git a/app/server/airtable.ts b/app/server/airtable.ts new file mode 100644 index 000000000..54aadcf0f --- /dev/null +++ b/app/server/airtable.ts @@ -0,0 +1,18 @@ +import Airtable from 'airtable' + +const airtable = () => new Airtable({ apiKey: process.env.AIRTABLE_API_KEY }) + +export async function getSponsorsTable() { + const base = airtable().base('apppS8mjo4MMR3pif') + return base('sponsors') +} + +export async function getTiersTable() { + const base = airtable().base('apppS8mjo4MMR3pif') + return base('tiers') +} + +export async function getDiscordInvitesTable() { + const base = airtable().base('apppS8mjo4MMR3pif') + return base('tiers') +} diff --git a/app/server/discord-github.ts b/app/server/discord-github.ts new file mode 100644 index 000000000..7d292fbd7 --- /dev/null +++ b/app/server/discord-github.ts @@ -0,0 +1,45 @@ +import { Octokit } from '@octokit/rest' +import { linkSponsorToken } from '~/server/discord' +import { getSponsorsAndTiers } from '~/server/sponsors' + +export async function linkGithubAndDiscordUser({ githubToken, discordToken }) { + let login + + try { + const octokit = new Octokit({ + auth: githubToken, + useAgent: `TanStack.com ${githubToken}`, + }) + + const { data } = await octokit.users.getAuthenticated() + + login = data.login + } catch (err) { + console.error(err) + throw new Error('Unable to fetch GitHub user info. Please log in again.') + } + + let sponsor + try { + const { sponsors } = await getSponsorsAndTiers() + + sponsor = sponsors.find((d) => d.login == login) + } catch (err) { + throw new Error('Unable to fetch sponsor info. Please contact support.') + } + + if (!sponsor) { + throw new Error( + `TanStack sponsorship not found for GitHub user "${login}". Please sign up at https://github.com/sponsors/tannerlinsley` + ) + } + + const sponsorType = sponsor.tier.meta.sponsorType + + const message = await linkSponsorToken({ + discordToken, + sponsorType, + }) + + return message +} diff --git a/app/server/discord.ts b/app/server/discord.ts new file mode 100644 index 000000000..cfcbe63b5 --- /dev/null +++ b/app/server/discord.ts @@ -0,0 +1,169 @@ +import axios from 'axios' +import * as qss from 'qss' + +const discordClientId = '725855554362146899' +const discordClientSecret = process.env.DISCORD_APP_CLIENT_SECRET +const guildId = '719702312431386674' +const discordBaseURL = 'https://discord.com/api/' + +// const channelsBySponsorType = { +// welcome: '725435640673468500', +// fan: '803508045627654155', +// supporter: '803508117752119307', +// premierSponsor: '803508359378370600', +// } + +const rolesBySponsorType = { + fan: 'Fan', + supporter: 'Supporter', + premierSponsor: 'Premier Sponsor', +} + +const TanBotToken = process.env.DISCORD_TOKEN + +// const clientsByToken = {} + +// async function getClient(discordToken) { +// if (!discordToken) { +// throw new Error('No discord token found') +// } +// if (!clientsByToken[discordToken]) { +// const client = new Discord.Client() + +// clientsByToken[discordToken] = new Promise((resolve, reject) => { +// client.on('ready', async () => { +// console.info('Discord Connected.') +// resolve(client) +// }) +// client.login(discordToken).catch(reject) +// }) +// } + +// return clientsByToken[discordToken] +// } + +// export async function getInviteLink({ tier }) { +// await getClient() + +// const invite = await channel.createInvite({ +// maxUses: 1, +// }) + +// return `https://discord.gg/${invite.code}` +// } + +export async function linkSponsorToken({ discordToken, sponsorType }) { + if (sponsorType === 'sleep-aid') { + throw new Error( + '😔 You must be at least a "Fan" sponsor to access exclusive discord channels.' + ) + } + + if (!rolesBySponsorType[sponsorType]) { + throw new Error('Invalid sponsor type! Contact support, please!') + } + + const botClient = axios.create({ + baseURL: discordBaseURL, + headers: { + authorization: `Bot ${TanBotToken}`, + }, + }) + + const userClient = axios.create({ + baseURL: discordBaseURL, + headers: { + authorization: `Bearer ${discordToken}`, + }, + }) + + let roles, userData + try { + const { data } = await botClient.get(`/guilds/${guildId}/roles`) + roles = data + } catch (err) { + console.error(err) + throw new Error('Unable to fetch Discord roles. Please contact support!') + } + + try { + const { data } = await userClient.get('/users/@me') + userData = data + } catch (err) { + console.error(err) + throw new Error( + 'Unable to fetch Discord user info. Please contact support!' + ) + } + + let tierRole = roles.find((role) => + role.name.includes(rolesBySponsorType[sponsorType]) + ) + + if (!tierRole) { + throw new Error( + 'Could not find Discord role for sponsor tier! Please contact support.' + ) + } + + let addData + + try { + const { data } = await botClient.put( + `/guilds/${guildId}/members/${userData.id}`, + { + roles: [tierRole.id], + access_token: discordToken, + } + ) + + addData = data + } catch (err) { + throw new Error( + 'Unable to add user to TanStack Discord. Please contact support.' + ) + } + + if (!addData) { + try { + await botClient.patch(`/guilds/${guildId}/members/${userData.id}`, { + roles: [tierRole.id], + access_token: discordToken, + }) + } catch (err) { + throw new Error( + 'Could not update Discord role for user! Please contact support.' + ) + } + } + + return `You have been successfully added to the TanStack discord, along with the exclusive access to the sponsors-only "${tierRole.name}" channel!` +} + +export async function exchangeDiscordCodeForToken({ code, redirectUrl }) { + try { + const body = qss.encode({ + client_id: discordClientId, + client_secret: discordClientSecret, + grant_type: 'authorization_code', + code, + redirect_uri: redirectUrl, + scope: 'identify guilds.join', + }) + + const { data } = await axios.post( + 'https://discord.com/api/oauth2/token', + body, + { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + } + ) + + return data.access_token + } catch (err) { + console.error(err) + throw new Error('Unable to authenticate with Discord. Please log in again.') + } +} diff --git a/app/server/github.ts b/app/server/github.ts new file mode 100644 index 000000000..072c957d7 --- /dev/null +++ b/app/server/github.ts @@ -0,0 +1,58 @@ +import axios from 'axios' +import { Octokit } from '@octokit/rest' +import { graphql } from '@octokit/graphql' + +export const GITHUB_ORG = 'TanStack' + +export const octokit = new Octokit({ + auth: process.env.GITHUB_AUTH_TOKEN, + userAgent: 'TanStack.com', +}) + +export const graphqlWithAuth = graphql.defaults({ + headers: { + authorization: `token ${process.env.GITHUB_AUTH_TOKEN}`, + }, +}) + +const githubClientID = 'Iv1.3aa8d13a4a3fde91' +const githubClientSecret = 'e2340f390f956b6fbfb9c6f85100d6cfe07f29a8' + +export async function exchangeGithubCodeForToken({ code, state, redirectUrl }) { + try { + const { data } = await axios.post( + 'https://github.com/login/oauth/access_token', + { + client_id: githubClientID, + client_secret: githubClientSecret, + code, + redirect_uri: redirectUrl, + state, + }, + { + headers: { + Accept: 'application/json', + }, + } + ) + + return data.access_token + } catch (err) { + console.error(err) + throw new Error('Unable to authenticate with GitHub. Please log in again.') + } +} + +export async function getTeamBySlug(slug) { + const teams = await octokit.teams.list({ + org: GITHUB_ORG, + }) + + const sponsorsTeam = teams.data.find((x) => x.slug === slug) + + if (!sponsorsTeam) { + throw new Error(`Cannot find team "${slug}" in the organization`) + } + + return sponsorsTeam +} diff --git a/app/server/sponsors.ts b/app/server/sponsors.ts new file mode 100644 index 000000000..32670be97 --- /dev/null +++ b/app/server/sponsors.ts @@ -0,0 +1,293 @@ +import { fetchCached } from '~/utils/cache.server' +import { getSponsorsTable } from '~/server/airtable' +import { GITHUB_ORG, graphqlWithAuth, octokit } from '~/server/github' +import { + getGithubTiersWithMeta, + getTierById, + updateTiersMeta, +} from '~/server/tiers' +import { createServerFn } from '@tanstack/start' +import { getEvent, setHeaders } from 'vinxi/http' + +export type Sponsor = { + login: string + name: string + email: string + imageUrl: string + linkUrl: string + privacyLevel: string + tier: { + id: string + monthlyPriceInDollars: number + meta: { + githubTeamSlug: string + } + } + createdAt: string +} + +// const teamsBySponsorType = { +// fan: 'Fan', +// supporter: 'Supporter', +// premierSponsor: 'Premier Sponsor', +// } + +export async function sponsorCreated({ login, newTier }) { + // newTier = await getTierById(newTier.id) + + await inviteAllSponsors() + + // if (newTier.meta.githubTeamSlug) { + // await octokit.teams.addOrUpdateMembershipForUserInOrg({ + // org: GITHUB_ORG, + // team_slug: newTier.meta.githubTeamSlug, + // username: login, + // }) + + // console.info(`invited user:${login} to team:${newTier.meta.githubTeamSlug}`) + // } +} + +export async function sponsorEdited({ login, oldTier, newTier }) { + oldTier = await getTierById(oldTier.id) + // newTier = await getTierById(newTier.id) + + await octokit.teams.removeMembershipForUserInOrg({ + org: GITHUB_ORG, + team_slug: oldTier.meta.githubTeamSlug, + username: login, + }) + console.info(`removed user:${login} from team:${oldTier.meta.githubTeamSlug}`) + + await inviteAllSponsors() + // await octokit.teams.addOrUpdateMembershipForUserInOrg({ + // org: GITHUB_ORG, + // team_slug: newTier.meta.githubTeamSlug, + // username: login, + // }) + // console.info(`invited user:${login} to team:${newTier.meta.githubTeamSlug}`) +} + +export async function sponsorCancelled({ login, oldTier }) { + oldTier = await getTierById(oldTier.id) + await octokit.teams.removeMembershipForUserInOrg({ + org: GITHUB_ORG, + team_slug: oldTier.meta.githubTeamSlug, + username: login, + }) + console.info(`removed user:${login} from team:${oldTier.meta.githubTeamSlug}`) +} + +async function inviteAllSponsors() { + let { sponsors } = await getSponsorsAndTiers() + + await Promise.all( + sponsors.map(async (sponsor) => { + await octokit.teams.addOrUpdateMembershipForUserInOrg({ + org: GITHUB_ORG, + team_slug: sponsor.tier.meta.githubTeamSlug, + username: sponsor.login, + }) + }) + ) +} + +export async function getSponsorsAndTiers() { + const tiers = await getGithubTiersWithMeta() + await updateTiersMeta(tiers) + + let [sponsors, sponsorsMeta] = await Promise.all([ + getGithubSponsors(), + getSponsorsMeta().then((all) => all.map((d) => d.fields)), + ]) + + sponsors = sponsors.map((d) => ({ + ...d, + tier: tiers.find((tier) => tier.id == d.tier.id), + })) + + sponsorsMeta.forEach((sponsorMeta) => { + const matchingSponsor = sponsors.find((d) => d.login == sponsorMeta.login) + + if (matchingSponsor) { + Object.assign(matchingSponsor, { + name: sponsorMeta.name ?? matchingSponsor.name, + email: sponsorMeta.email ?? matchingSponsor.email, + imageUrl: sponsorMeta.imageUrl ?? matchingSponsor.imageUrl, + linkUrl: sponsorMeta.linkUrl ?? matchingSponsor.linkUrl, + privacyLevel: sponsorMeta.privacyLevel ?? matchingSponsor.privacyLevel, + }) + } else { + const tier = tiers.find((d) => d.id === sponsorMeta.tierId?.[0]) + sponsors.push({ + ...sponsorMeta, + tier, + }) + } + }) + + sponsors.sort( + (a, b) => + b.monthlyPriceInDollars - a.monthlyPriceInDollars || + (b.createdAt > a.createdAt ? -1 : 1) + ) + + return { + sponsors, + tiers, + } +} + +async function getGithubSponsors() { + let sponsors: Sponsor = [] + try { + const fetchPage = async (cursor = '') => { + const res = await graphqlWithAuth( + ` + query ($cursor: String) { + viewer { + sponsorshipsAsMaintainer(first: 100, after: $cursor, includePrivate: true) { + pageInfo { + hasNextPage + endCursor + } + edges { + node { + createdAt + sponsorEntity { + ... on User { + name + login + email + } + ... on Organization { + name + login + email + } + } + tier { + id + monthlyPriceInDollars + } + privacyLevel + } + } + } + } + } + `, + { + cursor, + } + ) + + const { + viewer: { + sponsorshipsAsMaintainer: { + pageInfo: { hasNextPage, endCursor }, + edges, + }, + }, + } = res + + sponsors = [ + ...sponsors, + ...edges.map((edge) => { + const { + node: { createdAt, sponsorEntity, tier, privacyLevel }, + } = edge + + if (!sponsorEntity) { + return null + } + + const { name, login, email } = sponsorEntity + + return { + name, + login, + email, + tier, + createdAt, + privacyLevel, + } + }), + ] + + if (hasNextPage) { + await fetchPage(endCursor) + } + } + + await fetchPage() + + return sponsors.filter(Boolean) + } catch (err: any) { + if (err.status === 401) { + console.error('Missing github credentials, returning mock data.') + return [] + } + throw err + } +} + +async function getSponsorsMeta() { + try { + const sponsorsTable = await getSponsorsTable() + + return new Promise((resolve, reject) => { + let allSponsors = [] + sponsorsTable.select().eachPage( + function page(records, fetchNextPage) { + allSponsors = [...allSponsors, ...records] + fetchNextPage() + }, + function done(err) { + if (err) { + reject(err) + } else { + resolve(allSponsors) + } + } + ) + }) + } catch (err: any) { + if (err.message === 'An API key is required to connect to Airtable') { + console.error('Missing airtable credentials, returning mock data.') + + return [] + } + throw err + } +} + +export const getSponsorsForSponsorPack = createServerFn({ + method: 'GET', +}).handler(async () => { + let { sponsors } = (await fetchCached({ + key: 'sponsors', + // ttl: process.env.NODE_ENV === 'development' ? 1 : 60 * 60 * 1000, + ttl: 60 * 1000, + fn: getSponsorsAndTiers, + })) as { sponsors: Sponsor[] } + + if (!getEvent().handled) { + setHeaders({ + 'cache-control': 'public, max-age=0, must-revalidate', + 'cdn-cache-control': 'max-age=300, stale-while-revalidate=300, durable', + }) + } + + return sponsors + .filter((d) => d.privacyLevel === 'PUBLIC') + .map((d) => ({ + linkUrl: d.linkUrl, + login: d.login, + imageUrl: d.imageUrl, + name: d.name, + tier: { + monthlyPriceInDollars: d.tier?.monthlyPriceInDollars, + }, + })) +}) diff --git a/app/server/tiers.ts b/app/server/tiers.ts new file mode 100644 index 000000000..a13441286 --- /dev/null +++ b/app/server/tiers.ts @@ -0,0 +1,140 @@ +import { getTiersTable } from '~/server/airtable' +import { graphqlWithAuth } from '~/server/github' + +async function getTiersMeta() { + try { + const tiersTable = await getTiersTable() + + const tiers = await new Promise((resolve, reject) => { + let allTiers = [] + tiersTable.select().eachPage( + function page(records, fetchNextPage) { + allTiers = [...allTiers, ...records] + fetchNextPage() + }, + function done(err) { + if (err) { + reject(err) + } else { + resolve(allTiers) + } + } + ) + }) + + return tiers + } catch (err: any) { + if (err.message === 'An API key is required to connect to Airtable') { + console.error('Missing airtable credentials, returning mock data.') + return [] + } + throw err + } +} + +async function createTiersMeta(tiersMeta) { + const tiersTable = await getTiersTable() + + return new Promise((resolve, reject) => { + tiersTable.create( + tiersMeta.map((d) => ({ fields: d })), + function (err) { + if (err) { + return reject(err) + } + resolve() + } + ) + }) + // return Promise.resolve() +} + +export async function getTierById(tierId) { + const tiers = await getGithubTiers() + const tier = tiers.find((d) => d.id == tierId) + + if (!tier) { + throw new Error(`Could not find tier with id: ${tierId}`) + } + + const tiersMeta = await getTiersMeta() + const tierMeta = tiersMeta.find((d) => d.fields.id === tierId) + + if (!tierMeta) { + throw new Error(`Could not find tierMeta with id: ${tierId}`) + } + + return { + ...tier, + meta: tierMeta, + } +} + +export async function getGithubTiers() { + try { + const res: any = await graphqlWithAuth( + `query { + viewer { + sponsorshipsAsMaintainer(first: 1) { + nodes { + sponsorable { + sponsorsListing { + tiers(first: 100) { + nodes { + id + name + description + descriptionHTML + monthlyPriceInDollars + } + } + } + } + } + } + } + }` + ) + + return res.viewer.sponsorshipsAsMaintainer.nodes[0].sponsorable + .sponsorsListing.tiers.nodes + } catch (err: any) { + if (err?.status === 401) { + console.error('Missing github credentials, returning mock data.') + return [] + } + + throw err + } +} + +export async function getGithubTiersWithMeta() { + const githubTiers = await getGithubTiers() + const tiersMeta = await getTiersMeta() + + return githubTiers.map((d) => ({ + ...d, + meta: tiersMeta.find((meta) => meta.fields?.id == d.id)?.fields, + })) +} + +export async function updateTiersMeta(githubTiers) { + const tiersMeta = await getTiersMeta() + + await Promise.all( + tiersMeta.map((tierMeta) => { + const newTier = githubTiers.find((d) => d.id === tierMeta.fields.id) + if (newTier) { + githubTiers = githubTiers.filter((d) => d !== newTier) + return tierMeta.updateFields({ + name: newTier.name, + }) + } + return tierMeta.destroy() + }) + ) + + if (githubTiers?.length) { + await createTiersMeta(githubTiers.map((d) => ({ id: d.id, name: d.name }))) + } +} diff --git a/app/ssr.tsx b/app/ssr.tsx new file mode 100644 index 000000000..62572579a --- /dev/null +++ b/app/ssr.tsx @@ -0,0 +1,12 @@ +import { + createStartHandler, + defaultStreamHandler, +} from '@tanstack/start/server' +import { getRouterManifest } from '@tanstack/start/router-manifest' + +import { createRouter } from './router' + +export default createStartHandler({ + createRouter, + getRouterManifest, +})(defaultStreamHandler) diff --git a/app/styles/app.css b/app/styles/app.css new file mode 100644 index 000000000..cd294e518 --- /dev/null +++ b/app/styles/app.css @@ -0,0 +1,533 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html, + body { + @apply text-gray-900 bg-gray-50 dark:bg-gray-950 dark:text-gray-200; + } + + .using-mouse * { + outline: none !important; + } + + * { + scrollbar-color: theme(colors.gray.400) theme(colors.gray.100); + } + + *::-webkit-scrollbar, + * scrollbar { + width: 1rem; + height: 1rem; + } + + *::-webkit-scrollbar-track, + * scrollbar-track { + background: theme(colors.gray.100); + } + + *::-webkit-scrollbar-thumb, + * scrollbar-thumb { + background: theme(colors.gray.300); + border-radius: 0.5rem; + border: 3px solid theme(colors.gray.100); + } + + html.dark { + &, + * { + color-scheme: dark; + } + + &, + * { + scrollbar-color: theme(colors.gray.700) theme(colors.gray.800); + } + + &::-webkit-scrollbar, + *::-webkit-scrollbar, + * scrollbar { + width: 1rem; + height: 1rem; + } + + & *::-webkit-scrollbar-track, + *::-webkit-scrollbar-track, + * scrollbar-track { + background: theme(colors.gray.800); + } + + &::-webkit-scrollbar-thumb, + *::-webkit-scrollbar-thumb, + * scrollbar-thumb { + background: theme(colors.gray.600); + border-radius: 0.5rem; + border: 3px solid theme(colors.gray.800); + } + } + + [disabled] { + @apply opacity-50 pointer-events-none; + } + + #docs-details summary::-webkit-details-marker { + display: none; + } + + #docs-details .icon-close { + display: none; + } + + #docs-details[open] .icon-close { + display: block; + } + + #docs-details[open] .icon-open { + display: none; + } + + #docs-details[open] > summary + * { + height: auto; + max-height: calc(100vh - 62px); + } + + .anchor-heading { + text-decoration: none !important; + display: inline; + } + + .anchor-heading > *:after { + content: '#'; + @apply relative opacity-0 ml-2 transition duration-100; + } + + .anchor-heading:hover > *:after { + @apply opacity-50; + } + + :has(+ .anchor-heading) { + margin-bottom: 0 !important; + } + + .anchor-heading + * { + margin-top: 0 !important; + } + + .carbon-small { + pointer-events: none; + } + + .carbon-small #carbonads { + @apply pointer-events-none; + } + + .carbon-small .carbon-outer { + @apply pointer-events-none; + } + + .carbon-small .carbon-wrap { + @apply flex flex-col; + } + + .carbon-small .carbon-wrap .carbon-img { + @apply w-[50%] pt-2 !pointer-events-auto rounded-tr-lg border-t border-r border-gray-500 border-opacity-10 overflow-hidden; + } + + .carbon-small .carbon-wrap .carbon-img img { + @apply w-full !max-w-full; + } + + .carbon-small .carbon-wrap .carbon-text { + @apply bg-white dark:bg-gray-800 rounded-tr-lg !pb-6 !m-0 !pointer-events-auto border-t border-r border-gray-500 border-opacity-10; + } + + .carbon-small .carbon-wrap .carbon-poweredby { + @apply absolute bottom-0 right-0; + } +} + +/* https://github.com/shikijs/twoslash/tree/main/packages/remark-shiki-twoslash#plugin-setup */ +pre { + /* All code samples get a grey border, twoslash ones get a different color */ + @apply bg-white text-black p-2 border border-gray-500/30 mb-4 rounded-md; + @apply overflow-x-auto relative leading-tight; +} +pre.shiki { + overflow-x: auto; +} +pre.shiki:hover .dim { + opacity: 1; +} +pre.shiki div.dim { + opacity: 0.5; +} +pre.shiki div.dim, +pre.shiki div.highlight { + margin: 0; + padding: 0; +} +pre.shiki div.highlight { + opacity: 1; + background-color: #f1f8ff; +} +pre.shiki div.line { + min-height: 1rem; +} + +/** Don't show the language identifiers */ +pre.shiki .language-id { + display: none; +} + +pre.has-diff span.remove { + background-color: #ff000036; +} + +pre.has-diff span.add { + background-color: #00ff0036; +} +/* Visually differentiates twoslash code samples */ +pre.twoslash { + border-color: #719af4; +} + +/** When you mouse over the pre, show the underlines */ +pre.twoslash:hover data-lsp { + border-color: #747474; +} + +/** The tooltip-like which provides the LSP response */ +pre.twoslash data-lsp:hover::before { + content: attr(lsp); + position: absolute; + transform: translate(0, 1rem); + + background-color: #3f3f3f; + color: #fff; + text-align: left; + padding: 5px 8px; + border-radius: 2px; + font-family: 'JetBrains Mono', Menlo, Monaco, Consolas, monospace, Courier New; + font-size: 14px; + white-space: pre-wrap; + z-index: 100; +} + +pre .code-container { + overflow: auto; +} +/* The try button */ +pre .code-container > a { + position: absolute; + right: 8px; + bottom: 8px; + border-radius: 4px; + border: 1px solid #719af4; + padding: 0 8px; + color: #719af4; + text-decoration: none; + opacity: 0; + transition-timing-function: ease; + transition: opacity 0.3s; +} +/* Respect no animations */ +@media (prefers-reduced-motion: reduce) { + pre .code-container > a { + transition: none; + } +} +pre .code-container > a:hover { + color: white; + background-color: #719af4; +} +pre .code-container:hover a { + opacity: 1; +} + +pre code { + font-size: 12px; + font-family: 'JetBrains Mono', Menlo, Monaco, Consolas, monospace, Courier New; + white-space: pre; + -webkit-overflow-scrolling: touch; +} +pre code a { + text-decoration: none; +} +pre data-err { + /* Extracted from VS Code */ + background: url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%206%203'%20enable-background%3D'new%200%200%206%203'%20height%3D'3'%20width%3D'6'%3E%3Cg%20fill%3D'%23c94824'%3E%3Cpolygon%20points%3D'5.5%2C0%202.5%2C3%201.1%2C3%204.1%2C0'%2F%3E%3Cpolygon%20points%3D'4%2C0%206%2C2%206%2C0.6%205.4%2C0'%2F%3E%3Cpolygon%20points%3D'0%2C2%201%2C3%202.4%2C3%200%2C0.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") + repeat-x bottom left; + padding-bottom: 3px; +} +pre .query { + margin-bottom: 10px; + color: #137998; + display: inline-block; +} + +/* In order to have the 'popped out' style design and to not break the layout +/* we need to place a fake and un-selectable copy of the error which _isn't_ broken out +/* behind the actual error message. + +/* This sections keeps both of those two in in sync */ + +pre .error, +pre .error-behind { + margin-left: -14px; + margin-top: 8px; + margin-bottom: 4px; + padding: 6px; + padding-left: 14px; + width: calc(100% - 20px); + white-space: pre-wrap; + display: block; +} +pre .error { + position: absolute; + background-color: #fee; + border-left: 2px solid #bf1818; + /* Give the space to the error code */ + display: flex; + align-items: center; + color: black; +} +pre .error .code { + display: none; +} +pre .error-behind { + user-select: none; + visibility: transparent; + color: #fee; +} +/* Queries */ +pre .arrow { + /* Transparent background */ + background-color: #eee; + position: relative; + top: -7px; + margin-left: 0.1rem; + /* Edges */ + border-left: 1px solid #eee; + border-top: 1px solid #eee; + transform: translateY(25%) rotate(45deg); + /* Size */ + height: 8px; + width: 8px; +} +pre .popover { + margin-bottom: 10px; + background-color: #eee; + display: inline-block; + padding: 0 0.5rem 0.3rem; + margin-top: 10px; + border-radius: 3px; +} +/* Completion */ +pre .inline-completions ul.dropdown { + display: inline-block; + position: absolute; + width: 240px; + background-color: gainsboro; + color: grey; + padding-top: 4px; + font-family: var(--code-font); + font-size: 0.8rem; + margin: 0; + padding: 0; + border-left: 4px solid #4b9edd; +} +pre .inline-completions ul.dropdown::before { + background-color: #4b9edd; + width: 2px; + position: absolute; + top: -1.2rem; + left: -3px; + content: ' '; +} +pre .inline-completions ul.dropdown li { + overflow-x: hidden; + padding-left: 4px; + margin-bottom: 4px; +} +pre .inline-completions ul.dropdown li.deprecated { + text-decoration: line-through; +} +pre .inline-completions ul.dropdown li span.result-found { + color: #4b9edd; +} +pre .inline-completions ul.dropdown li span.result { + width: 100px; + color: black; + display: inline-block; +} +.dark-theme .markdown pre { + background-color: #d8d8d8; + border-color: #ddd; + filter: invert(98%) hue-rotate(180deg); +} +data-lsp { + /* Ensures there's no 1px jump when the hover happens */ + border-bottom: 1px dotted transparent; + /* Fades in unobtrusively */ + transition-timing-function: ease; + transition: border-color 0.3s; +} +/* Respect people's wishes to not have animations */ +@media (prefers-reduced-motion: reduce) { + data-lsp { + transition: none; + } +} + +/** Annotations support, providing a tool for meta commentary */ +.tag-container { + position: relative; +} +.tag-container .twoslash-annotation { + position: absolute; + font-family: 'JetBrains Mono', Menlo, Monaco, Consolas, monospace, Courier New; + right: -10px; + /** Default annotation text to 200px */ + width: 200px; + color: #187abf; + background-color: #fcf3d9 bb; +} +.tag-container .twoslash-annotation p { + text-align: left; + font-size: 0.8rem; + line-height: 0.9rem; +} +.tag-container .twoslash-annotation svg { + float: left; + margin-left: -44px; +} +.tag-container .twoslash-annotation.left { + right: auto; + left: -200px; +} +.tag-container .twoslash-annotation.left svg { + float: right; + margin-right: -5px; +} + +/** Support for showing console log/warn/errors inline */ +pre .logger { + display: flex; + align-items: center; + color: black; + padding: 6px; + padding-left: 8px; + width: calc(100% - 19px); + white-space: pre-wrap; +} +pre .logger svg { + margin-right: 9px; +} +pre .logger.error-log { + background-color: #fee; + border-left: 2px solid #bf1818; +} +pre .logger.warn-log { + background-color: #ffe; + border-left: 2px solid #eae662; +} +pre .logger.log-log { + background-color: #e9e9e9; + border-left: 2px solid #ababab; +} +pre .logger.log-log svg { + margin-left: 6px; + margin-right: 9px; +} + +html:not(.dark) .shiki.tokyo-night { + display: none; +} + +html.dark .shiki.github-light { + display: none; +} + +/* TanStack Router Devtools */ + +.TanStackRouterDevtools > button { + @apply rotate-90 origin-top-right -translate-y-[50px] translate-x-2 rounded-t-none bg-white dark:bg-gray-900; + @apply border-t-0 border-gray-500/10 shadow-xl text-gray-800; +} + +/* Hubspot */ + +#hubspot-messages-iframe-container { + @apply translate-x-[10px] translate-y-[10px]; + @apply dark:[color-scheme:dark]; +} + +/* Markdown Alerts */ +.markdown-alert { + @apply border-l-4 pl-4 py-1.5 my-2 dark:bg-gray-900 rounded-r-sm; +} + +.markdown-alert > * { + @apply m-0; +} + +.markdown-alert.markdown-alert-note { + @apply border-blue-500/90; +} + +.markdown-alert.markdown-alert-note svg { + @apply fill-blue-500/90; +} + +.markdown-alert.markdown-alert-warning { + @apply border-yellow-500/90; +} + +.markdown-alert.markdown-alert-warning svg { + @apply fill-yellow-500/90; +} + +.markdown-alert.markdown-alert-caution { + @apply border-red-500/90; +} + +.markdown-alert.markdown-alert-caution svg { + @apply fill-red-500/90; +} + +.markdown-alert.markdown-alert-tip { + @apply border-green-500/90; +} + +.markdown-alert.markdown-alert-tip svg { + @apply fill-green-500/90; +} + +.markdown-alert.markdown-alert-important { + @apply border-purple-500/90; +} + +.markdown-alert.markdown-alert-important svg { + @apply fill-purple-500/90; +} + +.markdown-alert .markdown-alert-title { + @apply flex justify-start items-center font-medium mb-1.5; +} + +.bg-clip-text { + @apply print:text-gray-800; +} + +mark { + @apply bg-yellow-400 rounded-md px-px mx-px; +} + +.dark g[aria-label='tip'] > g > path { + @apply fill-gray-800/90 stroke-gray-500/20; +} + +/* svg g[aria-label='crosshair text'] { + stroke: none; +} */ diff --git a/app/styles/app.generated.css b/app/styles/app.generated.css new file mode 100644 index 000000000..8978ab8e8 --- /dev/null +++ b/app/styles/app.generated.css @@ -0,0 +1,4165 @@ +/* +! tailwindcss v3.1.6 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, + 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + /* 4 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + 'Liberation Mono', monospace, 'Courier New'; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, +textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role='button'] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +html, +body { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +@media (prefers-color-scheme: dark) { + html, + body { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity)); + } + + * { + color-scheme: dark; + } +} + +/* * { + scrollbar-color: theme(colors.gray.500) theme(colors.gray.100); + } + + *::-webkit-scrollbar, + * scrollbar { + width: 1rem; + height: 1rem; + } + + *::-webkit-scrollbar-track, + * scrollbar-track { + background: theme(colors.gray.100); + } + + *::-webkit-scrollbar-thumb, + * scrollbar-thumb { + background: theme(colors.gray.300); + border-radius: 0.5rem; + border: 3px solid theme(colors.gray.100); + } + + @media (prefers-color-scheme: dark) { + * { + scrollbar-color: theme(colors.gray.500) theme(colors.gray.800); + } + + *::-webkit-scrollbar, + * scrollbar { + width: 1rem; + height: 1rem; + } + + *::-webkit-scrollbar-track, + * scrollbar-track { + background: theme(colors.gray.800); + } + + *::-webkit-scrollbar-thumb, + * scrollbar-thumb { + background: theme(colors.gray.600); + border-radius: 0.5rem; + border: 3px solid theme(colors.gray.800); + } + } */ + +[disabled] { + pointer-events: none; + opacity: 0.5; +} + +#docs-details summary::-webkit-details-marker { + display: none; +} + +#docs-details .icon-close { + display: none; +} + +#docs-details[open] .icon-close { + display: block; +} + +#docs-details[open] .icon-open { + display: none; +} + +#docs-details[open] > summary + * { + height: 80vh; +} + +.anchor-heading { + text-decoration: none !important; +} + +.anchor-heading > *:after { + content: '#'; + position: relative; + margin-left: 0.5rem; + opacity: 0; + transition-property: color, background-color, border-color, fill, stroke, + opacity, box-shadow, transform, filter, -webkit-text-decoration-color, + -webkit-backdrop-filter; + transition-property: color, background-color, border-color, + text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, + backdrop-filter; + transition-property: color, background-color, border-color, + text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, + backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; +} + +.anchor-heading:hover > *:after { + opacity: 0.5; +} + +*, +::before, +::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::-webkit-backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.prose { + color: var(--tw-prose-body); + max-width: 65ch; +} + +.prose :where([class~='lead']):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-lead); + font-size: 1.25em; + line-height: 1.6; + margin-top: 1.2em; + margin-bottom: 1.2em; +} + +.prose :where(a):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-links); + text-decoration: underline; + font-weight: 500; +} + +.prose :where(strong):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-bold); + font-weight: 600; +} + +.prose :where(a strong):not(:where([class~='not-prose'] *)) { + color: inherit; +} + +.prose :where(blockquote strong):not(:where([class~='not-prose'] *)) { + color: inherit; +} + +.prose :where(thead th strong):not(:where([class~='not-prose'] *)) { + color: inherit; +} + +.prose :where(ol):not(:where([class~='not-prose'] *)) { + list-style-type: decimal; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-left: 1.625em; +} + +.prose :where(ol[type='A']):not(:where([class~='not-prose'] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type='a']):not(:where([class~='not-prose'] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type='A' s]):not(:where([class~='not-prose'] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type='a' s]):not(:where([class~='not-prose'] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type='I']):not(:where([class~='not-prose'] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type='i']):not(:where([class~='not-prose'] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type='I' s]):not(:where([class~='not-prose'] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type='i' s]):not(:where([class~='not-prose'] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type='1']):not(:where([class~='not-prose'] *)) { + list-style-type: decimal; +} + +.prose :where(ul):not(:where([class~='not-prose'] *)) { + list-style-type: disc; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-left: 1.625em; +} + +.prose :where(ol > li):not(:where([class~='not-prose'] *))::marker { + font-weight: 400; + color: var(--tw-prose-counters); +} + +.prose :where(ul > li):not(:where([class~='not-prose'] *))::marker { + color: var(--tw-prose-bullets); +} + +.prose :where(hr):not(:where([class~='not-prose'] *)) { + border-color: var(--tw-prose-hr); + border-top-width: 1px; + margin-top: 3em; + margin-bottom: 3em; +} + +.prose :where(blockquote):not(:where([class~='not-prose'] *)) { + font-weight: 500; + font-style: italic; + color: var(--tw-prose-quotes); + border-left-width: 0.25rem; + border-left-color: var(--tw-prose-quote-borders); + quotes: '\201C''\201D''\2018''\2019'; + margin-top: 1.6em; + margin-bottom: 1.6em; + padding-left: 1em; +} + +.prose + :where(blockquote p:first-of-type):not( + :where([class~='not-prose'] *) + )::before { + content: open-quote; +} + +.prose + :where(blockquote p:last-of-type):not(:where([class~='not-prose'] *))::after { + content: close-quote; +} + +.prose :where(h1):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-headings); + font-weight: 800; + font-size: 2.25em; + margin-top: 0; + margin-bottom: 0.8888889em; + line-height: 1.1111111; +} + +.prose :where(h1 strong):not(:where([class~='not-prose'] *)) { + font-weight: 900; + color: inherit; +} + +.prose :where(h2):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-headings); + font-weight: 700; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: 1em; + line-height: 1.3333333; +} + +.prose :where(h2 strong):not(:where([class~='not-prose'] *)) { + font-weight: 800; + color: inherit; +} + +.prose :where(h3):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + font-size: 1.25em; + margin-top: 1.6em; + margin-bottom: 0.6em; + line-height: 1.6; +} + +.prose :where(h3 strong):not(:where([class~='not-prose'] *)) { + font-weight: 700; + color: inherit; +} + +.prose :where(h4):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.5em; + margin-bottom: 0.5em; + line-height: 1.5; +} + +.prose :where(h4 strong):not(:where([class~='not-prose'] *)) { + font-weight: 700; + color: inherit; +} + +.prose :where(img):not(:where([class~='not-prose'] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(figure > *):not(:where([class~='not-prose'] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose :where(figcaption):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-captions); + font-size: 0.875em; + line-height: 1.4285714; + margin-top: 0.8571429em; +} + +.prose :where(code):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-code); + font-weight: 600; + font-size: 0.875em; +} + +.prose :where(code):not(:where([class~='not-prose'] *))::before { + content: '`'; +} + +.prose :where(code):not(:where([class~='not-prose'] *))::after { + content: '`'; +} + +.prose :where(a code):not(:where([class~='not-prose'] *)) { + color: inherit; +} + +.prose :where(h1 code):not(:where([class~='not-prose'] *)) { + color: inherit; +} + +.prose :where(h2 code):not(:where([class~='not-prose'] *)) { + color: inherit; + font-size: 0.875em; +} + +.prose :where(h3 code):not(:where([class~='not-prose'] *)) { + color: inherit; + font-size: 0.9em; +} + +.prose :where(h4 code):not(:where([class~='not-prose'] *)) { + color: inherit; +} + +.prose :where(blockquote code):not(:where([class~='not-prose'] *)) { + color: inherit; +} + +.prose :where(thead th code):not(:where([class~='not-prose'] *)) { + color: inherit; +} + +.prose :where(pre):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-pre-code); + background-color: var(--tw-prose-pre-bg); + overflow-x: auto; + font-weight: 400; + font-size: 0.875em; + line-height: 1.7142857; + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; + border-radius: 0.375rem; + padding-top: 0.8571429em; + padding-right: 1.1428571em; + padding-bottom: 0.8571429em; + padding-left: 1.1428571em; +} + +.prose :where(pre code):not(:where([class~='not-prose'] *)) { + background-color: transparent; + border-width: 0; + border-radius: 0; + padding: 0; + font-weight: inherit; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; +} + +.prose :where(pre code):not(:where([class~='not-prose'] *))::before { + content: none; +} + +.prose :where(pre code):not(:where([class~='not-prose'] *))::after { + content: none; +} + +.prose :where(table):not(:where([class~='not-prose'] *)) { + width: 100%; + table-layout: auto; + text-align: left; + margin-top: 2em; + margin-bottom: 2em; + font-size: 0.875em; + line-height: 1.7142857; +} + +.prose :where(thead):not(:where([class~='not-prose'] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-th-borders); +} + +.prose :where(thead th):not(:where([class~='not-prose'] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + vertical-align: bottom; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; +} + +.prose :where(tbody tr):not(:where([class~='not-prose'] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-td-borders); +} + +.prose :where(tbody tr:last-child):not(:where([class~='not-prose'] *)) { + border-bottom-width: 0; +} + +.prose :where(tbody td):not(:where([class~='not-prose'] *)) { + vertical-align: baseline; +} + +.prose :where(tfoot):not(:where([class~='not-prose'] *)) { + border-top-width: 1px; + border-top-color: var(--tw-prose-th-borders); +} + +.prose :where(tfoot td):not(:where([class~='not-prose'] *)) { + vertical-align: top; +} + +.prose { + --tw-prose-body: #374151; + --tw-prose-headings: #111827; + --tw-prose-lead: #4b5563; + --tw-prose-links: #111827; + --tw-prose-bold: #111827; + --tw-prose-counters: #6b7280; + --tw-prose-bullets: #d1d5db; + --tw-prose-hr: #e5e7eb; + --tw-prose-quotes: #111827; + --tw-prose-quote-borders: #e5e7eb; + --tw-prose-captions: #6b7280; + --tw-prose-code: #111827; + --tw-prose-pre-code: #e5e7eb; + --tw-prose-pre-bg: #1f2937; + --tw-prose-th-borders: #d1d5db; + --tw-prose-td-borders: #e5e7eb; + --tw-prose-invert-body: #d1d5db; + --tw-prose-invert-headings: #fff; + --tw-prose-invert-lead: #9ca3af; + --tw-prose-invert-links: #fff; + --tw-prose-invert-bold: #fff; + --tw-prose-invert-counters: #9ca3af; + --tw-prose-invert-bullets: #4b5563; + --tw-prose-invert-hr: #374151; + --tw-prose-invert-quotes: #f3f4f6; + --tw-prose-invert-quote-borders: #374151; + --tw-prose-invert-captions: #9ca3af; + --tw-prose-invert-code: #fff; + --tw-prose-invert-pre-code: #d1d5db; + --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); + --tw-prose-invert-th-borders: #4b5563; + --tw-prose-invert-td-borders: #374151; + font-size: 1rem; + line-height: 1.75; +} + +.prose :where(p):not(:where([class~='not-prose'] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; +} + +.prose :where(video):not(:where([class~='not-prose'] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(figure):not(:where([class~='not-prose'] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(li):not(:where([class~='not-prose'] *)) { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.prose :where(ol > li):not(:where([class~='not-prose'] *)) { + padding-left: 0.375em; +} + +.prose :where(ul > li):not(:where([class~='not-prose'] *)) { + padding-left: 0.375em; +} + +.prose :where(.prose > ul > li p):not(:where([class~='not-prose'] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose + :where(.prose > ul > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.25em; +} + +.prose + :where(.prose > ul > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.25em; +} + +.prose + :where(.prose > ol > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.25em; +} + +.prose + :where(.prose > ol > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.25em; +} + +.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~='not-prose'] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(hr + *):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose :where(h2 + *):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose :where(h3 + *):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose :where(h4 + *):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose :where(thead th:first-child):not(:where([class~='not-prose'] *)) { + padding-left: 0; +} + +.prose :where(thead th:last-child):not(:where([class~='not-prose'] *)) { + padding-right: 0; +} + +.prose :where(tbody td, tfoot td):not(:where([class~='not-prose'] *)) { + padding-top: 0.5714286em; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; +} + +.prose + :where(tbody td:first-child, tfoot td:first-child):not( + :where([class~='not-prose'] *) + ) { + padding-left: 0; +} + +.prose + :where(tbody td:last-child, tfoot td:last-child):not( + :where([class~='not-prose'] *) + ) { + padding-right: 0; +} + +.prose :where(.prose > :first-child):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose :where(.prose > :last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 0; +} + +.prose-sm { + font-size: 0.875rem; + line-height: 1.7142857; +} + +.prose-sm :where(p):not(:where([class~='not-prose'] *)) { + margin-top: 1.1428571em; + margin-bottom: 1.1428571em; +} + +.prose-sm :where([class~='lead']):not(:where([class~='not-prose'] *)) { + font-size: 1.2857143em; + line-height: 1.5555556; + margin-top: 0.8888889em; + margin-bottom: 0.8888889em; +} + +.prose-sm :where(blockquote):not(:where([class~='not-prose'] *)) { + margin-top: 1.3333333em; + margin-bottom: 1.3333333em; + padding-left: 1.1111111em; +} + +.prose-sm :where(h1):not(:where([class~='not-prose'] *)) { + font-size: 2.1428571em; + margin-top: 0; + margin-bottom: 0.8em; + line-height: 1.2; +} + +.prose-sm :where(h2):not(:where([class~='not-prose'] *)) { + font-size: 1.4285714em; + margin-top: 1.6em; + margin-bottom: 0.8em; + line-height: 1.4; +} + +.prose-sm :where(h3):not(:where([class~='not-prose'] *)) { + font-size: 1.2857143em; + margin-top: 1.5555556em; + margin-bottom: 0.4444444em; + line-height: 1.5555556; +} + +.prose-sm :where(h4):not(:where([class~='not-prose'] *)) { + margin-top: 1.4285714em; + margin-bottom: 0.5714286em; + line-height: 1.4285714; +} + +.prose-sm :where(img):not(:where([class~='not-prose'] *)) { + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; +} + +.prose-sm :where(video):not(:where([class~='not-prose'] *)) { + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; +} + +.prose-sm :where(figure):not(:where([class~='not-prose'] *)) { + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; +} + +.prose-sm :where(figure > *):not(:where([class~='not-prose'] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose-sm :where(figcaption):not(:where([class~='not-prose'] *)) { + font-size: 0.8571429em; + line-height: 1.3333333; + margin-top: 0.6666667em; +} + +.prose-sm :where(code):not(:where([class~='not-prose'] *)) { + font-size: 0.8571429em; +} + +.prose-sm :where(h2 code):not(:where([class~='not-prose'] *)) { + font-size: 0.9em; +} + +.prose-sm :where(h3 code):not(:where([class~='not-prose'] *)) { + font-size: 0.8888889em; +} + +.prose-sm :where(pre):not(:where([class~='not-prose'] *)) { + font-size: 0.8571429em; + line-height: 1.6666667; + margin-top: 1.6666667em; + margin-bottom: 1.6666667em; + border-radius: 0.25rem; + padding-top: 0.6666667em; + padding-right: 1em; + padding-bottom: 0.6666667em; + padding-left: 1em; +} + +.prose-sm :where(ol):not(:where([class~='not-prose'] *)) { + margin-top: 1.1428571em; + margin-bottom: 1.1428571em; + padding-left: 1.5714286em; +} + +.prose-sm :where(ul):not(:where([class~='not-prose'] *)) { + margin-top: 1.1428571em; + margin-bottom: 1.1428571em; + padding-left: 1.5714286em; +} + +.prose-sm :where(li):not(:where([class~='not-prose'] *)) { + margin-top: 0.2857143em; + margin-bottom: 0.2857143em; +} + +.prose-sm :where(ol > li):not(:where([class~='not-prose'] *)) { + padding-left: 0.4285714em; +} + +.prose-sm :where(ul > li):not(:where([class~='not-prose'] *)) { + padding-left: 0.4285714em; +} + +.prose-sm :where(.prose > ul > li p):not(:where([class~='not-prose'] *)) { + margin-top: 0.5714286em; + margin-bottom: 0.5714286em; +} + +.prose-sm + :where(.prose > ul > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.1428571em; +} + +.prose-sm + :where(.prose > ul > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.1428571em; +} + +.prose-sm + :where(.prose > ol > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.1428571em; +} + +.prose-sm + :where(.prose > ol > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.1428571em; +} + +.prose-sm + :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~='not-prose'] *)) { + margin-top: 0.5714286em; + margin-bottom: 0.5714286em; +} + +.prose-sm :where(hr):not(:where([class~='not-prose'] *)) { + margin-top: 2.8571429em; + margin-bottom: 2.8571429em; +} + +.prose-sm :where(hr + *):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose-sm :where(h2 + *):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose-sm :where(h3 + *):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose-sm :where(h4 + *):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose-sm :where(table):not(:where([class~='not-prose'] *)) { + font-size: 0.8571429em; + line-height: 1.5; +} + +.prose-sm :where(thead th):not(:where([class~='not-prose'] *)) { + padding-right: 1em; + padding-bottom: 0.6666667em; + padding-left: 1em; +} + +.prose-sm :where(thead th:first-child):not(:where([class~='not-prose'] *)) { + padding-left: 0; +} + +.prose-sm :where(thead th:last-child):not(:where([class~='not-prose'] *)) { + padding-right: 0; +} + +.prose-sm :where(tbody td, tfoot td):not(:where([class~='not-prose'] *)) { + padding-top: 0.6666667em; + padding-right: 1em; + padding-bottom: 0.6666667em; + padding-left: 1em; +} + +.prose-sm + :where(tbody td:first-child, tfoot td:first-child):not( + :where([class~='not-prose'] *) + ) { + padding-left: 0; +} + +.prose-sm + :where(tbody td:last-child, tfoot td:last-child):not( + :where([class~='not-prose'] *) + ) { + padding-right: 0; +} + +.prose-sm :where(.prose > :first-child):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose-sm :where(.prose > :last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 0; +} + +.prose-base :where(.prose > ul > li p):not(:where([class~='not-prose'] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose-base + :where(.prose > ul > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.25em; +} + +.prose-base + :where(.prose > ul > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.25em; +} + +.prose-base + :where(.prose > ol > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.25em; +} + +.prose-base + :where(.prose > ol > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.25em; +} + +.prose-base :where(.prose > :first-child):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose-base :where(.prose > :last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 0; +} + +.prose-lg :where(.prose > ul > li p):not(:where([class~='not-prose'] *)) { + margin-top: 0.8888889em; + margin-bottom: 0.8888889em; +} + +.prose-lg + :where(.prose > ul > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.3333333em; +} + +.prose-lg + :where(.prose > ul > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.3333333em; +} + +.prose-lg + :where(.prose > ol > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.3333333em; +} + +.prose-lg + :where(.prose > ol > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.3333333em; +} + +.prose-lg :where(.prose > :first-child):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose-lg :where(.prose > :last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 0; +} + +.prose-xl :where(.prose > ul > li p):not(:where([class~='not-prose'] *)) { + margin-top: 0.8em; + margin-bottom: 0.8em; +} + +.prose-xl + :where(.prose > ul > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.2em; +} + +.prose-xl + :where(.prose > ul > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.2em; +} + +.prose-xl + :where(.prose > ol > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.2em; +} + +.prose-xl + :where(.prose > ol > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.2em; +} + +.prose-xl :where(.prose > :first-child):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose-xl :where(.prose > :last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 0; +} + +.prose-2xl :where(.prose > ul > li p):not(:where([class~='not-prose'] *)) { + margin-top: 0.8333333em; + margin-bottom: 0.8333333em; +} + +.prose-2xl + :where(.prose > ul > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.3333333em; +} + +.prose-2xl + :where(.prose > ul > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.3333333em; +} + +.prose-2xl + :where(.prose > ol > li > *:first-child):not(:where([class~='not-prose'] *)) { + margin-top: 1.3333333em; +} + +.prose-2xl + :where(.prose > ol > li > *:last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 1.3333333em; +} + +.prose-2xl :where(.prose > :first-child):not(:where([class~='not-prose'] *)) { + margin-top: 0; +} + +.prose-2xl :where(.prose > :last-child):not(:where([class~='not-prose'] *)) { + margin-bottom: 0; +} + +.prose-gray { + --tw-prose-body: #374151; + --tw-prose-headings: #111827; + --tw-prose-lead: #4b5563; + --tw-prose-links: #111827; + --tw-prose-bold: #111827; + --tw-prose-counters: #6b7280; + --tw-prose-bullets: #d1d5db; + --tw-prose-hr: #e5e7eb; + --tw-prose-quotes: #111827; + --tw-prose-quote-borders: #e5e7eb; + --tw-prose-captions: #6b7280; + --tw-prose-code: #111827; + --tw-prose-pre-code: #e5e7eb; + --tw-prose-pre-bg: #1f2937; + --tw-prose-th-borders: #d1d5db; + --tw-prose-td-borders: #e5e7eb; + --tw-prose-invert-body: #d1d5db; + --tw-prose-invert-headings: #fff; + --tw-prose-invert-lead: #9ca3af; + --tw-prose-invert-links: #fff; + --tw-prose-invert-bold: #fff; + --tw-prose-invert-counters: #9ca3af; + --tw-prose-invert-bullets: #4b5563; + --tw-prose-invert-hr: #374151; + --tw-prose-invert-quotes: #f3f4f6; + --tw-prose-invert-quote-borders: #374151; + --tw-prose-invert-captions: #9ca3af; + --tw-prose-invert-code: #fff; + --tw-prose-invert-pre-code: #d1d5db; + --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); + --tw-prose-invert-th-borders: #4b5563; + --tw-prose-invert-td-borders: #374151; +} + +.pointer-events-none { + pointer-events: none; +} + +.visible { + visibility: visible; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.sticky { + position: -webkit-sticky; + position: sticky; +} + +.inset-y-0 { + top: 0px; + bottom: 0px; +} + +.top-2 { + top: 0.5rem; +} + +.left-1\/2 { + left: 50%; +} + +.right-0 { + right: 0px; +} + +.-top-3 { + top: -0.75rem; +} + +.right-2 { + right: 0.5rem; +} + +.top-0 { + top: 0px; +} + +.bottom-0 { + bottom: 0px; +} + +.left-0 { + left: 0px; +} + +.top-1\/2 { + top: 50%; +} + +.top-\[1px\] { + top: 1px; +} + +.top-16 { + top: 4rem; +} + +.left-1\/4 { + left: 25%; +} + +.right-1\/4 { + right: 25%; +} + +.top-1\/4 { + top: 25%; +} + +.bottom-1\/4 { + bottom: 25%; +} + +.right-\[-48px\] { + right: -48px; +} + +.z-30 { + z-index: 30; +} + +.z-10 { + z-index: 10; +} + +.z-20 { + z-index: 20; +} + +.z-0 { + z-index: 0; +} + +.col-span-2 { + grid-column: span 2 / span 2; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.ml-2 { + margin-left: 0.5rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-8 { + margin-top: 2rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.ml-\[-100\%\] { + margin-left: -100%; +} + +.-mt-5 { + margin-top: -1.25rem; +} + +.mb-5 { + margin-bottom: 1.25rem; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.contents { + display: contents; +} + +.hidden { + display: none; +} + +.\!hidden { + display: none !important; +} + +.h-\[50vh\] { + height: 50vh; +} + +.h-full { + height: 100%; +} + +.h-4 { + height: 1rem; +} + +.h-px { + height: 1px; +} + +.h-12 { + height: 3rem; +} + +.h-24 { + height: 6rem; +} + +.h-2 { + height: 0.5rem; +} + +.h-\[0vh\] { + height: 0vh; +} + +.h-screen { + height: 100vh; +} + +.h-5 { + height: 1.25rem; +} + +.h-\[95\%\] { + height: 95%; +} + +.h-8 { + height: 2rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-20 { + height: 5rem; +} + +.max-h-60 { + max-height: 15rem; +} + +.max-h-\[800px\] { + max-height: 800px; +} + +.min-h-screen { + min-height: 100vh; +} + +.min-h-0 { + min-height: 0px; +} + +.w-full { + width: 100%; +} + +.w-\[300px\] { + width: 300px; +} + +.w-5 { + width: 1.25rem; +} + +.w-fit { + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; +} + +.w-\[95\%\] { + width: 95%; +} + +.w-\[250px\] { + width: 250px; +} + +.w-\[40px\] { + width: 40px; +} + +.w-\[230px\] { + width: 230px; +} + +.w-screen { + width: 100vw; +} + +.w-\[max-content\] { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; +} + +.w-\[500px\] { + width: 500px; +} + +.w-\[600px\] { + width: 600px; +} + +.w-\[450px\] { + width: 450px; +} + +.min-w-\[250px\] { + min-width: 250px; +} + +.min-w-0 { + min-width: 0px; +} + +.max-w-full { + max-width: 100%; +} + +.max-w-none { + max-width: none; +} + +.max-w-\[350px\] { + max-width: 350px; +} + +.max-w-screen-lg { + max-width: 1024px; +} + +.max-w-md { + max-width: 28rem; +} + +.max-w-sm { + max-width: 24rem; +} + +.max-w-screen-sm { + max-width: 640px; +} + +.max-w-screen-xl { + max-width: 1280px; +} + +.max-w-\[600px\] { + max-width: 600px; +} + +.max-w-\[500px\] { + max-width: 500px; +} + +.max-w-\[1200px\] { + max-width: 1200px; +} + +.max-w-3xl { + max-width: 48rem; +} + +.max-w-\[400px\] { + max-width: 400px; +} + +.max-w-\[300px\] { + max-width: 300px; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-\[3_1_0\%\] { + flex: 3 1 0%; +} + +.flex-\[2_1_0\%\] { + flex: 2 1 0%; +} + +.origin-bottom-right { + transform-origin: bottom right; +} + +.origin-top { + transform-origin: top; +} + +.-translate-y-1\/2 { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-\[50px\] { + --tw-translate-y: -50px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-x-1\/2 { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-x-full { + --tw-translate-x: -100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-full { + --tw-translate-x: 100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-full { + --tw-translate-y: -100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-full { + --tw-translate-y: 100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-1\/3 { + --tw-translate-y: -33.333333%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-1\/3 { + --tw-translate-x: 33.333333%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-rotate-90 { + --tw-rotate: -90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.scale-\[2\] { + --tw-scale-x: 2; + --tw-scale-y: 2; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.scale-125 { + --tw-scale-x: 1.25; + --tw-scale-y: 1.25; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +@-webkit-keyframes spin { + to { + transform: rotate(360deg); + } +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +.animate-spin { + -webkit-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} + +@-webkit-keyframes pulse { + 50% { + opacity: 0.5; + } +} + +@keyframes pulse { + 50% { + opacity: 0.5; + } +} + +.animate-pulse { + -webkit-animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +@-webkit-keyframes bounce { + 0%, + 100% { + transform: translateY(-25%); + -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + } + + 50% { + transform: none; + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } +} + +@keyframes bounce { + 0%, + 100% { + transform: translateY(-25%); + -webkit-animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + animation-timing-function: cubic-bezier(0.8, 0, 1, 1); + } + + 50% { + transform: none; + -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + animation-timing-function: cubic-bezier(0, 0, 0.2, 1); + } +} + +.animate-bounce { + -webkit-animation: bounce 1s infinite; + animation: bounce 1s infinite; +} + +.cursor-pointer { + cursor: pointer; +} + +.cursor-default { + cursor: default; +} + +.select-none { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.resize { + resize: both; +} + +.grid-flow-row { + grid-auto-flow: row; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.items-start { + align-items: flex-start; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-6 { + gap: 1.5rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-8 { + gap: 2rem; +} + +.gap-12 { + gap: 3rem; +} + +.gap-20 { + gap: 5rem; +} + +.gap-x-10 { + -moz-column-gap: 2.5rem; + column-gap: 2.5rem; +} + +.gap-y-4 { + row-gap: 1rem; +} + +.space-y-px > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1px * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1px * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.divide-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(2px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(2px * var(--tw-divide-y-reverse)); +} + +.divide-gray-500 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(107 114 128 / var(--tw-divide-opacity)); +} + +.divide-opacity-10 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 0.1; +} + +.self-start { + align-self: flex-start; +} + +.self-end { + align-self: flex-end; +} + +.self-center { + align-self: center; +} + +.overflow-auto { + overflow: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-scroll { + overflow: scroll; +} + +.overflow-y-auto { + overflow-y: auto; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-xl { + border-radius: 0.75rem; +} + +.rounded-t-md { + border-top-left-radius: 0.375rem; + border-top-right-radius: 0.375rem; +} + +.rounded-t-lg { + border-top-left-radius: 0.5rem; + border-top-right-radius: 0.5rem; +} + +.border { + border-width: 1px; +} + +.border-2 { + border-width: 2px; +} + +.border-4 { + border-width: 4px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.border-t-4 { + border-top-width: 4px; +} + +.border-none { + border-style: none; +} + +.border-black\/50 { + border-color: rgb(0 0 0 / 0.5); +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity)); +} + +.border-gray-500 { + --tw-border-opacity: 1; + border-color: rgb(107 114 128 / var(--tw-border-opacity)); +} + +.border-black\/10 { + border-color: rgb(0 0 0 / 0.1); +} + +.border-gray-100 { + --tw-border-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-border-opacity)); +} + +.border-gray-600\/70 { + border-color: rgb(75 85 99 / 0.7); +} + +.border-transparent { + border-color: transparent; +} + +.border-red-500 { + --tw-border-opacity: 1; + border-color: rgb(239 68 68 / var(--tw-border-opacity)); +} + +.border-green-500 { + --tw-border-opacity: 1; + border-color: rgb(34 197 94 / var(--tw-border-opacity)); +} + +.border-opacity-20 { + --tw-border-opacity: 0.2; +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-rose-600 { + --tw-bg-opacity: 1; + background-color: rgb(225 29 72 / var(--tw-bg-opacity)); +} + +.bg-gray-600 { + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity)); +} + +.bg-gray-500 { + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity)); +} + +.bg-blue-500 { + --tw-bg-opacity: 1; + background-color: rgb(59 130 246 / var(--tw-bg-opacity)); +} + +.bg-orange-500 { + --tw-bg-opacity: 1; + background-color: rgb(249 115 22 / var(--tw-bg-opacity)); +} + +.bg-green-500 { + --tw-bg-opacity: 1; + background-color: rgb(34 197 94 / var(--tw-bg-opacity)); +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.bg-gray-800 { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); +} + +.bg-emerald-500 { + --tw-bg-opacity: 1; + background-color: rgb(16 185 129 / var(--tw-bg-opacity)); +} + +.bg-purple-500 { + --tw-bg-opacity: 1; + background-color: rgb(168 85 247 / var(--tw-bg-opacity)); +} + +.bg-yellow-500 { + --tw-bg-opacity: 1; + background-color: rgb(234 179 8 / var(--tw-bg-opacity)); +} + +.bg-pink-500 { + --tw-bg-opacity: 1; + background-color: rgb(236 72 153 / var(--tw-bg-opacity)); +} + +.bg-amber-500 { + --tw-bg-opacity: 1; + background-color: rgb(245 158 11 / var(--tw-bg-opacity)); +} + +.bg-lime-500 { + --tw-bg-opacity: 1; + background-color: rgb(132 204 22 / var(--tw-bg-opacity)); +} + +.bg-slate-700 { + --tw-bg-opacity: 1; + background-color: rgb(51 65 85 / var(--tw-bg-opacity)); +} + +.bg-discord { + --tw-bg-opacity: 1; + background-color: rgb(83 107 189 / var(--tw-bg-opacity)); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.bg-gray-700 { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); +} + +.bg-\[\#ED203D\] { + --tw-bg-opacity: 1; + background-color: rgb(237 32 61 / var(--tw-bg-opacity)); +} + +.bg-red-500 { + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity)); +} + +.bg-yellow-400 { + --tw-bg-opacity: 1; + background-color: rgb(250 204 21 / var(--tw-bg-opacity)); +} + +.bg-gray-300 { + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity)); +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.bg-teal-500 { + --tw-bg-opacity: 1; + background-color: rgb(20 184 166 / var(--tw-bg-opacity)); +} + +.bg-red-400 { + --tw-bg-opacity: 1; + background-color: rgb(248 113 113 / var(--tw-bg-opacity)); +} + +.bg-rose-500 { + --tw-bg-opacity: 1; + background-color: rgb(244 63 94 / var(--tw-bg-opacity)); +} + +.bg-opacity-10 { + --tw-bg-opacity: 0.1; +} + +.bg-gradient-to-r { + background-image: linear-gradient(to right, var(--tw-gradient-stops)); +} + +.bg-\[linear-gradient\(to_right\2c \#59b8ff\2c \#e331d8\2c \#ff9600\2c red\)\] { + background-image: linear-gradient(to right, #59b8ff, #e331d8, #ff9600, red); +} + +.bg-\[linear-gradient\(to_right\2c \#59b8ff\2c \#e331d8\2c \#ff9600\)\] { + background-image: linear-gradient(to right, #59b8ff, #e331d8, #ff9600); +} + +.from-red-500 { + --tw-gradient-from: #ef4444; + --tw-gradient-to: rgb(239 68 68 / 0); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-rose-500 { + --tw-gradient-from: #f43f5e; + --tw-gradient-to: rgb(244 63 94 / 0); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-yellow-500 { + --tw-gradient-from: #eab308; + --tw-gradient-to: rgb(234 179 8 / 0); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-teal-500 { + --tw-gradient-from: #14b8a6; + --tw-gradient-to: rgb(20 184 166 / 0); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-blue-500 { + --tw-gradient-from: #3b82f6; + --tw-gradient-to: rgb(59 130 246 / 0); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-lime-500 { + --tw-gradient-from: #84cc16; + --tw-gradient-to: rgb(132 204 22 / 0); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.via-purple-500 { + --tw-gradient-to: rgb(168 85 247 / 0); + --tw-gradient-stops: var(--tw-gradient-from), #a855f7, var(--tw-gradient-to); +} + +.to-amber-500 { + --tw-gradient-to: #f59e0b; +} + +.to-yellow-500 { + --tw-gradient-to: #eab308; +} + +.to-violet-600 { + --tw-gradient-to: #7c3aed; +} + +.to-yellow-600 { + --tw-gradient-to: #ca8a04; +} + +.to-teal-500 { + --tw-gradient-to: #14b8a6; +} + +.to-violet-500 { + --tw-gradient-to: #8b5cf6; +} + +.to-pink-500 { + --tw-gradient-to: #ec4899; +} + +.to-red-700 { + --tw-gradient-to: #b91c1c; +} + +.to-emerald-500 { + --tw-gradient-to: #10b981; +} + +.to-blue-500 { + --tw-gradient-to: #3b82f6; +} + +.to-blue-600 { + --tw-gradient-to: #2563eb; +} + +.bg-contain { + background-size: contain; +} + +.bg-clip-text { + -webkit-background-clip: text; + background-clip: text; +} + +.bg-center { + background-position: center; +} + +.bg-no-repeat { + background-repeat: no-repeat; +} + +.p-2 { + padding: 0.5rem; +} + +.p-4 { + padding: 1rem; +} + +.p-1 { + padding: 0.25rem; +} + +.p-8 { + padding: 2rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-12 { + padding: 3rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-12 { + padding-top: 3rem; + padding-bottom: 3rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.pb-\[300px\] { + padding-bottom: 300px; +} + +.pl-2 { + padding-left: 0.5rem; +} + +.pr-10 { + padding-right: 2.5rem; +} + +.pr-2 { + padding-right: 0.5rem; +} + +.pl-10 { + padding-left: 2.5rem; +} + +.pr-3 { + padding-right: 0.75rem; +} + +.pb-16 { + padding-bottom: 4rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.align-super { + vertical-align: super; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-7xl { + font-size: 4.5rem; + line-height: 1; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-\[\.9em\] { + font-size: 0.9em; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-\[\.7rem\] { + font-size: 0.7rem; +} + +.text-5xl { + font-size: 3rem; + line-height: 1; +} + +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + +.text-\[\.5em\] { + font-size: 0.5em; +} + +.text-6xl { + font-size: 3.75rem; + line-height: 1; +} + +.font-normal { + font-weight: 400; +} + +.font-black { + font-weight: 900; +} + +.font-extrabold { + font-weight: 800; +} + +.font-bold { + font-weight: 700; +} + +.font-medium { + font-weight: 500; +} + +.font-light { + font-weight: 300; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.capitalize { + text-transform: capitalize; +} + +.italic { + font-style: italic; +} + +.leading-none { + line-height: 1; +} + +.leading-6 { + line-height: 1.5rem; +} + +.leading-tight { + line-height: 1.25; +} + +.leading-7 { + line-height: 1.75rem; +} + +.leading-8 { + line-height: 2rem; +} + +.leading-loose { + line-height: 2; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.text-red-600 { + --tw-text-opacity: 1; + color: rgb(220 38 38 / var(--tw-text-opacity)); +} + +.text-transparent { + color: transparent; +} + +.text-sky-500 { + --tw-text-opacity: 1; + color: rgb(14 165 233 / var(--tw-text-opacity)); +} + +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + +.text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + +.text-gray-900 { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} + +.text-rose-500 { + --tw-text-opacity: 1; + color: rgb(244 63 94 / var(--tw-text-opacity)); +} + +.text-yellow-500 { + --tw-text-opacity: 1; + color: rgb(234 179 8 / var(--tw-text-opacity)); +} + +.text-teal-500 { + --tw-text-opacity: 1; + color: rgb(20 184 166 / var(--tw-text-opacity)); +} + +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity)); +} + +.text-red-500 { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity)); +} + +.text-emerald-500 { + --tw-text-opacity: 1; + color: rgb(16 185 129 / var(--tw-text-opacity)); +} + +.text-purple-500 { + --tw-text-opacity: 1; + color: rgb(168 85 247 / var(--tw-text-opacity)); +} + +.text-orange-500 { + --tw-text-opacity: 1; + color: rgb(249 115 22 / var(--tw-text-opacity)); +} + +.text-pink-500 { + --tw-text-opacity: 1; + color: rgb(236 72 153 / var(--tw-text-opacity)); +} + +.text-amber-500 { + --tw-text-opacity: 1; + color: rgb(245 158 11 / var(--tw-text-opacity)); +} + +.text-lime-500 { + --tw-text-opacity: 1; + color: rgb(132 204 22 / var(--tw-text-opacity)); +} + +.text-slate-600 { + --tw-text-opacity: 1; + color: rgb(71 85 105 / var(--tw-text-opacity)); +} + +.text-green-500 { + --tw-text-opacity: 1; + color: rgb(34 197 94 / var(--tw-text-opacity)); +} + +.text-discord { + --tw-text-opacity: 1; + color: rgb(83 107 189 / var(--tw-text-opacity)); +} + +.text-green-600 { + --tw-text-opacity: 1; + color: rgb(22 163 74 / var(--tw-text-opacity)); +} + +.text-violet-500 { + --tw-text-opacity: 1; + color: rgb(139 92 246 / var(--tw-text-opacity)); +} + +.text-yellow-400 { + --tw-text-opacity: 1; + color: rgb(250 204 21 / var(--tw-text-opacity)); +} + +.text-yellow-600 { + --tw-text-opacity: 1; + color: rgb(202 138 4 / var(--tw-text-opacity)); +} + +.text-amber-600 { + --tw-text-opacity: 1; + color: rgb(217 119 6 / var(--tw-text-opacity)); +} + +.text-amber-700 { + --tw-text-opacity: 1; + color: rgb(180 83 9 / var(--tw-text-opacity)); +} + +.text-red-700 { + --tw-text-opacity: 1; + color: rgb(185 28 28 / var(--tw-text-opacity)); +} + +.text-orange-600 { + --tw-text-opacity: 1; + color: rgb(234 88 12 / var(--tw-text-opacity)); +} + +.text-orange-700 { + --tw-text-opacity: 1; + color: rgb(194 65 12 / var(--tw-text-opacity)); +} + +.text-lime-600 { + --tw-text-opacity: 1; + color: rgb(101 163 13 / var(--tw-text-opacity)); +} + +.text-red-400 { + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity)); +} + +.text-teal-700 { + --tw-text-opacity: 1; + color: rgb(15 118 110 / var(--tw-text-opacity)); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} + +.text-blue-700 { + --tw-text-opacity: 1; + color: rgb(29 78 216 / var(--tw-text-opacity)); +} + +.text-indigo-500 { + --tw-text-opacity: 1; + color: rgb(99 102 241 / var(--tw-text-opacity)); +} + +.text-indigo-700 { + --tw-text-opacity: 1; + color: rgb(67 56 202 / var(--tw-text-opacity)); +} + +.text-rose-600 { + --tw-text-opacity: 1; + color: rgb(225 29 72 / var(--tw-text-opacity)); +} + +.text-pink-700 { + --tw-text-opacity: 1; + color: rgb(190 24 93 / var(--tw-text-opacity)); +} + +.text-violet-700 { + --tw-text-opacity: 1; + color: rgb(109 40 217 / var(--tw-text-opacity)); +} + +.underline { + -webkit-text-decoration-line: underline; + text-decoration-line: underline; +} + +.decoration-gray-200 { + -webkit-text-decoration-color: #e5e7eb; + text-decoration-color: #e5e7eb; +} + +.decoration-yellow-500 { + -webkit-text-decoration-color: #eab308; + text-decoration-color: #eab308; +} + +.decoration-red-500 { + -webkit-text-decoration-color: #ef4444; + text-decoration-color: #ef4444; +} + +.decoration-dashed { + -webkit-text-decoration-style: dashed; + text-decoration-style: dashed; +} + +.decoration-4 { + text-decoration-thickness: 4px; +} + +.underline-offset-\[\.5rem\] { + text-underline-offset: 0.5rem; +} + +.underline-offset-2 { + text-underline-offset: 2px; +} + +.placeholder-gray-400::-moz-placeholder { + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + +.placeholder-gray-400:-ms-input-placeholder { + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + +.placeholder-gray-400::placeholder { + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + +.opacity-0 { + opacity: 0; +} + +.opacity-10 { + opacity: 0.1; +} + +.opacity-20 { + opacity: 0.2; +} + +.opacity-30 { + opacity: 0.3; +} + +.opacity-70 { + opacity: 0.7; +} + +.opacity-100 { + opacity: 1; +} + +.opacity-40 { + opacity: 0.4; +} + +.opacity-90 { + opacity: 0.9; +} + +.opacity-50 { + opacity: 0.5; +} + +.opacity-60 { + opacity: 0.6; +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.05), + 0 4px 6px -2px rgba(0, 0, 0, 0.03); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), + 0 4px 6px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), + var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), + 0 2px 4px -1px rgba(0, 0, 0, 0.03); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), + 0 2px 4px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), + var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-xl { + --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.05), + 0 10px 10px -5px rgba(0, 0, 0, 0.02); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), + 0 10px 10px -5px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), + var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05), 0 1px 2px 0 rgba(0, 0, 0, 0.03); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), + 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), + var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-2xl { + --tw-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.2); + --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), + var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-black\/10 { + --tw-shadow-color: rgb(0 0 0 / 0.1); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-red-700\/20 { + --tw-shadow-color: rgb(185 28 28 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-blue-700\/20 { + --tw-shadow-color: rgb(29 78 216 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-emerald-700\/20 { + --tw-shadow-color: rgb(4 120 87 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-amber-700\/20 { + --tw-shadow-color: rgb(180 83 9 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-purple-700\/20 { + --tw-shadow-color: rgb(126 34 206 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-yellow-700\/20 { + --tw-shadow-color: rgb(161 98 7 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-orange-700\/20 { + --tw-shadow-color: rgb(194 65 12 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-pink-700\/20 { + --tw-shadow-color: rgb(190 24 93 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-lime-700\/20 { + --tw-shadow-color: rgb(77 124 15 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-slate-700\/20 { + --tw-shadow-color: rgb(51 65 85 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-gray-500\/20 { + --tw-shadow-color: rgb(107 114 128 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-green-700\/10 { + --tw-shadow-color: rgb(21 128 61 / 0.1); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-indigo-700\/30 { + --tw-shadow-color: rgb(67 56 202 / 0.3); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-gray-900\/10 { + --tw-shadow-color: rgb(17 24 39 / 0.1); + --tw-shadow: var(--tw-shadow-colored); +} + +.shadow-gray-700\/20 { + --tw-shadow-color: rgb(55 65 81 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.ring-1 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 + var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 + calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), + var(--tw-shadow, 0 0 #0000); +} + +.ring-black { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity)); +} + +.ring-opacity-5 { + --tw-ring-opacity: 0.05; +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) + var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) + var(--tw-sepia) var(--tw-drop-shadow); +} + +.transition { + transition-property: color, background-color, border-color, fill, stroke, + opacity, box-shadow, transform, filter, -webkit-text-decoration-color, + -webkit-backdrop-filter; + transition-property: color, background-color, border-color, + text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, + backdrop-filter; + transition-property: color, background-color, border-color, + text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, + backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.delay-300 { + transition-delay: 300ms; +} + +.duration-300 { + transition-duration: 300ms; +} + +.duration-100 { + transition-duration: 100ms; +} + +.ease-in { + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); +} + +.ease-in-out { + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.carbon-small { + pointer-events: none; +} + +.carbon-small #carbonads { + pointer-events: none; +} + +.carbon-small .carbon-outer { + pointer-events: none; +} + +.carbon-small .carbon-wrap { + display: flex; + flex-direction: column; +} + +.carbon-small .carbon-wrap .carbon-img { + pointer-events: auto !important; + width: 50%; + overflow: hidden; + border-top-right-radius: 0.5rem; + border-top-width: 1px; + border-right-width: 1px; + border-color: rgb(107 114 128 / var(--tw-border-opacity)); + --tw-border-opacity: 0.1; + padding-top: 0.5rem; +} + +.carbon-small .carbon-wrap .carbon-img img { + width: 100%; + max-width: 100% !important; +} + +.carbon-small .carbon-wrap .carbon-text { + pointer-events: auto !important; + margin: 0px !important; + border-top-right-radius: 0.5rem; + border-top-width: 1px; + border-right-width: 1px; + border-color: rgb(107 114 128 / var(--tw-border-opacity)); + --tw-border-opacity: 0.1; + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + padding-bottom: 1.5rem !important; +} + +@media (prefers-color-scheme: dark) { + .carbon-small .carbon-wrap .carbon-text { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); + } +} + +.carbon-small .carbon-wrap .carbon-poweredby { + position: absolute; + bottom: 0px; + right: 0px; +} + +code[class*='language-'] { + white-space: pre-wrap; + word-break: break-all; +} + +.even\:opacity-40:nth-child(even) { + opacity: 0.4; +} + +.hover\:border-current:hover { + border-color: currentColor; +} + +.hover\:border-green-500:hover { + --tw-border-opacity: 1; + border-color: rgb(34 197 94 / var(--tw-border-opacity)); +} + +.hover\:border-blue-500:hover { + --tw-border-opacity: 1; + border-color: rgb(59 130 246 / var(--tw-border-opacity)); +} + +.hover\:bg-gray-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity)); +} + +.hover\:bg-rose-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(225 29 72 / var(--tw-bg-opacity)); +} + +.hover\:bg-gray-100\/70:hover { + background-color: rgb(243 244 246 / 0.7); +} + +.hover\:bg-yellow-400:hover { + --tw-bg-opacity: 1; + background-color: rgb(250 204 21 / var(--tw-bg-opacity)); +} + +.hover\:bg-red-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(252 165 165 / var(--tw-bg-opacity)); +} + +.hover\:bg-teal-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(94 234 212 / var(--tw-bg-opacity)); +} + +.hover\:bg-red-400:hover { + --tw-bg-opacity: 1; + background-color: rgb(248 113 113 / var(--tw-bg-opacity)); +} + +.hover\:bg-rose-300:hover { + --tw-bg-opacity: 1; + background-color: rgb(253 164 175 / var(--tw-bg-opacity)); +} + +.hover\:bg-opacity-10:hover { + --tw-bg-opacity: 0.1; +} + +.hover\:text-red-500:hover { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity)); +} + +.hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.hover\:underline:hover { + -webkit-text-decoration-line: underline; + text-decoration-line: underline; +} + +.hover\:opacity-0:hover { + opacity: 0; +} + +.hover\:opacity-100:hover { + opacity: 1; +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus-visible\:border-indigo-500:focus-visible { + --tw-border-opacity: 1; + border-color: rgb(99 102 241 / var(--tw-border-opacity)); +} + +.group:hover .group-hover\:opacity-100 { + opacity: 1; +} + +@media (prefers-color-scheme: dark) { + .dark\:prose-invert { + --tw-prose-body: var(--tw-prose-invert-body); + --tw-prose-headings: var(--tw-prose-invert-headings); + --tw-prose-lead: var(--tw-prose-invert-lead); + --tw-prose-links: var(--tw-prose-invert-links); + --tw-prose-bold: var(--tw-prose-invert-bold); + --tw-prose-counters: var(--tw-prose-invert-counters); + --tw-prose-bullets: var(--tw-prose-invert-bullets); + --tw-prose-hr: var(--tw-prose-invert-hr); + --tw-prose-quotes: var(--tw-prose-invert-quotes); + --tw-prose-quote-borders: var(--tw-prose-invert-quote-borders); + --tw-prose-captions: var(--tw-prose-invert-captions); + --tw-prose-code: var(--tw-prose-invert-code); + --tw-prose-pre-code: var(--tw-prose-invert-pre-code); + --tw-prose-pre-bg: var(--tw-prose-invert-pre-bg); + --tw-prose-th-borders: var(--tw-prose-invert-th-borders); + --tw-prose-td-borders: var(--tw-prose-invert-td-borders); + } + + .dark\:h-\[100\.5\%\] { + height: 100.5%; + } + + .dark\:w-\[100\.5\%\] { + width: 100.5%; + } + + .dark\:border-0 { + border-width: 0px; + } + + .dark\:border { + border-width: 1px; + } + + .dark\:border-2 { + border-width: 2px; + } + + .dark\:border-white\/50 { + border-color: rgb(255 255 255 / 0.5); + } + + .dark\:border-gray-800 { + --tw-border-opacity: 1; + border-color: rgb(31 41 55 / var(--tw-border-opacity)); + } + + .dark\:border-white\/10 { + border-color: rgb(255 255 255 / 0.1); + } + + .dark\:border-gray-700\/80 { + border-color: rgb(55 65 81 / 0.8); + } + + .dark\:bg-gray-800 { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); + } + + .dark\:bg-gray-600 { + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity)); + } + + .dark\:bg-gray-700 { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); + } + + .dark\:bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); + } + + .dark\:bg-gray-900 { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); + } + + .dark\:bg-opacity-20 { + --tw-bg-opacity: 0.2; + } + + .dark\:text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); + } + + .dark\:text-gray-300 { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); + } + + .dark\:text-emerald-400 { + --tw-text-opacity: 1; + color: rgb(52 211 153 / var(--tw-text-opacity)); + } + + .dark\:text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); + } + + .dark\:text-gray-200 { + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity)); + } + + .dark\:text-yellow-300 { + --tw-text-opacity: 1; + color: rgb(253 224 71 / var(--tw-text-opacity)); + } + + .dark\:text-yellow-500 { + --tw-text-opacity: 1; + color: rgb(234 179 8 / var(--tw-text-opacity)); + } + + .dark\:text-amber-500 { + --tw-text-opacity: 1; + color: rgb(245 158 11 / var(--tw-text-opacity)); + } + + .dark\:text-red-400 { + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity)); + } + + .dark\:text-orange-400 { + --tw-text-opacity: 1; + color: rgb(251 146 60 / var(--tw-text-opacity)); + } + + .dark\:text-amber-400 { + --tw-text-opacity: 1; + color: rgb(251 191 36 / var(--tw-text-opacity)); + } + + .dark\:text-lime-400 { + --tw-text-opacity: 1; + color: rgb(163 230 53 / var(--tw-text-opacity)); + } + + .dark\:text-teal-400 { + --tw-text-opacity: 1; + color: rgb(45 212 191 / var(--tw-text-opacity)); + } + + .dark\:text-red-300 { + --tw-text-opacity: 1; + color: rgb(252 165 165 / var(--tw-text-opacity)); + } + + .dark\:text-red-500 { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity)); + } + + .dark\:text-blue-400 { + --tw-text-opacity: 1; + color: rgb(96 165 250 / var(--tw-text-opacity)); + } + + .dark\:text-indigo-400 { + --tw-text-opacity: 1; + color: rgb(129 140 248 / var(--tw-text-opacity)); + } + + .dark\:text-rose-400 { + --tw-text-opacity: 1; + color: rgb(251 113 133 / var(--tw-text-opacity)); + } + + .dark\:text-pink-400 { + --tw-text-opacity: 1; + color: rgb(244 114 182 / var(--tw-text-opacity)); + } + + .dark\:text-violet-400 { + --tw-text-opacity: 1; + color: rgb(167 139 250 / var(--tw-text-opacity)); + } + + .dark\:decoration-gray-800 { + -webkit-text-decoration-color: #1f2937; + text-decoration-color: #1f2937; + } + + .dark\:shadow-lg { + --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.05), + 0 4px 6px -2px rgba(0, 0, 0, 0.03); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), + 0 4px 6px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), + var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + } + + .dark\:shadow-none { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), + var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + } + + .dark\:shadow-red-500\/30 { + --tw-shadow-color: rgb(239 68 68 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:shadow-blue-500\/30 { + --tw-shadow-color: rgb(59 130 246 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:shadow-emerald-500\/30 { + --tw-shadow-color: rgb(16 185 129 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:shadow-amber-500\/30 { + --tw-shadow-color: rgb(245 158 11 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:shadow-purple-500\/30 { + --tw-shadow-color: rgb(168 85 247 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:shadow-yellow-500\/30 { + --tw-shadow-color: rgb(234 179 8 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:shadow-orange-500\/30 { + --tw-shadow-color: rgb(249 115 22 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:shadow-pink-500\/30 { + --tw-shadow-color: rgb(236 72 153 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:shadow-lime-500\/30 { + --tw-shadow-color: rgb(132 204 22 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:shadow-slate-500\/30 { + --tw-shadow-color: rgb(100 116 139 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:shadow-green-500\/30 { + --tw-shadow-color: rgb(34 197 94 / 0.3); + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:hover\:bg-gray-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); + } +} + +@media (min-width: 640px) { + .sm\:col-span-2 { + grid-column: span 2 / span 2; + } + + .sm\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .sm\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .sm\:gap-4 { + gap: 1rem; + } + + .sm\:p-8 { + padding: 2rem; + } + + .sm\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + .sm\:text-center { + text-align: center; + } + + .sm\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } + + .sm\:text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; + } + + .sm\:leading-10 { + line-height: 2.5rem; + } + + .sm\:opacity-20 { + opacity: 0.2; + } +} + +@media (min-width: 768px) { + .md\:col-span-5 { + grid-column: span 5 / span 5; + } + + .md\:mx-auto { + margin-left: auto; + margin-right: auto; + } + + .md\:mb-2 { + margin-bottom: 0.5rem; + } + + .md\:w-\[60px\] { + width: 60px; + } + + .md\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:flex-row { + flex-direction: row; + } + + .md\:justify-end { + justify-content: flex-end; + } + + .md\:gap-32 { + gap: 8rem; + } + + .md\:space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); + } + + .md\:self-end { + align-self: flex-end; + } + + .md\:p-6 { + padding: 1.5rem; + } + + .md\:p-8 { + padding: 2rem; + } + + .md\:p-14 { + padding: 3.5rem; + } + + .md\:text-right { + text-align: right; + } + + .md\:text-base { + font-size: 1rem; + line-height: 1.5rem; + } + + .md\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } + + .md\:text-2xl { + font-size: 1.5rem; + line-height: 2rem; + } + + .md\:text-\[\.9em\] { + font-size: 0.9em; + } + + .md\:text-6xl { + font-size: 3.75rem; + line-height: 1; + } + + .md\:text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; + } + + .md\:text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; + } + + .md\:decoration-8 { + text-decoration-thickness: 8px; + } + + .md\:underline-offset-\[1rem\] { + text-underline-offset: 1rem; + } +} + +@media (min-width: 1024px) { + .lg\:mt-2 { + margin-top: 0.5rem; + } + + .lg\:flex { + display: flex; + } + + .lg\:hidden { + display: none; + } + + .lg\:h-16 { + height: 4rem; + } + + .lg\:w-\[100px\] { + width: 100px; + } + + .lg\:max-w-2xl { + max-width: 42rem; + } + + .lg\:max-w-screen-lg { + max-width: 1024px; + } + + .lg\:max-w-\[800px\] { + max-width: 800px; + } + + .lg\:max-w-\[600px\] { + max-width: 600px; + } + + .lg\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .lg\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .lg\:flex-row { + flex-direction: row; + } + + .lg\:gap-4 { + gap: 1rem; + } + + .lg\:rounded-lg { + border-radius: 0.5rem; + } + + .lg\:p-6 { + padding: 1.5rem; + } + + .lg\:py-24 { + padding-top: 6rem; + padding-bottom: 6rem; + } + + .lg\:px-8 { + padding-left: 2rem; + padding-right: 2rem; + } + + .lg\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + .lg\:pl-\[250px\] { + padding-left: 250px; + } + + .lg\:text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; + } + + .lg\:text-lg { + font-size: 1.125rem; + line-height: 1.75rem; + } + + .lg\:text-8xl { + font-size: 6rem; + line-height: 1; + } + + .lg\:text-5xl { + font-size: 3rem; + line-height: 1; + } + + .lg\:text-xl { + font-size: 1.25rem; + line-height: 1.75rem; + } + + .lg\:text-7xl { + font-size: 4.5rem; + line-height: 1; + } + + .lg\:text-2xl { + font-size: 1.5rem; + line-height: 2rem; + } + + .lg\:leading-none { + line-height: 1; + } +} + +@media (min-width: 1280px) { + .xl\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .xl\:text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; + } +} diff --git a/app/styles/carbon.css b/app/styles/carbon.css new file mode 100644 index 000000000..e8f0fed1f --- /dev/null +++ b/app/styles/carbon.css @@ -0,0 +1,64 @@ +#carbonads_1 { + display: none; +} + +#carbonads * { + margin: initial; + padding: initial; +} +#carbonads { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', Helvetica, Arial, + sans-serif; +} +#carbonads { + display: flex; +} +#carbonads a { + text-decoration: none; +} +#carbonads a:hover { + color: inherit; +} +#carbonads span { + position: relative; + display: block; + overflow: hidden; + width: 100%; +} +#carbonads .carbon-wrap { + display: flex; + flex-direction: column; +} +#carbonads .carbon-img { + display: block; + margin: 0; + line-height: 1; +} +#carbonads .carbon-img img { + display: block; + max-width: 100% !important; + width: 100%; + border-radius: 4px; +} +#carbonads .carbon-text { + font-size: 11px; + padding: 10px; + margin-bottom: 16px; + line-height: 1.5; + text-align: left; +} +#carbonads .carbon-poweredby { + display: block; + padding: 6px 8px; + text-align: center; + text-transform: uppercase; + letter-spacing: 0.5px; + font-weight: 600; + font-size: 8px; + line-height: 1; + border-top-left-radius: 3px; + position: absolute; + bottom: 0; + right: 0; +} diff --git a/src/types/images.d.ts b/app/types/images.d.ts similarity index 100% rename from src/types/images.d.ts rename to app/types/images.d.ts diff --git a/app/utils/blog.ts b/app/utils/blog.ts new file mode 100644 index 000000000..081ff6369 --- /dev/null +++ b/app/utils/blog.ts @@ -0,0 +1,12 @@ +const listJoiner = new Intl.ListFormat('en-US', { + style: 'long', + type: 'conjunction', +}) + +export function formatAuthors(authors: Array) { + if (!authors.length) { + return 'TanStack' + } + + return listJoiner.format(authors) +} diff --git a/src/utils/cache.server.ts b/app/utils/cache.server.ts similarity index 97% rename from src/utils/cache.server.ts rename to app/utils/cache.server.ts index 7bd2a7593..e82f849e6 100644 --- a/src/utils/cache.server.ts +++ b/app/utils/cache.server.ts @@ -4,7 +4,7 @@ declare global { var docCache: LRUCache } -const docCache = +let docCache = globalThis.docCache || (globalThis.docCache = new LRUCache({ max: 300, diff --git a/app/utils/config.ts b/app/utils/config.ts new file mode 100644 index 000000000..5795643b1 --- /dev/null +++ b/app/utils/config.ts @@ -0,0 +1,87 @@ +import { z } from 'zod' +import { fetchRepoFile } from './documents.server' +import { createServerFn } from '@tanstack/start' +import { setHeaders } from 'vinxi/http' + +export type MenuItem = { + label: string | React.ReactNode + children: { + label: string | React.ReactNode + to: string + badge?: string + }[] + collapsible?: boolean + defaultCollapsed?: boolean +} + +const configSchema = z.object({ + sections: z.array( + z.object({ + label: z.string(), + children: z.array( + z.object({ + label: z.string(), + to: z.string(), + badge: z.string().optional(), + }) + ), + frameworks: z + .array( + z.object({ + label: z.string(), + children: z.array( + z.object({ + label: z.string(), + to: z.string(), + badge: z.string().optional(), + }) + ), + }) + ) + .optional(), + collapsible: z.boolean().optional(), + defaultCollapsed: z.boolean().optional(), + }) + ), + users: z.array(z.string()).optional(), +}) + +export type ConfigSchema = z.infer + +/** + Fetch the config file for the project and validate it. + */ +export const getTanstackDocsConfig = createServerFn({ method: 'GET' }) + .validator( + z.object({ repo: z.string(), branch: z.string(), docsRoot: z.string() }) + ) + .handler(async ({ data: { repo, branch, docsRoot } }) => { + const config = await fetchRepoFile(repo, branch, `${docsRoot}/config.json`) + + if (!config) { + throw new Error(`Repo's ${docsRoot}/config.json was not found!`) + } + + try { + const tanstackDocsConfigFromJson = JSON.parse(config) + const validationResult = configSchema.safeParse( + tanstackDocsConfigFromJson + ) + + if (!validationResult.success) { + // Log the issues that come up during validation + console.error(JSON.stringify(validationResult.error, null, 2)) + throw new Error('Zod validation failed') + } + + setHeaders({ + 'cache-control': 'public, max-age=0, must-revalidate', + 'cdn-cache-control': 'max-age=300, stale-while-revalidate=300, durable', + 'Netlify-Vary': 'query=payload', + }) + + return validationResult.data + } catch (e) { + throw new Error('Invalid docs/config.json file') + } + }) diff --git a/src/utils/docs.ts b/app/utils/docs.ts similarity index 57% rename from src/utils/docs.ts rename to app/utils/docs.ts index 7a7b177a4..56dbb9371 100644 --- a/src/utils/docs.ts +++ b/app/utils/docs.ts @@ -5,25 +5,29 @@ import { } from '~/utils/documents.server' import removeMarkdown from 'remove-markdown' import { notFound } from '@tanstack/react-router' -import { createServerFn } from '@tanstack/react-start' -import * as v from 'valibot' -import { setResponseHeader } from '@tanstack/react-start/server' +import { createServerFn } from '@tanstack/start' +import { z } from 'zod' +import { setHeader } from 'vinxi/http' export const loadDocs = async ({ repo, branch, + // currentPath, + // redirectPath, docsPath, }: { repo: string branch: string docsPath: string + currentPath: string + redirectPath: string }) => { - if (!branch || !docsPath) { - throw notFound({ - data: { - message: 'No doc was found here!', - }, - }) + if (!branch) { + throw new Error('Invalid branch') + } + + if (!docsPath) { + throw new Error('Invalid docPath') } const filePath = `${docsPath}.md` @@ -33,19 +37,30 @@ export const loadDocs = async ({ repo, branch, filePath, + // currentPath, + // redirectPath, }, }) } export const fetchDocs = createServerFn({ method: 'GET' }) - .inputValidator( - v.object({ repo: v.string(), branch: v.string(), filePath: v.string() }), + .validator( + z.object({ repo: z.string(), branch: z.string(), filePath: z.string() }) ) .handler(async ({ data: { repo, branch, filePath } }) => { const file = await fetchRepoFile(repo, branch, filePath) if (!file) { throw notFound() + // if (currentPath === redirectPath) { + // // console.log('not found') + // throw notFound() + // } else { + // // console.log('redirect') + // throw redirect({ + // to: redirectPath, + // }) + // } } const frontMatter = extractFrontMatter(file) @@ -53,10 +68,10 @@ export const fetchDocs = createServerFn({ method: 'GET' }) // Cache for 5 minutes on shared cache // Revalidate in the background - setResponseHeader('Cache-Control', 'public, max-age=0, must-revalidate') - setResponseHeader( + setHeader('Cache-Control', 'public, max-age=0, must-revalidate') + setHeader( 'CDN-Cache-Control', - 'max-age=300, stale-while-revalidate=300, durable', + 'max-age=300, stale-while-revalidate=300, durable' ) return { @@ -64,13 +79,12 @@ export const fetchDocs = createServerFn({ method: 'GET' }) description, filePath, content: frontMatter.content, - frontmatter: frontMatter.data, } }) export const fetchFile = createServerFn({ method: 'GET' }) - .inputValidator( - v.object({ repo: v.string(), branch: v.string(), filePath: v.string() }), + .validator( + z.object({ repo: z.string(), branch: z.string(), filePath: z.string() }) ) .handler(async ({ data: { repo, branch, filePath } }) => { const file = await fetchRepoFile(repo, branch, filePath) @@ -81,10 +95,10 @@ export const fetchFile = createServerFn({ method: 'GET' }) // Cache for 60 minutes on shared cache // Revalidate in the background - setResponseHeader('Cache-Control', 'public, max-age=0, must-revalidate') - setResponseHeader( + setHeader('Cache-Control', 'public, max-age=0, must-revalidate') + setHeader( 'CDN-Cache-Control', - 'max-age=3600, stale-while-revalidate=3600, durable', + 'max-age=3600, stale-while-revalidate=3600, durable' ) return file @@ -93,26 +107,22 @@ export const fetchFile = createServerFn({ method: 'GET' }) export const fetchRepoDirectoryContents = createServerFn({ method: 'GET', }) - .inputValidator( - v.object({ - repo: v.string(), - branch: v.string(), - startingPath: v.string(), - }), + .validator( + z.object({ + repo: z.string(), + branch: z.string(), + startingPath: z.string(), + }) ) .handler(async ({ data: { repo, branch, startingPath } }) => { const githubContents = await fetchApiContents(repo, branch, startingPath) - if (!githubContents) { - throw notFound() - } - // Cache for 60 minutes on shared cache // Revalidate in the background - setResponseHeader('Cache-Control', 'public, max-age=0, must-revalidate') - setResponseHeader( + setHeader('Cache-Control', 'public, max-age=0, must-revalidate') + setHeader( 'CDN-Cache-Control', - 'max-age=3600, stale-while-revalidate=3600, durable', + 'max-age=3600, stale-while-revalidate=3600, durable' ) return githubContents diff --git a/src/utils/documents.server.ts b/app/utils/documents.server.ts similarity index 82% rename from src/utils/documents.server.ts rename to app/utils/documents.server.ts index 6e6c730f1..a26b0c967 100644 --- a/src/utils/documents.server.ts +++ b/app/utils/documents.server.ts @@ -1,6 +1,7 @@ import fs from 'node:fs' import fsp from 'node:fs/promises' import path from 'node:path' +// import { fileURLToPath } from 'node:url' import * as graymatter from 'gray-matter' import { fetchCached } from '~/utils/cache.server' import { multiSortBy, removeLeadingSlash } from './utils' @@ -23,11 +24,11 @@ async function fetchRemote( owner: string, repo: string, ref: string, - filepath: string, + filepath: string ) { const href = new URL( `${owner}/${repo}/${ref}/${filepath}`, - 'https://raw.githubusercontent.com/', + 'https://raw.githubusercontent.com/' ).href const response = await fetch(href, { @@ -41,42 +42,17 @@ async function fetchRemote( return await response.text() } -/** - * Validate that a filepath doesn't attempt path traversal - */ -function isValidFilepath(filepath: string): boolean { - const normalized = path.normalize(filepath) - return ( - !normalized.startsWith('..') && - !normalized.includes('/../') && - !path.isAbsolute(normalized) - ) -} - /** * Return text content of file from local file system */ async function fetchFs(repo: string, filepath: string) { - if (!isValidFilepath(filepath)) { - console.warn(`[fetchFs] Invalid filepath rejected: ${filepath}\n`) - return '' - } - + // const __dirname = fileURLToPath(new URL('.', import.meta.url)) const dirname = import.meta.url.split('://').at(-1)! - const baseDir = path.resolve(dirname, `../../../../${repo}`) - const localFilePath = path.resolve(baseDir, filepath) - - if (!localFilePath.startsWith(baseDir)) { - console.warn( - `[fetchFs] Path traversal attempt blocked: ${filepath} resolved to ${localFilePath}\n`, - ) - return '' - } - + const localFilePath = path.resolve(dirname, `../../../../${repo}`, filepath) const exists = fs.existsSync(localFilePath) if (!exists) { console.warn( - `[fetchFs] Tried to read file that does not exist: ${localFilePath}\n`, + `[fetchFs] Tried to read file that does not exist: ${localFilePath}\n` ) return '' } @@ -89,7 +65,7 @@ async function fetchFs(repo: string, filepath: string) { */ function replaceContent( text: string, - frontmatter: graymatter.GrayMatterFile, + frontmatter: graymatter.GrayMatterFile ) { let result = text const replace = frontmatter.data.replace as Record | undefined @@ -113,7 +89,7 @@ function replaceContent( */ function replaceSections( text: string, - frontmatter: graymatter.GrayMatterFile, + frontmatter: graymatter.GrayMatterFile ) { let result = text // RegExp defining token pair to dicover sections in the document @@ -127,7 +103,7 @@ function replaceSections( for (const match of frontmatter.content.matchAll(sectionRegex)) { if (match[1] !== match[2]) { console.error( - `Origin section '${match[1]}' does not have matching closing token (found '${match[2]}'). Please make sure that each section has corresponsing closing token and that sections are not nested.`, + `Origin section '${match[1]}' does not have matching closing token (found '${match[2]}'). Please make sure that each section has corresponsing closing token and that sections are not nested.` ) } @@ -139,7 +115,7 @@ function replaceSections( for (const match of result.matchAll(sectionRegex)) { if (match[1] !== match[2]) { console.error( - `Target section '${match[1]}' does not have matching closing token (found '${match[2]}'). Please make sure that each section has corresponsing closing token and that sections are not nested.`, + `Target section '${match[1]}' does not have matching closing token (found '${match[2]}'). Please make sure that each section has corresponsing closing token and that sections are not nested.` ) } @@ -156,7 +132,7 @@ function replaceSections( value[0] + result.slice( sectionMatch.index! + sectionMatch[0].length, - result.length, + result.length ) } }) @@ -180,7 +156,7 @@ function replaceSections( function replaceProjectImageBranch( text: string, repoPair: string, - ref: string, + ref: string ) { const handleReplaceImageSrc = (src: string): string => { const srcLowered = src.toLowerCase() @@ -278,12 +254,12 @@ function replaceProjectImageBranch( export async function fetchRepoFile( repoPair: string, ref: string, - filepath: string, + filepath: string ) { const key = `${repoPair}:${ref}:${filepath}` - const [owner, repo] = repoPair.split('/') + let [owner, repo] = repoPair.split('/') - const ttl = process.env.NODE_ENV === 'development' ? 1 : 10 * 60 * 1000 // 10 minutes + const ttl = process.env.NODE_ENV === 'development' ? 1 : 1 * 60 * 1000 // 5 minute const file = await fetchCached({ key, ttl, @@ -336,17 +312,9 @@ export async function fetchRepoFile( } export function extractFrontMatter(content: string) { - const result = graymatter.default(content, { - excerpt: (file: any) => (file.excerpt = createRichExcerpt(file.content)), + return graymatter.default(content, { + excerpt: (file: any) => (file.excerpt = createExcerpt(file.content)), }) - - return { - ...result, - data: { - ...result.data, - description: createExcerpt(result.content), - } as { [key: string]: any } & { description: string }, - } } function createExcerpt(text: string, maxLength = 200) { @@ -367,12 +335,6 @@ function createExcerpt(text: string, maxLength = 200) { cleanText = cleanText.slice(0, maxLength).trim() + '...' } - return cleanText -} - -function createRichExcerpt(text: string, maxLength = 200) { - let cleanText = createExcerpt(text, maxLength) - const imageText = extractFirstImage(text) if (imageText) { @@ -417,12 +379,12 @@ const API_CONTENTS_MAX_DEPTH = 3 export function fetchApiContents( repoPair: string, branch: string, - startingPath: string, + startingPath: string ) { const isDev = process.env.NODE_ENV === 'development' return fetchCached({ key: `${repoPair}:${branch}:${startingPath}`, - ttl: isDev ? 1 : 10 * 60 * 1000, // 10 minute + ttl: isDev ? 1 : 1 * 60 * 1000, // 5 minute fn: () => { return isDev ? fetchApiContentsFs(repoPair, startingPath) @@ -441,8 +403,9 @@ function sortApiContents(contents: Array): Array { async function fetchApiContentsFs( repoPair: string, - startingPath: string, + startingPath: string ): Promise | null> { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [_, repo] = repoPair.split('/') const dirname = import.meta.url.split('://').at(-1)! @@ -459,48 +422,33 @@ async function fetchApiContentsFs( '.vercel', '.DS_Store', '.nitro', - '.tanstack-start/build', + '.vinxi', ] async function getContentsForPath( - filePath: string, + filePath: string ): Promise> { - try { - const list = await fsp.readdir(filePath, { withFileTypes: true }) - return list - .filter((item) => !dirsAndFilesToIgnore.includes(item.name)) - .map((item) => { - return { - name: item.name, - path: path.join(filePath, item.name), - type: item.isDirectory() ? 'dir' : 'file', - _links: { - self: path.join(filePath, item.name), - }, - } - }) - } catch (error) { - if ( - error instanceof Error && - 'code' in error && - error.code === 'ENOENT' - ) { - return [] - } - throw error - } + const list = await fsp.readdir(filePath, { withFileTypes: true }) + return list + .filter((item) => !dirsAndFilesToIgnore.includes(item.name)) + .map((item) => { + return { + name: item.name, + path: path.join(filePath, item.name), + type: item.isDirectory() ? 'dir' : 'file', + _links: { + self: path.join(filePath, item.name), + }, + } + }) } const data = await getContentsForPath(fsStartPath) - if (data.length === 0) { - return null - } - async function buildFileTree( nodes: Array | undefined, depth: number, - parentPath: string, + parentPath: string ) { const result: Array = [] @@ -518,7 +466,7 @@ async function fetchApiContentsFs( file.children = await buildFileTree( directoryFiles, depth + 1, - `${parentPath}${file.path}/`, + `${parentPath}${file.path}/` ) } @@ -539,7 +487,7 @@ async function fetchApiContentsFs( async function fetchApiContentsRemote( repo: string, branch: string, - startingPath: string, + startingPath: string ): Promise | null> { const fetchOptions: RequestInit = { headers: { @@ -549,15 +497,12 @@ async function fetchApiContentsRemote( } const res = await fetch( `https://api.github.com/repos/${repo}/contents/${startingPath}?ref=${branch}`, - fetchOptions, + fetchOptions ) if (!res.ok) { - if (res.status === 404) { - return null - } throw new Error( - `Failed to fetch repo contents for ${repo}/${branch}/${startingPath}: Status is ${res.statusText} - ${res.status}`, + `Failed to fetch repo contents for ${repo}/${branch}/${startingPath}: Status is ${res.statusText} - ${res.status}` ) } @@ -566,7 +511,7 @@ async function fetchApiContentsRemote( if (!Array.isArray(data)) { console.warn( 'Expected an array of files from GitHub API, but received:\n', - JSON.stringify(data), + JSON.stringify(data) ) return null } @@ -574,7 +519,7 @@ async function fetchApiContentsRemote( async function buildFileTree( nodes: Array | undefined, depth: number, - parentPath: string, + parentPath: string ) { const result: Array = [] @@ -590,24 +535,16 @@ async function fetchApiContentsRemote( if (file.type === 'dir' && depth <= API_CONTENTS_MAX_DEPTH) { const directoryFilesResponse = await fetch( file._links.self, - fetchOptions, + fetchOptions ) const directoryFiles = (await directoryFilesResponse.json()) as Array - if (!Array.isArray(directoryFiles)) { - console.warn( - `Expected an array of files from GitHub API for directory ${file.path}, but received:\n`, - JSON.stringify(directoryFiles), - ) - // Leave file.children undefined - } else { - file.children = await buildFileTree( - directoryFiles, - depth + 1, - `${parentPath}${file.path}/`, - ) - } + file.children = await buildFileTree( + directoryFiles, + depth + 1, + `${parentPath}${file.path}/` + ) } result.push(file) diff --git a/app/utils/env.ts b/app/utils/env.ts new file mode 100644 index 000000000..c6336ba87 --- /dev/null +++ b/app/utils/env.ts @@ -0,0 +1,43 @@ +import { z } from 'zod' + +// Define server-only schema +const serverEnvSchema = z.object({ + GITHUB_AUTH_TOKEN: z.string().default('USE_A_REAL_KEY_IN_PRODUCTION'), + AIRTABLE_API_KEY: z.string().optional(), +}) + +// Define client schema +const viteEnvSchema = z.object({ + VITE_CLERK_PUBLISHABLE_KEY: z.string().optional(), +}) + +// Validate and parse environment variables +const parsedServerEnv = import.meta.env.SSR + ? serverEnvSchema.parse(process.env) + : {} +const parsedClientEnv = viteEnvSchema.parse(import.meta.env) + +type ParsedServerEnv = z.infer +type ParsedClientEnv = z.infer +type ParsedEnv = ParsedServerEnv & ParsedClientEnv + +// Merge parsed environments, with server env hidden from client +export const env = new Proxy( + import.meta.env.SSR + ? { ...parsedClientEnv, ...parsedServerEnv } + : parsedClientEnv, + { + get(target, prop) { + if (prop in parsedServerEnv && typeof window !== 'undefined') { + throw new Error( + `Access to server-only environment variable '${String( + prop + )}' from client code is not allowed.` + ) + } + return prop in parsedServerEnv + ? parsedServerEnv[prop as keyof typeof parsedServerEnv] + : target[prop as keyof typeof parsedClientEnv] + }, + } +) as ParsedEnv diff --git a/src/utils/handleRedirects.server.ts b/app/utils/handleRedirects.server.ts similarity index 82% rename from src/utils/handleRedirects.server.ts rename to app/utils/handleRedirects.server.ts index bd0ac3b68..2e2e9b547 100644 --- a/src/utils/handleRedirects.server.ts +++ b/app/utils/handleRedirects.server.ts @@ -7,12 +7,9 @@ export function handleRedirects( urlFromRequest: string, urlFromPathStart: string, urlToPathStart: string, - urlToQueryParams: string, + urlToQueryParams: string ) { - const url = new URL( - urlFromRequest, - import.meta.env.DEV ? 'http://localhost:3000' : 'https://tanstack.com', - ) + const url = new URL(urlFromRequest, 'https://tanstack.com') redirectItems.forEach((item) => { if (url.pathname.startsWith(`${urlFromPathStart}/${item.from}`)) { diff --git a/app/utils/partners.tsx b/app/utils/partners.tsx new file mode 100644 index 000000000..2ea56e987 --- /dev/null +++ b/app/utils/partners.tsx @@ -0,0 +1,595 @@ +import { Link } from '@tanstack/react-router' +import agGridDarkSvg from '~/images/ag-grid-dark.svg' +import agGridLightSvg from '~/images/ag-grid-light.svg' +import nozzleImage from '~/images/nozzle.png' +import nozzleDarkSvg from '~/images/nozzle-dark.svg' +import nozzleLightSvg from '~/images/nozzle-light.svg' +import bytesUidotdevImage from '~/images/bytes-uidotdev.png' +// import vercelLightSvg from '~/images/vercel-light.svg' +// import vercelDarkSvg from '~/images/vercel-dark.svg' +import netlifyLightSvg from '~/images/netlify-light.svg' +import netlifyDarkSvg from '~/images/netlify-dark.svg' +import convexWhiteSvg from '~/images/convex-white.svg' +import convexColorSvg from '~/images/convex-color.svg' +import clerkLightSvg from '~/images/clerk-logo-light.svg' +import clerkDarkSvg from '~/images/clerk-logo-dark.svg' +import sentryWordMarkLightSvg from '~/images/sentry-wordmark-light.svg' +import sentryWordMarkDarkSvg from '~/images/sentry-wordmark-dark.svg' +import speakeasyLightSvg from '~/images/speakeasy-light.svg' +import speakeasyDarkSvg from '~/images/speakeasy-dark.svg' +import neonLightSvg from '~/images/neon-light.svg' +import neonDarkSvg from '~/images/neon-dark.svg' +import unkeyBlackSvg from '~/images/unkey-black.svg' +import unkeyWhiteSvg from '~/images/unkey-white.svg' +import { Library } from '~/libraries' + +type Partner = { + name: string + id: string + libraries?: Library['id'][] + sidebarImgLight?: string + sidebarImgDark?: string + href: string + homepageImg: JSX.Element + content: JSX.Element + sidebarImgClass?: string +} + +const neon = (() => { + const href = 'https://neon.tech?utm_source=tanstack' + + return { + name: 'Neon', + id: 'neon', + libraries: ['start', 'router'], + sidebarImgLight: neonLightSvg, + sidebarImgDark: neonDarkSvg, + sidebarImgClass: 'py-3 scale-[1]', + href, + homepageImg: ( +
    + Neon + Neon +
    + ), + content: ( + <> +
    + Neon and TanStack are joining forces to bring{' '} + serverless PostgreSQL to the modern web stack. With + Neon's{' '} + + blazing-fast branching, autoscaling, and storage/compute separation + + , developers can instantly spin up production-grade databases for + every branch, test, or feature. TanStack's developer-first framework + + Neon's cutting-edge infra = next-gen DX. +
    + + Learn More + + + ), + } +})() + +const convex = (() => { + const href = 'https://convex.dev?utm_source=tanstack' + + return { + name: 'Convex', + id: 'convex', + libraries: ['start', 'router'], + sidebarImgLight: convexColorSvg, + sidebarImgDark: convexWhiteSvg, + sidebarImgClass: 'py-5 scale-[1.1]', + href, + homepageImg: ( +
    + Convex + Convex +
    + ), + content: ( + <> +
    + Convex has teamed up with TanStack to not only deliver a{' '} + first-class end-to-end type-safe database experience{' '} + to TanStack developers, but to also ensure TanStack is ready for the + real-time database arena. Convex's all-in-one platform delivers + end-to-end type-safety via a{' '} + revolutionary relational, real-time database and + together, we're elevating what's possible with real-time React + applications. +
    + + Learn More + + + ), + } +})() + +const clerk = (() => { + const href = 'https://go.clerk.com/wOwHtuJ' + + return { + name: 'Clerk', + id: 'clerk', + href, + libraries: ['start', 'router'], + sidebarImgLight: clerkLightSvg, + sidebarImgDark: clerkDarkSvg, + sidebarImgClass: 'py-4', + homepageImg: ( +
    + Clerk + Clerk +
    + ), + content: ( + <> +
    + Clerk and TanStack are partnering to elevate your application's{' '} + security and user experience with industry-leading{' '} + authentication and user management. Paired with + TanStack's no-nonsense routing and tooling, you'll be equipped to + effortlessly deliver top-notch experiences that your users can trust + and your developers can rely on. +
    + + Learn More + + + ), + } +})() + +const agGrid = (() => { + const href = + 'https://ag-grid.com/react-data-grid/?utm_source=reacttable&utm_campaign=githubreacttable' + + return { + name: 'AG Grid', + id: 'ag-grid', + libraries: ['table'], + sidebarImgLight: agGridDarkSvg, + sidebarImgDark: agGridLightSvg, + sidebarImgClass: 'py-5 scale-[1.1]', + href, + homepageImg: ( +
    + Enterprise Data Grid + Enterprise Data Grid +
    + ), + content: ( + <> +
    + TanStack Table and AG Grid are respectfully the{' '} + best table/datagrid libraries around and together are + working hard to ensure the highest quality table/datagrid experience + for the entire JS/TS ecosystem. Whether it's a lightweight table or a + complex datagrid, we've we've got you covered. +
    + + Learn More + + + ), + } +})() + +const netlify = (() => { + const href = 'https://netlify.com?utm_source=tanstack' + + return { + name: 'Netlify', + id: 'netlify', + libraries: ['start', 'router'], + sidebarImgLight: netlifyLightSvg, + sidebarImgDark: netlifyDarkSvg, + sidebarImgClass: 'pt-2 scale-[.9]', + sidebarAfterImg: ( +
    + Official Deployment Partner +
    + ), + href, + homepageImg: ( +
    +
    + Convex + Convex +
    +
    + Official Deployment Partner +
    +
    + ), + content: ( + <> +
    + Netlify and TanStack have joined forces to provide developers with{' '} + world-class deployment and hosting capabilities for + modern web applications. Together we're focused on delivering an + exceptional developer experience through{' '} + + seamless deployment workflows, edge functions, and serverless + capabilities + {' '} + that help teams build and ship faster. Our partnership ensures + TanStack applications can take full advantage of Netlify's powerful + platform features. +
    + + Learn More + + + ), + } +})() + +const sentry = (() => { + const href = 'https://sentry.io?utm_source=tanstack' + + return { + name: 'Sentry', + id: 'sentry', + libraries: ['start', 'router'], + sidebarImgLight: sentryWordMarkDarkSvg, + sidebarImgDark: sentryWordMarkLightSvg, + sidebarImgClass: 'py-4 scale-[1.1]', + href, + homepageImg: ( +
    + Sentry + Sentry +
    + ), + content: ( + <> +
    + Sentry and TanStack are on a mission to make sure your apps are + error-free and high-performers. Sentry's + best-in-class error monitoring and performance insights combined with + TanStack's cutting-edge libraries ensure that you can deliver the best + possible experience to your users. Together, we're committed to making + sure that you can build with confidence. +
    + + Learn More + + + ), + } +})() + +const uiDev = (() => { + const href = 'https://bytes.dev?utm_source-tanstack&utm_campaign=tanstack' + + return { + name: 'UI.dev', + id: 'ui-dev', + libraries: [], + href, + homepageImg: ( +
    + Bytes Logo +
    + ), + content: ( + <> +
    + TanStack's priority is to make its users productive, efficient and + knowledgeable about web dev. To help us on this quest, we've partnered + with{' '} + + ui.dev + {' '} + to provide best-in-class education about TanStack + products. It doesn't stop at TanStack though, with their sister + product{' '} + + Bytes.dev + {' '} + as our official newsletter partner, you'll be able to{' '} + stay up to date with the latest and greatest in the + web dev world regardless. +
    + + Learn More + + + ), + } +})() + +const nozzle = (() => { + const href = 'https://nozzle.io/?utm_source=tanstack&utm_campaign=tanstack' + + return { + name: 'Nozzle.io', + id: 'nozzle', + href, + sidebarImgLight: nozzleDarkSvg, + sidebarImgDark: nozzleLightSvg, + sidebarImgClass: 'w-[150px] py-4', + homepageImg: ( +
    + SEO keyword rank tracker +
    + ), + content: ( + <> +
    + Since its founding, Nozzle's SEO platform was the original home for + almost all TanStack libraries. They were used to build the{' '} + + most technically advanced search engine monitoring platform + {' '} + of its kind. Its enterprise rank tracking and keyword research tools + continue to set a new bar for quality and scale. Nozzle continues to + prove the value of the full gamut of TanStack tools on the front-end + with unmatched UI/UX. +
    + + Learn More + + + ), + } +})() + +const speakeasy = (() => { + const href = + 'https://speakeasy.com/?utm_source=tanstack&utm_campaign=tanstack' + + return { + name: 'Speakeasy', + id: 'speakeasy', + href, + sidebarImgLight: speakeasyLightSvg, + sidebarImgDark: speakeasyDarkSvg, + sidebarImgClass: 'w-[150px] py-4', + libraries: ['query'], + homepageImg: ( +
    + Speakeasy + Speakeasy +
    + ), + content: ( + <> +
    + Speakeasy and TanStack are working together to make{' '} + API management effortless. With Speakeasy's{' '} + automated SDK generation and TanStack's robust + front-end tooling, developers can move faster than ever. Whether + you're integrating APIs or streamlining your developer experience, + this partnership ensures you're covered from server to client with{' '} + powerful, type-safe, and optimized solutions. +
    + + Learn More + + + ), + } +})() + +const unkey = (() => { + const href = 'https://www.unkey.com/?utm_source=tanstack' + + return { + name: 'Unkey', + id: 'unkey', + libraries: ['pacer'], + sidebarImgLight: unkeyBlackSvg, + sidebarImgDark: unkeyWhiteSvg, + sidebarImgClass: 'py-4 scale-[1]', + href, + homepageImg: ( +
    + Unkey + Unkey +
    + ), + content: ( + <> +
    + Unkey and TanStack are teaming up to streamline API management for + developers. With Unkey's powerful features like{' '} + API key management, rate limiting, + and usage analytics, integrating with TanStack's + developer-first tools becomes seamless. Together, we're enhancing the + developer experience by providing secure and scalable solutions for + modern web applications. +
    + + Learn More + + + ), + } +})() + +// const vercel = (() => { +// const href = 'https://vercel.com?utm_source=tanstack' + +// return { +// name: 'Vercel', +// id: 'vercel', +// href, +// libraries: ['start', 'router'], +// sidebarImgLight: vercelLightSvg, +// sidebarImgDark: vercelDarkSvg, +// sidebarImgClass: 'py-4', +// homepageImg: ( +//
    +// Vercel +// Vercel +//
    +// ), +// content: ( +// <> +//
    +// TanStack Router/Start and Vercel are a match made in heaven. +// Vercel's{' '} +// cutting-edge deployment and serverless capabilities{' '} +// continue to deliver on the TanStack promise for apps to be{' '} +// high-performant and scalable. We're working closely +// with Vercel to not only ensure a flawless deployment experience, but +// also push the boundaries of what's possible with TanStack on the +// web. +//
    +// +// Learn More +// +// +// ), +// } +// })() + +export const partners: Partner[] = [ + clerk, + agGrid, + netlify, + neon, + convex, + sentry, + speakeasy, + unkey, + uiDev, + nozzle, +] + +if (typeof window !== 'undefined') { + ;(window as any).githubPartnersSnippet = partners + .filter((d) => d.href && (d.sidebarImgLight || d.sidebarImgDark)) + .map((partner) => { + return `
    ` + }) + .join('\n') +} diff --git a/src/utils/sandbox.ts b/app/utils/sandbox.ts similarity index 72% rename from src/utils/sandbox.ts rename to app/utils/sandbox.ts index c1c746575..9455b05f4 100644 --- a/src/utils/sandbox.ts +++ b/app/utils/sandbox.ts @@ -2,7 +2,7 @@ import { type Framework } from '~/libraries' export const getExampleStartingPath = ( framework: Framework, - libraryId?: string, + libraryId?: string ) => { if (libraryId && ['start', 'router'].includes(libraryId)) { return 'src/routes/__root.tsx' @@ -15,25 +15,25 @@ export const getExampleStartingPath = ( export function getExampleStartingFileName( framework: Framework, - libraryId?: string, + libraryId?: string ) { const file = framework === 'angular' ? 'app.component' : ['svelte', 'vue'].includes(framework) - ? 'App' - : ['form', 'query', 'pacer'].includes(libraryId!) - ? 'index' - : 'main' + ? 'App' + : ['form', 'query', 'pacer'].includes(libraryId!) + ? 'index' + : 'main' const ext = framework === 'svelte' ? 'svelte' : framework === 'vue' - ? 'vue' - : ['angular', 'lit'].includes(framework) - ? 'ts' - : 'tsx' + ? 'vue' + : ['angular', 'lit'].includes(framework) + ? 'ts' + : 'tsx' return `${file}.${ext}` as const } diff --git a/app/utils/sentry.ts b/app/utils/sentry.ts new file mode 100644 index 000000000..107a3dbe9 --- /dev/null +++ b/app/utils/sentry.ts @@ -0,0 +1,16 @@ +import * as Sentry from '@sentry/react' + +Sentry.init({ + dsn: 'https://ac4bfc43ff4a892f8dc7053c4a50d92f@o4507236158537728.ingest.us.sentry.io/4507236163649536', + integrations: [ + Sentry.browserTracingIntegration(), + Sentry.replayIntegration(), + ], + // Performance Monitoring + tracesSampleRate: 1.0, // Capture 100% of the transactions + // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled + tracePropagationTargets: ['localhost', /^https:\/\/tanstack\.com\//], + // Session Replay + replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production. + replaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur. +}) diff --git a/src/utils/seo.ts b/app/utils/seo.ts similarity index 89% rename from src/utils/seo.ts rename to app/utils/seo.ts index 394403535..904ce7b3b 100644 --- a/src/utils/seo.ts +++ b/app/utils/seo.ts @@ -3,13 +3,11 @@ export const seo = ({ description, keywords, image, - noindex, }: { title: string description?: string image?: string keywords?: string - noindex?: boolean }) => { const tags = [ { title }, @@ -29,7 +27,6 @@ export const seo = ({ { property: 'og:image', content: image }, ] : []), - ...(noindex ? [{ name: 'robots', content: 'noindex, nofollow' }] : []), ] return tags diff --git a/app/utils/useClientOnlyRender.ts b/app/utils/useClientOnlyRender.ts new file mode 100644 index 000000000..0b4547a5c --- /dev/null +++ b/app/utils/useClientOnlyRender.ts @@ -0,0 +1,9 @@ +import { useEffect, useState } from 'react' + +export function useClientOnlyRender() { + const [rendered, setRendered] = useState(false) + useEffect(() => { + setRendered(true) + }, []) + return rendered +} diff --git a/app/utils/useLocalStorage.ts b/app/utils/useLocalStorage.ts new file mode 100644 index 000000000..5bd1592e0 --- /dev/null +++ b/app/utils/useLocalStorage.ts @@ -0,0 +1,48 @@ +import { useState, useEffect } from 'react' + +function getWithExpiry(key: string) { + if (typeof window !== 'undefined') { + const itemStr = localStorage.getItem(key) + // if the item doesn't exist, return undefined + if (!itemStr) { + return undefined + } + const item: { value: T; ttl: number } = JSON.parse(itemStr) + // If there is no TTL set, return the value + if (!item.ttl) { + return item.value + } + // compare the expiry time of the item with the current time + if (new Date().getTime() > item.ttl) { + // If the item is expired, delete the item from storage + localStorage.removeItem(key) + return undefined + } + return item.value + } +} + +export function useLocalStorage( + key: string, + defaultValue: T, + ttl?: number +): [T, typeof setValue] { + const [value, setValue] = useState(defaultValue) + + useEffect(() => { + const item = getWithExpiry(key) + if (item !== undefined) setValue(item) + }, [key]) + + useEffect(() => { + localStorage.setItem( + key, + JSON.stringify({ + value, + ttl: ttl ? new Date().getTime() + ttl : null, + }) + ) + }, [key, value, ttl]) + + return [value, setValue] +} diff --git a/src/utils/usePrefersReducedMotion.ts b/app/utils/usePrefersReducedMotion.ts similarity index 100% rename from src/utils/usePrefersReducedMotion.ts rename to app/utils/usePrefersReducedMotion.ts diff --git a/app/utils/utils.ts b/app/utils/utils.ts new file mode 100644 index 000000000..10d531da2 --- /dev/null +++ b/app/utils/utils.ts @@ -0,0 +1,135 @@ +export function capitalize(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1) +} + +export function slugToTitle(str: string) { + return str + .split('-') + .map((word) => capitalize(word)) + .join(' ') +} + +// export const tw = { +// group: (prefix: string, tokens: string) => { +// return tokens +// .split(' ') +// .map((d) => `${prefix}${d}`) +// .join(' ') +// }, +// } + +export function last(arr: T[]) { + return arr[arr.length - 1] +} + +// Generates path replacing tokens with params +export function generatePath( + id: string, + params: Record +) { + let result = id.replace('routes', '').replaceAll('.', '/') + Object.entries(params).forEach(([key, value]) => { + result = result.replace(`$${key}`, value!) + }) + result = result.replace('$', params['*']!) + + return result +} + +export function shuffle(arr: T[]) { + const random = Math.random() + const result = arr.slice() + + for (let i = result.length - 1; i > 0; i--) { + const j = Math.floor(random * (i + 1)) + const temp = result[i] + result[i] = result[j] + result[j] = temp + } + + return result +} + +export function sample(arr: any[], random = Math.random()) { + return arr[Math.floor(random * arr.length)] +} + +export function sortBy(arr: T[], accessor: (d: T) => any = (d) => d): T[] { + return arr + .map((d: any, i: any) => [d, i]) + .sort(([a, ai], [b, bi]) => { + a = accessor(a) + b = accessor(b) + + if (typeof a === 'undefined') { + if (typeof b === 'undefined') { + return 0 + } + return 1 + } + + a = isNumericString(a) ? Number(a) : a + b = isNumericString(b) ? Number(b) : b + + return a === b ? ai - bi : a > b ? 1 : -1 + }) + .map((d: any) => d[0]) +} + +export function isNumericString(str: string): boolean { + if (typeof str !== 'string') { + return false // we only process strings! + } + + return ( + !isNaN(str as unknown as number) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)... + !isNaN(parseFloat(str)) + ) // ...and ensure strings of whitespace fail +} + +/** + * A utility function from Router, to sort an array of objects by multiple accessors. + * + * @param arr Unsorted array + * @param accessors Callbacks to access the values to sort by + * @returns Sorted array + */ +export function multiSortBy( + arr: Array, + accessors: Array<(item: T) => any> = [(d) => d] +): Array { + return arr + .map((d, i) => [d, i] as const) + .sort(([a, ai], [b, bi]) => { + for (const accessor of accessors) { + const ao = accessor(a) + const bo = accessor(b) + + if (typeof ao === 'undefined') { + if (typeof bo === 'undefined') { + continue + } + return 1 + } + + if (ao === bo) { + continue + } + + return ao > bo ? 1 : -1 + } + + return ai - bi + }) + .map(([d]) => d) +} + +/** + * A utility function from Router, to remove leading slash from a path. + * + * @param path Candidate path to remove leading slash + * @returns Path without leading slash + */ +export function removeLeadingSlash(path: string): string { + return path.replace(/^\//, '') +} diff --git a/content-collections.ts b/content-collections.ts index 1ef0f4a10..ddae14fac 100644 --- a/content-collections.ts +++ b/content-collections.ts @@ -3,27 +3,19 @@ import { extractFrontMatter } from '~/utils/documents.server' const posts = defineCollection({ name: 'posts', - directory: './src/blog', + directory: './app/blog', include: '*.md', 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..672339fa3 --- /dev/null +++ b/convex/_generated/api.d.ts @@ -0,0 +1,170 @@ +/* eslint-disable */ +/** + * Generated `api` utility. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import type * as http from "../http.js"; +import type * as stats from "../stats.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<{ + http: typeof http; + stats: typeof stats; +}>; +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 + >; + 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 + >; + 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; + minStars: number; + npmOrgs: 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; + minStars: number; + npmOrgs: Array; + }, + null + >; + }; + npm: { + getNpmOrgs: FunctionReference< + "query", + "internal", + { names: Array }, + Array; + downloadCount: number; + downloadCountUpdatedAt: number; + name: string; + updatedAt: number; + }> + >; + updateNpmOrg: FunctionReference< + "mutation", + "internal", + { name: string }, + any + >; + updateNpmOrgStats: FunctionReference< + "action", + "internal", + { org: string; page?: number }, + any + >; + updateNpmPackagesForOrg: FunctionReference< + "mutation", + "internal", + { + org: string; + packages: Array<{ + dayOfWeekAverages: Array; + downloadCount: number; + isNotFound?: boolean; + name: string; + }>; + }, + 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..fb12533b8 --- /dev/null +++ b/convex/_generated/dataModel.d.ts @@ -0,0 +1,58 @@ +/* eslint-disable */ +/** + * Generated data model types. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * To regenerate, run `npx convex dev`. + * @module + */ + +import { AnyDataModel } from "convex/server"; +import type { GenericId } from "convex/values"; + +/** + * No `schema.ts` file found! + * + * This generated code has permissive types like `Doc = any` because + * Convex doesn't know your schema. If you'd like more type safety, see + * https://docs.convex.dev/using/schemas for instructions on how to add a + * schema file. + * + * After you change a schema, rerun codegen with `npx convex dev`. + */ + +/** + * The names of all of your Convex tables. + */ +export type TableNames = string; + +/** + * The type of a document stored in Convex. + */ +export type Doc = any; + +/** + * 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. + */ +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 = AnyDataModel; 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/convex.config.ts b/convex/convex.config.ts new file mode 100644 index 000000000..0e30da2fb --- /dev/null +++ b/convex/convex.config.ts @@ -0,0 +1,7 @@ +import { defineApp } from 'convex/server' +import ossStats from '@erquhart/convex-oss-stats/convex.config' + +const app = defineApp() +app.use(ossStats) + +export default app diff --git a/convex/http.ts b/convex/http.ts new file mode 100644 index 000000000..492aa4641 --- /dev/null +++ b/convex/http.ts @@ -0,0 +1,8 @@ +import { ossStats } from './stats' +import { httpRouter } from 'convex/server' + +const http = httpRouter() + +ossStats.registerRoutes(http) + +export default http diff --git a/convex/stats.ts b/convex/stats.ts new file mode 100644 index 000000000..42ec4987f --- /dev/null +++ b/convex/stats.ts @@ -0,0 +1,9 @@ +import { OssStats } from '@erquhart/convex-oss-stats' +import { components } from './_generated/api' + +export const ossStats = new OssStats(components.ossStats, { + githubOwners: ['tanstack'], + npmOrgs: ['tanstack', 'tannerlinsley'], +}) + +export const { getGithubOwner, getNpmOrg, 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/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 04d53b5a8..701ab0a33 100644 Binary files a/media/brand.sketch and b/media/brand.sketch differ diff --git a/media/splash/splash-dark.afphoto b/media/splash/splash-dark.afphoto index 475173679..33488bb0b 100644 Binary files a/media/splash/splash-dark.afphoto and b/media/splash/splash-dark.afphoto differ diff --git a/media/splash/splash-light.afphoto b/media/splash/splash-light.afphoto index 9dd5da9bd..d23c85203 100644 Binary files a/media/splash/splash-light.afphoto and b/media/splash/splash-light.afphoto differ diff --git a/netlify.toml b/netlify.toml index 841bed99e..7e1bffc2a 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,37 +1,2 @@ -[build.environment] - NODE_OPTIONS = "--max-old-space-size=4096" - -[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" +[context.production] + command = "npx convex deploy --cmd 'pnpm run build'" \ No newline at end of file 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-blog-posts-background.ts b/netlify/functions/sync-blog-posts-background.ts deleted file mode 100644 index d451a61ef..000000000 --- a/netlify/functions/sync-blog-posts-background.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { Config } from '@netlify/functions' -import { syncBlogPosts } from '~/server/feed/blog' - -/** - * Netlify Scheduled Function - Sync blog posts from content collections - * - * This function syncs blog posts from content collections into the feed database: - * - Reads all posts from content-collections (available in deployed server) - * - Creates/updates feed entries with excerpt and link to full post - * - Marks entries as auto-synced - * - * Scheduled: Runs automatically every 5 minutes to pick up new blog posts after deployment - * Since the sync is idempotent, running frequently is safe. - */ -const handler = async (req: Request) => { - const { next_run } = await req.json() - - console.log('[sync-blog-posts-background] Starting blog posts sync...') - - const startTime = Date.now() - - try { - const result = await syncBlogPosts() - - const duration = Date.now() - startTime - console.log( - `[sync-blog-posts-background] ✓ Completed in ${duration}ms - Created: ${result.created}, Updated: ${result.updated}, Total: ${result.syncedCount}`, - ) - if (result.errors.length > 0) { - console.error( - `[sync-blog-posts-background] Errors: ${result.errors.length}`, - result.errors, - ) - } - console.log('[sync-blog-posts-background] 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( - `[sync-blog-posts-background] ✗ Failed after ${duration}ms:`, - errorMessage, - ) - if (errorStack) { - console.error('[sync-blog-posts-background] Stack:', errorStack) - } - } -} - -export default handler - -export const config: Config = { - schedule: '*/5 * * * *', // Every 5 minutes -} diff --git a/netlify/functions/sync-github-releases-background.ts b/netlify/functions/sync-github-releases-background.ts deleted file mode 100644 index 29d93be55..000000000 --- a/netlify/functions/sync-github-releases-background.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { Config } from '@netlify/functions' -import { syncGitHubReleases } from '~/server/feed/github.functions' - -/** - * Netlify Scheduled Function - Sync GitHub releases - * - * This function syncs GitHub releases from all TanStack repos: - * - Fetches new releases since last sync - * - Creates/updates feed items in the database - * - Marks releases as synced to avoid duplicates - * - * Scheduled: Runs automatically every 6 hours - */ -const handler = async (req: Request) => { - const { next_run } = await req.json() - - console.log( - '[sync-github-releases-background] Starting GitHub release sync...', - ) - - const startTime = Date.now() - - try { - const result = await syncGitHubReleases() - - const duration = Date.now() - startTime - console.log( - `[sync-github-releases-background] ✓ Completed in ${duration}ms - Synced: ${result.syncedCount}, Skipped: ${result.skippedCount}, Errors: ${result.errorCount}`, - ) - console.log( - '[sync-github-releases-background] 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( - `[sync-github-releases-background] ✗ Failed after ${duration}ms:`, - errorMessage, - ) - if (errorStack) { - console.error('[sync-github-releases-background] Stack:', errorStack) - } - } -} - -export default handler - -export const config: Config = { - schedule: '0 */6 * * *', // Every 6 hours -} diff --git a/opencode.json b/opencode.json deleted file mode 100644 index 77341dd59..000000000 --- a/opencode.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "playwright": { - "type": "local", - "command": ["npx", "-y", "@playwright/mcp@latest"], - "enabled": false - }, - "Sentry": { - "type": "remote", - "url": "https://mcp.sentry.dev/mcp", - "enabled": false - } - } -} diff --git a/package.json b/package.json index 0728b69c2..dd0f9cf45 100644 --- a/package.json +++ b/package.json @@ -3,163 +3,112 @@ "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", - "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" + "dev:frontend": "pnpm run with-env vinxi dev", + "dev:backend": "convex dev --tail-logs", + "build": "vinxi build", + "start": "vinxi start", + "lint": "prettier --check '**/*' --ignore-unknown && eslint --ext .ts,.tsx ./app", + "format": "prettier --write '**/*' --ignore-unknown", + "linkAll": "node scripts/link.js" }, "dependencies": { - "@auth/core": "0.37.0", + "@convex-dev/react-query": "0.0.0-alpha.8", + "@erquhart/convex-oss-stats": "^0.5.5", "@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", - "@netlify/vite-plugin-tanstack-start": "^1.0.2", + "@headlessui/react": "1.7.18", "@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-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.33.0", - "@sentry/tanstackstart-react": "^10.32.1", - "@sentry/vite-plugin": "^4.6.1", - "@stackblitz/sdk": "^1.11.0", + "@radix-ui/react-select": "^2.2.2", + "@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-table": "^8.21.3", + "@tanstack-dev/components": "^1.4.0", + "@tanstack/pacer": "^0.2.0", + "@tanstack/react-pacer": "^0.2.0", + "@tanstack/react-query": "^5.66.0", + "@tanstack/react-router": "1.109.2", + "@tanstack/react-router-with-query": "1.109.2", + "@tanstack/router-devtools": "1.109.2", + "@tanstack/start": "1.111.1", "@types/d3": "^7.4.3", - "@uploadthing/react": "^7.3.3", + "@typescript-eslint/parser": "^7.2.0", + "@vercel/analytics": "^1.2.2", + "@vercel/speed-insights": "^1.0.10", "@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", + "airtable": "^0.12.2", "algoliasearch": "^5.23.4", - "cheerio": "^1.1.2", + "axios": "^1.6.7", "cmdk": "^1.1.1", + "convex": "^1.17.2", "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", - "mermaid": "^11.11.0", - "postgres": "^3.4.7", - "posthog-node": "^5.20.0", - "react": "19.2.3", + "marked": "^13.0.2", + "marked-alert": "^2.0.1", + "marked-gfm-heading-id": "^4.0.0", + "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", - "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", - "vite-bundle-analyzer": "^1.2.1", + "tiny-invariant": "^1.3.3", + "vinxi": "^0.5.3", "vite-tsconfig-paths": "^5.0.1", - "xstate": "^5.25.0", - "zod": "^4.3.5", + "zod": "^3.23.8", "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/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", - "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" + "prettier": "^2.8.8", + "tailwindcss": "^3.4.1", + "typescript": "^5.6.3" }, "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/router-devtools": "file:../router/packages/router-devtools", + "@tanstack/start": "file:../router/packages/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 4e5892f8b..d5fce397b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,374 +4,242 @@ 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: .: dependencies: - '@auth/core': - specifier: 0.37.0 - version: 0.37.0 + '@convex-dev/react-query': + specifier: 0.0.0-alpha.8 + version: 0.0.0-alpha.8(@tanstack/react-query@5.66.9(react@19.0.0))(convex@1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) + '@erquhart/convex-oss-stats': + specifier: ^0.5.5 + version: 0.5.5(convex@1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(zod@3.24.1) '@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 - '@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: 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) '@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) - '@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.33.0 - version: 10.33.0 - '@sentry/tanstackstart-react': - specifier: ^10.32.1 - version: 10.32.1(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) + '@remix-run/node': + specifier: ^2.8.1 + version: 2.8.1(typescript@5.6.3) + '@sentry/react': + specifier: ^8.35.0 + version: 8.35.0(react@19.0.0) '@sentry/vite-plugin': - specifier: ^4.6.1 - version: 4.6.1 - '@stackblitz/sdk': - specifier: ^1.11.0 - version: 1.11.0 + 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) + version: 0.5.13(tailwindcss@3.4.1) + '@tanstack-dev/components': + specifier: ^1.4.0 + version: 1.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@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) + specifier: ^0.2.0 + version: 0.2.0 '@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.2.0 + version: 0.2.0(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.66.0 + version: 5.66.9(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) - '@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) - '@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)) - '@tanstack/react-table': - specifier: ^8.21.3 - version: 8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: 1.109.2 + version: 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-router-with-query': + specifier: 1.109.2 + version: 1.109.2(@tanstack/react-query@5.66.9(react@19.0.0))(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-devtools': + specifier: 1.109.2 + version: 1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/start': + specifier: 1.111.1 + version: 1.111.1(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(webpack@5.97.1)(yaml@2.7.1) '@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.6.3) + '@vercel/analytics': + specifier: ^1.2.2 + version: 1.2.2(react@19.0.0) + '@vercel/speed-insights': + specifier: ^1.0.10 + version: 1.0.10(react@19.0.0)(vue@3.5.13(typescript@5.6.3)) '@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 + airtable: + specifier: ^0.12.2 + version: 0.12.2 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 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.17.2 + version: 1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 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.26.0(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(typescript@5.6.3) 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 - 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 + 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) + 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(react@19.0.0)(zod@3.24.1) 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 - 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) - vite-bundle-analyzer: - specifier: ^1.2.1 - version: 1.2.1 + tiny-invariant: + specifier: ^1.3.3 + version: 1.3.3 + vinxi: + specifier: ^0.5.3 + version: 0.5.3(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.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.6.3) zod: - specifier: ^4.3.5 - version: 4.3.5 + specifier: ^3.23.8 + version: 3.24.1 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) + version: 0.8.2(typescript@5.6.3) '@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.6.3)) '@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/three': - specifier: ^0.182.0 - version: 0.182.0 autoprefixer: specifier: ^10.4.18 - version: 10.4.18(postcss@8.5.6) + version: 10.4.18(postcss@8.5.1) 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 postcss: specifier: ^8.4.35 - version: 8.5.6 + version: 8.5.1 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 + specifier: ^3.4.1 + version: 3.4.1 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: 5.6.3 packages: @@ -434,929 +302,1520 @@ packages: resolution: {integrity: sha512-jXGzGBRUS0oywQwnaCA6mMDJO7LoC3dYSLsyNfIqxDR4SNGLhtg3je0Y31lc24OA4nYyKAYgVLtjfrpcpsWShg==} engines: {node: '>= 14.0.0'} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/install-pkg@1.1.0': - resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - - '@antfu/utils@9.2.0': - resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} - '@apm-js-collab/code-transformer@0.8.2': - resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==} + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} + engines: {node: '>=6.9.0'} - '@apm-js-collab/tracing-hooks@0.3.1': - resolution: {integrity: sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==} + '@babel/core@7.26.9': + resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + engines: {node: '>=6.9.0'} - '@auth/core@0.37.0': - resolution: {integrity: sha512-LybAgfFC5dta3Mu3al0UbnzMGVBpZRqLMvvXupQOfETtPNlL7rXgTO13EVRTCdvPqMQrVYjODUDvgVfQM1M3Qg==} + '@babel/eslint-parser@7.23.10': + resolution: {integrity: sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: - '@simplewebauthn/browser': ^9.0.1 - '@simplewebauthn/server': ^9.0.2 - nodemailer: ^6.8.0 - peerDependenciesMeta: - '@simplewebauthn/browser': - optional: true - '@simplewebauthn/server': - optional: true - nodemailer: - optional: true + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 + + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + engines: {node: '>=6.9.0'} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + '@babel/helper-create-class-features-plugin@7.24.5': + resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/core@7.28.4': - resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + '@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/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@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/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.0': - resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + '@babel/helper-member-expression-to-functions@7.24.5': + resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + '@babel/helper-optimise-call-expression@7.22.5': + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + '@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-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-replace-supers@7.24.1': + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + '@babel/helper-simple-access@7.24.5': + resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-split-export-declaration@7.24.5': + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + '@babel/helper-wrap-function@7.22.20': + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.3': - resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/helpers@7.26.9': + resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} + engines: {node: '>=6.9.0'} - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} 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/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@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/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + '@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.26.0': + resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} 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.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + 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.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + 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.23.3': + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + 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 + + '@babel/plugin-transform-modules-umd@7.23.3': + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@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 + + '@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 + + '@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 + + '@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 + + '@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 + + '@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 + + '@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 + + '@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 + + '@babel/plugin-transform-parameters@7.23.3': + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@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 + + '@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 + + '@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 + + '@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 + + '@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 + + '@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 + + '@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 + + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@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/darwin-x64@0.18.20': - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + '@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 + + '@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 + + '@babel/plugin-transform-runtime@7.24.0': + resolution: {integrity: sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@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 + + '@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 + + '@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 + + '@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 + + '@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 + + '@babel/plugin-transform-typescript@7.24.5': + resolution: {integrity: sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@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 + + '@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 + + '@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 + + '@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 + + '@babel/preset-env@7.24.0': + resolution: {integrity: sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.23.3': + resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.23.3': + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + '@babel/runtime@7.24.5': + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + engines: {node: '>=6.9.0'} + + '@babel/standalone@7.26.4': + resolution: {integrity: sha512-SF+g7S2mhTT1b7CHyfNjDkPU1corxg4LPYsyP0x5KuCl+EbtBQHRLqr9N3q7e7+x7NQ5LYxQf8mJ2PmzebLr0A==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + + '@cloudflare/kv-asset-handler@0.3.4': + resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} + engines: {node: '>=16.13'} + + '@content-collections/core@0.8.2': + resolution: {integrity: sha512-62yVC3ne47YJ1KeCw5nk0H/G/xGBagcoWyMpVyTaCnDJhoIoTvmqBrsc+78Zk8s2Ssnb0Eo1Q4w3ZHwgL88pjg==} + peerDependencies: + typescript: ^5.0.2 + + '@content-collections/integrations@0.2.1': + resolution: {integrity: sha512-AyEcS2MmcOXSYt6vNmJsAiu6EBYjtNiwYGUVUmpG3llm8Gt8uiNrhIhlHyv3cuk+N8KJ2PWemLcMqtQJ+sW3bA==} + peerDependencies: + '@content-collections/core': 0.x + + '@content-collections/vite@0.2.4': + resolution: {integrity: sha512-3+n7pUnUMyjVasZLyxoUEU9VtJigWN/REliCyvAjsm0obv+6UpHAiRrkuLhn9luKAiHw4PRcFIJefBGz4i8Uzw==} + peerDependencies: + '@content-collections/core': ^0.x + vite: ^5 + + '@convex-dev/crons@0.1.5': + resolution: {integrity: sha512-wQvqtWgmttq2iFkU7ObuB2vVmdywwwfY9Fl1j4FISYKypycYHu3rodZ06dkUqBlurzkC/hlYWrHirNKsFsEEUg==} + peerDependencies: + convex: ~1.16.5 || ~1.17.0 + + '@convex-dev/react-query@0.0.0-alpha.8': + resolution: {integrity: sha512-Rv/q7/CplU75f7ckBd2vh+HoeeQ0tOrjwMl14Hk7D/03e55oUIU0TV5JYYzC79ZQyyAtoj7CmCo5ZxcmtKNv1Q==} + peerDependencies: + '@tanstack/react-query': ^5.0.0 + convex: ^1.17.0 + + '@deno/shim-deno-test@0.5.0': + resolution: {integrity: sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w==} + + '@deno/shim-deno@0.19.2': + resolution: {integrity: sha512-q3VTHl44ad8T2Tw2SpeAvghdGOjlnLPDNO2cpOxwMrBE/PVas6geWpbpIgrM+czOCH0yejp0yi8OaTuB+NU40Q==} + + '@erquhart/convex-oss-stats@0.5.5': + resolution: {integrity: sha512-vKGrqmMeqhIpLjAW5zgrITcBtlKbKXfl2XKE6ENwcKiAc9EnbCyClv6ker6JOXlvpNttd6szYxeGohxcztRoqA==} + peerDependencies: + convex: ~1.16.5 || ~1.17.0 || ~1.18.0 + react: ^17.0.2 || ^18.0.0 || ^19.0.0-0 + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.0': + resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.0': + resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.0': + resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.0': + resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.0': + resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.0': + resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} + engines: {node: '>=18'} + cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.10': - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.0': - resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.18.20': - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.10': - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + '@esbuild/freebsd-arm64@0.23.0': + resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.0': - resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.18.20': - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.10': - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + '@esbuild/freebsd-x64@0.23.0': + resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.0': - resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.18.20': - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.10': - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + '@esbuild/linux-arm64@0.23.0': + resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.0': - resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.18.20': - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.10': - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + '@esbuild/linux-arm@0.23.0': + resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.0': - resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.18.20': - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.10': - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + '@esbuild/linux-ia32@0.23.0': + resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.0': - resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + '@esbuild/linux-ia32@0.25.3': + resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.18.20': - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.10': - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + '@esbuild/linux-loong64@0.23.0': + resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.0': - resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.18.20': - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + '@esbuild/linux-loong64@0.25.3': + resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.10': - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + '@esbuild/linux-mips64el@0.23.0': + resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.0': - resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + '@esbuild/linux-mips64el@0.25.3': + resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.18.20': - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.10': - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + '@esbuild/linux-ppc64@0.23.0': + resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.0': - resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + '@esbuild/linux-ppc64@0.25.3': + resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.18.20': - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.10': - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + '@esbuild/linux-riscv64@0.23.0': + resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.0': - resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + '@esbuild/linux-riscv64@0.25.3': + resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.18.20': - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.10': - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + '@esbuild/linux-s390x@0.23.0': + resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.0': - resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + '@esbuild/linux-s390x@0.25.3': + resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.18.20': - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.10': - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + '@esbuild/linux-x64@0.23.0': + resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.0': - resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.10': - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + '@esbuild/linux-x64@0.25.3': + resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] + cpu: [x64] + os: [linux] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.0': - resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + '@esbuild/netbsd-arm64@0.25.3': + resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.18.20': - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.10': - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + '@esbuild/netbsd-x64@0.23.0': + resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.0': - resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + '@esbuild/netbsd-x64@0.25.3': + resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.10': - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + '@esbuild/openbsd-arm64@0.23.0': + resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.0': - resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.18.20': - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + '@esbuild/openbsd-arm64@0.25.3': + resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.10': - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + '@esbuild/openbsd-x64@0.23.0': + resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.0': - resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.10': - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + '@esbuild/openbsd-x64@0.25.3': + resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] + cpu: [x64] + os: [openbsd] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - '@esbuild/openharmony-arm64@0.27.0': - resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + '@esbuild/sunos-x64@0.23.0': + resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.18.20': - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.10': - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.0': - resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + '@esbuild/sunos-x64@0.25.3': + resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.18.20': - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.10': - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + '@esbuild/win32-arm64@0.23.0': + resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.0': - resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + '@esbuild/win32-arm64@0.25.3': + resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.18.20': - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.10': - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + '@esbuild/win32-ia32@0.23.0': + resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.0': - resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + '@esbuild/win32-ia32@0.25.3': + resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.18.20': - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.10': - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + '@esbuild/win32-x64@0.23.0': + resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.0': - resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + '@esbuild/win32-x64@0.25.3': + resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@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.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + '@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/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} - - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@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} - - '@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} - - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@fastify/accept-negotiator@2.0.1': - resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@fastify/busboy@3.2.0': - resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@floating-ui/core@1.6.9': resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} @@ -1379,185 +1838,28 @@ 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 - - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 - '@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==} engines: {node: '>=12.22'} - '@humanwhocodes/momoa@2.0.4': - 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'} - - '@iarna/toml@2.2.5': - resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - - '@iconify/utils@3.0.1': - resolution: {integrity: sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==} - - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} - engines: {node: '>=18'} - - '@img/sharp-darwin-arm64@0.34.4': - resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - - '@img/sharp-darwin-x64@0.34.4': - resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-darwin-arm64@1.2.3': - resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} - cpu: [arm64] - os: [darwin] - - '@img/sharp-libvips-darwin-x64@1.2.3': - resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-linux-arm64@1.2.3': - resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linux-arm@1.2.3': - resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} - cpu: [arm] - os: [linux] - - '@img/sharp-libvips-linux-ppc64@1.2.3': - resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} - cpu: [ppc64] - os: [linux] - - '@img/sharp-libvips-linux-s390x@1.2.3': - resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} - cpu: [s390x] - os: [linux] - - '@img/sharp-libvips-linux-x64@1.2.3': - resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} - cpu: [x64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': - resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-x64@1.2.3': - resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} - cpu: [x64] - os: [linux] - - '@img/sharp-linux-arm64@0.34.4': - resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linux-arm@0.34.4': - resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - - '@img/sharp-linux-ppc64@0.34.4': - resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ppc64] - os: [linux] - - '@img/sharp-linux-s390x@0.34.4': - resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - - '@img/sharp-linux-x64@0.34.4': - resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-linuxmusl-arm64@0.34.4': - resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linuxmusl-x64@0.34.4': - resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-wasm32@0.34.4': - resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - - '@img/sharp-win32-arm64@0.34.4': - resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [win32] - - '@img/sharp-win32-ia32@0.34.4': - resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - - '@img/sharp-win32-x64@0.34.4': - resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + deprecated: Use @eslint/object-schema instead - '@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} + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -1567,331 +1869,59 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - - '@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' - - '@jsonjoy.com/base64@17.65.0': - resolution: {integrity: sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/buffers@1.2.1': - resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/buffers@17.65.0': - resolution: {integrity: sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@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' + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} - '@jsonjoy.com/json-pointer@17.65.0': - resolution: {integrity: sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jsonjoy.com/util@1.9.0': - resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jsonjoy.com/util@17.65.0': - resolution: {integrity: sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@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==} + '@lit-labs/ssr-dom-shim@1.2.1': + resolution: {integrity: sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==} - '@mermaid-js/parser@0.6.2': - resolution: {integrity: sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==} + '@lit/reactive-element@2.0.4': + resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} - '@modelcontextprotocol/sdk@1.25.2': - resolution: {integrity: sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==} + '@mapbox/node-pre-gyp@2.0.0-rc.0': + resolution: {integrity: sha512-nhSMNprz3WmeRvd8iUs5JqkKr0Ncx46JtPxM3AhXes84XpSJfmIwKeWXRpsr53S7kqPkQfPhzrMFUxSNb23qSA==} 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'} - - '@netlify/binary-info@1.0.0': - resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} - - '@netlify/blobs@10.0.11': - resolution: {integrity: sha512-/pa7eD2gxkhJ6aUIJULrRu3tvAaimy+sA6vHUuGRMvncjOuRpeatXLHxuzdn8DyK1CZCjN3E33oXsdEpoqG7SA==} - engines: {node: ^14.16.0 || >=16.0.0} - - '@netlify/cache@3.1.1': - resolution: {integrity: sha512-n8DU/lH2vTIBM137bGlRmyZsWq3mGU3J8R2fnecD9CDxBx0jNsb8u0WEYC9E3tavPKyYmW1BvIGNNtWHn0R3Lg==} - engines: {node: '>=20.6.1'} - - '@netlify/config@23.2.0': - resolution: {integrity: sha512-zlI792/efPUY1XKtBML2OJBgKMyfNQIeGEYibH8SqeDxPjNuCy0qELE0U9Sc6+Ss34XryPBUPdV60tYhSoe6lw==} - engines: {node: '>=18.14.0'} hasBin: true - '@netlify/dev-utils@4.2.0': - resolution: {integrity: sha512-P/uLJ5IKB4DhUOd6Q4Mpk7N0YKrnijUhAL3C05dEftNi3U3xJB98YekYfsL3G6GkS3L35pKGMx+vKJRwUHpP1Q==} - engines: {node: ^18.14.0 || >=20} - - '@netlify/dev@4.5.12': - resolution: {integrity: sha512-Kbcu4EG1sTH9VxxaZraumu/8YJ2EkIe92+6ju+n1KYQ7P3qz2wughPr6Vtss06P9S1g70wu1mNxvvqj4IAlJlw==} - engines: {node: '>=20.6.1'} - - '@netlify/edge-bundler@14.5.6': - resolution: {integrity: sha512-00uOZIOFsoWKa04osBvQ763oAFZDtAGSIjlywU0TS/lZTQCVEs6k39yJz8v4UEhXvK5MCThiFv+tnlpTNJn3fQ==} - engines: {node: '>=18.14.0'} - - '@netlify/edge-functions-bootstrap@2.16.0': - resolution: {integrity: sha512-v8QQihSbBHj3JxtJsHoepXALpNumD9M7egHoc8z62FYl5it34dWczkaJoFFopEyhiBVKi4K/n0ZYpdzwfujd6g==} - - '@netlify/edge-functions@2.18.2': - resolution: {integrity: sha512-DwkQIwiVO+2XU3zt5X96g3VEYI2mVtIdoFuia0TZLcWO8mzqceqNljL4xpCRREzZl9FT+HdwDF+YpYjZ+IRRTA==} - engines: {node: '>=18.0.0'} - - '@netlify/functions@4.2.7': - 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'} - - '@netlify/headers@2.0.12': - resolution: {integrity: sha512-smDSAKvPEYufdMhZvNvb1/D00EL5QDleEHa7N6+CXKrG81WVzPrpWtCL67UP8qgewv0fDnLPal9XLL46Jvsa9A==} - engines: {node: '>=20.6.1'} - - '@netlify/images@1.2.8': - 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'} - - '@netlify/redirect-parser@15.0.3': - resolution: {integrity: sha512-/HB3fcRRNgf6O/pbLn4EYNDHrU2kiadMMnazg8/OjvQK2S9i4y61vQcrICvDxYKUKQdgeEaABUuaCNAJFnfD9w==} - engines: {node: '>=18.14.0'} - - '@netlify/redirects@3.0.13': - resolution: {integrity: sha512-pRseix34XmP+PoUGgsHYqsyBxXvSF8plLkt+D9s/fv+MBEcLIGxZLHLNBHOmNIP+WX2SIusPOxwcL3DBVjbZkw==} - engines: {node: '>=20.6.1'} - - '@netlify/runtime-utils@2.1.0': - resolution: {integrity: sha512-z1h+wjB7IVYUsFZsuIYyNxiw5WWuylseY+eXaUDHBxNeLTlqziy+lz03QkR67CUR4Y790xGIhaHV00aOR2KAtw==} - engines: {node: ^18.14.0 || >=20} + '@netlify/functions@2.8.2': + resolution: {integrity: sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==} + engines: {node: '>=14.0.0'} - '@netlify/runtime@4.0.16': - resolution: {integrity: sha512-8itGQs4yGByyFWUBxMUDJGgutAFChPlMos2oJr9DbQWsTZjbn9QnZ0rddh156upya4znqq6XnSJ7vc5Y7xqzEg==} - engines: {node: '>=20.6.1'} + '@netlify/node-cookies@0.1.0': + resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} + engines: {node: ^14.16.0 || >=16.0.0} - '@netlify/serverless-functions-api@2.6.0': - resolution: {integrity: sha512-/m4HO0MNb7nBsHWKQ7JTeTZ3jDZpfQxs0LOn9h/+aPzGcdYW7DwKNudGq8NXYY5NPtRE3C+8qtr3xLfN9VOU6g==} + '@netlify/serverless-functions-api@1.26.1': + resolution: {integrity: sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==} engines: {node: '>=18.0.0'} - '@netlify/static@3.0.11': - resolution: {integrity: sha512-+fAIBbZLQB6dwyX8JTUc7xvwO/+goaUmEIcHYpycwJwrphL2ZpcNAOVFq00alwpw0Szrf2LCE5bnom6/EOgbBQ==} - engines: {node: '>=20.6.1'} - - '@netlify/types@2.0.3': - 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} - peerDependencies: - '@tanstack/react-start': '>=1.132.0' - '@tanstack/solid-start': '>=1.132.0' - vite: '>=7.0.0' - peerDependenciesMeta: - '@tanstack/react-start': - optional: true - '@tanstack/solid-start': - optional: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@netlify/vite-plugin@2.6.1': - resolution: {integrity: sha512-KhXWcwTzEDX+7lWyEs0TRwr4nIjlMs1/82l05czH9xG2K4iHSjE6R5qHFEdWvIh6W1He3t05h30UMf2QuHCqVw==} - engines: {node: ^20.6.1 || >=22} - peerDependencies: - vite: ^5 || ^6 || ^7 - - '@netlify/zip-it-and-ship-it@14.1.8': - resolution: {integrity: sha512-APPNgGUAb1kSe4e9KxhRAeQIPGx8EAfwZ3S61eGyZXXGXgjnKmC2Ho7jsFnLsElbt8Ailyzmi/wAjh0NHZjGjA==} - engines: {node: '>=18.14.0'} - hasBin: true + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1915,348 +1945,297 @@ 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.1': + resolution: {integrity: sha512-fk8xrCSPTJGpyBdBNI+DcZ224dm0aApv4vi6X7/zTmANXlegKV2Td+dJ+fd7APPaPN7R+xttUsj2Fm+AFDSfMQ==} engines: {node: '>= 18'} - '@octokit/graphql@7.0.2': - resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} + '@octokit/auth-app@7.1.3': + resolution: {integrity: sha512-GZdkOp2kZTIy5dG9oXqvzUAZiPvDx4C/lMlN6yQjtG9d/+hYa7W8WXTJoOrXE8UdfL9A/sZMl206dmtkl9lwVQ==} + engines: {node: '>= 18'} + + '@octokit/auth-oauth-app@8.1.1': + resolution: {integrity: sha512-5UtmxXAvU2wfcHIPPDWzVSAWXVJzG3NWsxb7zCFplCWEmMCArSZV0UQu5jw5goLQXbFyOr5onzEH37UJB3zQQg==} + engines: {node: '>= 18'} + + '@octokit/auth-oauth-device@7.1.1': + resolution: {integrity: sha512-HWl8lYueHonuyjrKKIup/1tiy0xcmQCdq5ikvMO1YwkNNkxb6DXfrPjrMYItNLyCP/o2H87WuijuE+SlBTT8eg==} engines: {node: '>= 18'} - '@octokit/openapi-types@19.0.2': - resolution: {integrity: sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==} + '@octokit/auth-oauth-user@5.1.1': + resolution: {integrity: sha512-rRkMz0ErOppdvEfnemHJXgZ9vTPhBuC6yASeFaB7I2yLMd7QpjfrL1mnvRPlyKo+M6eeLxrKanXJ9Qte29SRsw==} + engines: {node: '>= 18'} - '@octokit/request-error@5.0.1': - resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} engines: {node: '>= 18'} - '@octokit/request@8.1.4': - resolution: {integrity: sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==} + '@octokit/auth-token@5.1.1': + resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} engines: {node: '>= 18'} - '@octokit/types@12.1.1': - resolution: {integrity: sha512-qnJTldJ1NyGT5MTsCg/Zi+y2IFHZ1Jo5+njNCjJ9FcainV7LjuHgmB697kA0g4MjZeDAJsM3B45iqCVsCLVFZg==} + '@octokit/auth-unauthenticated@6.1.0': + resolution: {integrity: sha512-zPSmfrUAcspZH/lOFQnVnvjQZsIvmfApQH6GzJrkIunDooU1Su2qt2FfMTSVPRp7WLTQyC20Kd55lF+mIYaohQ==} + engines: {node: '>= 18'} - '@oozcitak/dom@2.0.2': - resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==} - engines: {node: '>=20.0'} + '@octokit/core@5.0.1': + resolution: {integrity: sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==} + engines: {node: '>= 18'} - '@oozcitak/infra@2.0.2': - resolution: {integrity: sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==} - engines: {node: '>=20.0'} + '@octokit/core@6.1.2': + resolution: {integrity: sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==} + engines: {node: '>= 18'} - '@oozcitak/url@3.0.0': - resolution: {integrity: sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==} - engines: {node: '>=20.0'} + '@octokit/endpoint@10.1.2': + resolution: {integrity: sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==} + engines: {node: '>= 18'} - '@oozcitak/util@10.0.0': - resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} - engines: {node: '>=20.0'} + '@octokit/endpoint@9.0.2': + resolution: {integrity: sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==} + engines: {node: '>= 18'} - '@opentelemetry/api-logs@0.208.0': - resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==} - engines: {node: '>=8.0.0'} + '@octokit/graphql-schema@15.25.0': + resolution: {integrity: sha512-aqz9WECtdxVWSqgKroUu9uu+CRt5KnfErWs0dBPKlTdrreAeWzS5NRu22ZVcGdPP7s3XDg2Gnf5iyoZPCRZWmQ==} - '@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.3.0': - resolution: {integrity: sha512-hGcsT0qDP7Il1L+qT3JFpiGl1dCjF794Bb4yCRCYdr7XC0NwHtOF3ngF86Gk6TUnsakbyQsDQ0E/S4CU0F4d4g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@octokit/graphql@8.1.2': + resolution: {integrity: sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw==} + engines: {node: '>= 18'} - '@opentelemetry/core@2.2.0': - resolution: {integrity: sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@octokit/oauth-app@7.1.4': + resolution: {integrity: sha512-Au4zSGsWOZtShLxVUXcZ9TZJVQjpEK/OW2L1SWLE030QVYaZ+69TP4vHBdXakZUifvOELD1VBYEY6eprPcY2Mg==} + engines: {node: '>= 18'} - '@opentelemetry/core@2.3.0': - resolution: {integrity: sha512-PcmxJQzs31cfD0R2dE91YGFcLxOSN4Bxz7gez5UwSUjCai8BwH/GI5HchfVshHkWdTkUs0qcaPJgVHKXUp7I3A==} - 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.55.0': - resolution: {integrity: sha512-5ULoU8p+tWcQw5PDYZn8rySptGSLZHNX/7srqo2TioPnAAcvTy6sQFQXsNPrAnyRRtYGMetXVyZUy5OaX1+IfA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/oauth-methods@5.1.3': + resolution: {integrity: sha512-M+bDBi5H8FnH0xhCTg0m9hvcnppdDnxUqbZyOkxlLblKpLAR+eT2nbDPvJDp0eLrvJWA1I8OX0KHf/sBMQARRA==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-connect@0.52.0': - resolution: {integrity: sha512-GXPxfNB5szMbV3I9b7kNWSmQBoBzw7MT0ui6iU/p+NIzVx3a06Ri2cdQO7tG9EKb4aKSLmfX9Cw5cKxXqX6Ohg==} - 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.26.0': - resolution: {integrity: sha512-P2BgnFfTOarZ5OKPmYfbXfDFjQ4P9WkQ1Jji7yH5/WwB6Wm/knynAoA1rxbjWcDlYupFkyT0M1j6XLzDzy0aCA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/openapi-types@22.2.0': + resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} - '@opentelemetry/instrumentation-express@0.57.0': - resolution: {integrity: sha512-HAdx/o58+8tSR5iW+ru4PHnEejyKrAy9fYFhlEI81o10nYxrGahnMAHWiSjhDC7UQSY3I4gjcPgSKQz4rm/asg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/openapi-webhooks-types@8.5.1': + resolution: {integrity: sha512-i3h1b5zpGSB39ffBbYdSGuAd0NhBAwPyA3QV3LYi/lx4lsbZiu7u2UHgXVUR6EpvOI8REOuVh1DZTRfHoJDvuQ==} - '@opentelemetry/instrumentation-fs@0.28.0': - resolution: {integrity: sha512-FFvg8fq53RRXVBRHZViP+EMxMR03tqzEGpuq55lHNbVPyFklSVfQBN50syPhK5UYYwaStx0eyCtHtbRreusc5g==} - 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.52.0': - resolution: {integrity: sha512-ISkNcv5CM2IwvsMVL31Tl61/p2Zm2I2NAsYq5SSBgOsOndT0TjnptjufYVScCnD5ZLD1tpl4T3GEYULLYOdIdQ==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-paginate-rest@11.3.6': + resolution: {integrity: sha512-zcvqqf/+TicbTCa/Z+3w4eBJcAxCFymtc0UAIsR3dEVoNilWld4oXdscQ3laXamTszUZdusw97K8+DrbFiOwjw==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': '>=6' - '@opentelemetry/instrumentation-graphql@0.56.0': - resolution: {integrity: sha512-IPvNk8AFoVzTAM0Z399t34VDmGDgwT6rIqCUug8P9oAGerl2/PEIYMPOl/rerPGu+q8gSWdmbFSjgg7PDVRd3Q==} - 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.55.0': - resolution: {integrity: sha512-prqAkRf9e4eEpy4G3UcR32prKE8NLNlA90TdEU1UsghOTg0jUvs40Jz8LQWFEs5NbLbXHYGzB4CYVkCI8eWEVQ==} - 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.208.0': - resolution: {integrity: sha512-rhmK46DRWEbQQB77RxmVXGyjs6783crXCnFjYQj+4tDH/Kpv9Rbg3h2kaNyp5Vz2emF1f9HOQQvZoHzwMWOFZQ==} - 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.56.0': - resolution: {integrity: sha512-XSWeqsd3rKSsT3WBz/JKJDcZD4QYElZEa0xVdX8f9dh4h4QgXhKRLorVsVkK3uXFbC2sZKAS2Ds+YolGwD83Dg==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-rest-endpoint-methods@13.2.6': + resolution: {integrity: sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': '>=6' - '@opentelemetry/instrumentation-kafkajs@0.18.0': - resolution: {integrity: sha512-KCL/1HnZN5zkUMgPyOxfGjLjbXjpd4odDToy+7c+UsthIzVLFf99LnfIBE8YSSrYE4+uS7OwJMhvhg3tWjqMBg==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-retry@7.1.2': + resolution: {integrity: sha512-XOWnPpH2kJ5VTwozsxGurw+svB2e61aWlmk5EVIYZPwFK5F9h4cyPyj9CIKRyMXMHSwpIsI3mPOdpMmrRhe7UQ==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': '>=6' - '@opentelemetry/instrumentation-knex@0.53.0': - resolution: {integrity: sha512-xngn5cH2mVXFmiT1XfQ1aHqq1m4xb5wvU6j9lSgLlihJ1bXzsO543cpDwjrZm2nMrlpddBf55w8+bfS4qDh60g==} - engines: {node: ^18.19.0 || >=20.6.0} + '@octokit/plugin-throttling@9.3.2': + resolution: {integrity: sha512-FqpvcTpIWFpMMwIeSoypoJXysSAQ3R+ALJhXXSG1HTP3YZOIeLmcNcimKaXxTcws+Sh6yoRl13SJ5r8sXc1Fhw==} + engines: {node: '>= 18'} peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/core': ^6.0.0 - '@opentelemetry/instrumentation-koa@0.57.0': - resolution: {integrity: sha512-3JS8PU/D5E3q295mwloU2v7c7/m+DyCqdu62BIzWt+3u9utjxC9QS7v6WmUNuoDN3RM+Q+D1Gpj13ERo+m7CGg==} - 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.53.0': - resolution: {integrity: sha512-LDwWz5cPkWWr0HBIuZUjslyvijljTwmwiItpMTHujaULZCxcYE9eU44Qf/pbVC8TulT0IhZi+RoGvHKXvNhysw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/request-error@6.1.6': + resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-mongodb@0.61.0': - resolution: {integrity: sha512-OV3i2DSoY5M/pmLk+68xr5RvkHU8DRB3DKMzYJdwDdcxeLs62tLbkmRyqJZsYf3Ht7j11rq35pHOWLuLzXL7pQ==} - 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.55.0': - resolution: {integrity: sha512-5afj0HfF6aM6Nlqgu6/PPHFk8QBfIe3+zF9FGpX76jWPS0/dujoEYn82/XcLSaW5LPUDW8sni+YeK0vTBNri+w==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/request@9.1.4': + resolution: {integrity: sha512-tMbOwGm6wDII6vygP3wUVqFTw3Aoo0FnVQyhihh8vVq12uO3P+vQZeo2CKMpWtPSogpACD0yyZAlVlQnjW71DA==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-mysql2@0.55.0': - resolution: {integrity: sha512-0cs8whQG55aIi20gnK8B7cco6OK6N+enNhW0p5284MvqJ5EPi+I1YlWsWXgzv/V2HFirEejkvKiI4Iw21OqDWg==} - 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.54.0': - resolution: {integrity: sha512-bqC1YhnwAeWmRzy1/Xf9cDqxNG2d/JDkaxnqF5N6iJKN1eVWI+vg7NfDkf52/Nggp3tl1jcC++ptC61BD6738A==} - 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.61.0': - resolution: {integrity: sha512-UeV7KeTnRSM7ECHa3YscoklhUtTQPs6V6qYpG283AB7xpnPGCUCUfECFT9jFg6/iZOQTt3FHkB1wGTJCNZEvPw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/types@13.6.2': + resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==} - '@opentelemetry/instrumentation-redis@0.57.0': - resolution: {integrity: sha512-bCxTHQFXzrU3eU1LZnOZQ3s5LURxQPDlU3/upBzlWY77qOI1GZuGofazj3jtzjctMJeBEJhNwIFEgRPBX1kp/Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/webhooks-methods@5.1.0': + resolution: {integrity: sha512-yFZa3UH11VIxYnnoOYCVoJ3q4ChuSOk2IVBBQ0O3xtKX4x9bmKb/1t+Mxixv2iUhzMdOl1qeWJqEhouXXzB3rQ==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-tedious@0.27.0': - resolution: {integrity: sha512-jRtyUJNZppPBjPae4ZjIQ2eqJbcRaRfJkr0lQLHFmOU/no5A6e9s1OHLd5XZyZoBJ/ymngZitanyRRA5cniseA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 + '@octokit/webhooks@13.4.1': + resolution: {integrity: sha512-I5YPUtfWidh+OzyrlDahJsUpkpGK0kCTmDRbuqGmlCUzOtxdEkX3R4d6Cd08ijQYwkVXQJanPdbKuZBeV2NMaA==} + engines: {node: '>= 18'} - '@opentelemetry/instrumentation-undici@0.19.0': - resolution: {integrity: sha512-Pst/RhR61A2OoZQZkn6OLpdVpXp6qn3Y92wXa6umfJe9rV640r4bc6SWvw4pPN6DiQqPu2c8gnSSZPDtC6JlpQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.7.0 + '@orama/cuid2@2.2.3': + resolution: {integrity: sha512-Lcak3chblMejdlSHgYU2lS2cdOhDpU6vkfIJH4m+YKvqQyLqs1bB8+w6NT1MG5bO12NUK2GFc34Mn2xshMIQ1g==} - '@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 + '@orama/highlight@0.1.8': + resolution: {integrity: sha512-w3TvtWUKYlf/NoujoyEs38nJRi1lkwxdOXntXDYB9cfHzx+s+iPrps70YwFRRJu9TcHW8ffz503b0E6aAfsuvg==} - '@opentelemetry/redis-common@0.38.2': - resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} - engines: {node: ^18.19.0 || >=20.6.0} + '@orama/orama@3.0.3': + resolution: {integrity: sha512-M1LPYzAh7cZgujrrU2MCqVaVsYMfTVvskBcgc2Oc78ppTtlr9rXfZxKC8VPguIf78jxOeJUOspG/Lueo4vAZBQ==} + engines: {node: '>= 16.0.0'} - '@opentelemetry/resources@2.3.0': - resolution: {integrity: sha512-shlr2l5g+87J8wqYlsLyaUsgKVRO7RtX70Ckd5CtDOWtImZgaUDmf4Z2ozuSKQLM2wPDR0TE/3bPVBNJtRm/cQ==} - engines: {node: ^18.19.0 || >=20.6.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.3.0': - resolution: {integrity: sha512-B0TQ2e9h0ETjpI+eGmCz8Ojb+lnYms0SE3jFwEKrN/PK4aSVHU28AAmnOoBmfub+I3jfgPwvDJgomBA5a7QehQ==} - 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' - - '@opentelemetry/semantic-conventions@1.38.0': - resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} - engines: {node: '>=14'} + '@orama/orama': 3.0.3 + '@oramacloud/client': ^2.1.1 - '@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 + '@orama/wc-components@0.1.23': + resolution: {integrity: sha512-O4jWSC6XeGS+07l2bkBGPGGXq1A6wG/2nPbBi5WyVhLGY4oceq3/c5l4ogHOF9G4OB+217mKN4VU3nmRosFJtQ==} - '@panva/hkdf@1.2.1': - resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} + '@oramacloud/client@2.1.4': + resolution: {integrity: sha512-uNPFs4wq/iOPbggCwTkVNbIr64Vfd7ZS/h+cricXVnzXWocjDTfJ3wLL4lr0qiSu41g8z+eCAGBqJ30RO2O4AA==} - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + '@parcel/watcher-android-arm64@2.4.1': + resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + '@parcel/watcher-darwin-arm64@2.4.1': + resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + '@parcel/watcher-darwin-x64@2.4.1': + resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + '@parcel/watcher-freebsd-x64@2.4.1': + resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + '@parcel/watcher-linux-arm-glibc@2.4.1': + resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + '@parcel/watcher-linux-arm64-glibc@2.4.1': + resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + '@parcel/watcher-linux-arm64-musl@2.4.1': + resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + '@parcel/watcher-linux-x64-glibc@2.4.1': + resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + '@parcel/watcher-linux-x64-musl@2.4.1': + resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-wasm@2.5.1': - resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==} + '@parcel/watcher-wasm@2.3.0': + resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} + engines: {node: '>= 10.0.0'} + bundledDependencies: + - napi-wasm + + '@parcel/watcher-wasm@2.4.1': + resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} engines: {node: '>= 10.0.0'} bundledDependencies: - napi-wasm - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + '@parcel/watcher-win32-arm64@2.4.1': + resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + '@parcel/watcher-win32-ia32@2.4.1': + resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + '@parcel/watcher-win32-x64@2.4.1': + resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + '@parcel/watcher@2.4.1': + resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} engines: {node: '>= 10.0.0'} + '@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@6.19.0': - resolution: {integrity: sha512-QcuYy25pkXM8BJ37wVFBO7Zh34nyRV1GOb2n3lPkkbRYfl4hWl3PTcImP41P0KrzVXfa/45p6eVCos27x3exIg==} - 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==} - '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - '@radix-ui/react-arrow@1.1.4': resolution: {integrity: sha512-qz+fxrqgNxG0dYew5l7qR3c7wdgRu1XVUHGnGYX7rg5HM4p9SWaRmJwfgR3J0SgyUKayLmzQIun+N6rWRgiRKw==} peerDependencies: @@ -2270,19 +2249,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: @@ -2296,19 +2262,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} - 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-compose-refs@1.1.2': resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: @@ -2327,8 +2280,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': '*' @@ -2349,19 +2302,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.11': - resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} - 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-dismissable-layer@1.1.7': resolution: {integrity: sha512-j5+WBUdhccJsmH5/H0K6RncjDtoALSEr6jbkaZu+bjw6hOPOhHycr6vEUujl+HBK8kjUfWcoCJXxP6e4lUlMZw==} peerDependencies: @@ -2397,15 +2337,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: @@ -2419,19 +2350,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: @@ -2467,19 +2385,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: @@ -2493,19 +2398,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.9': - resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} - 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-presence@1.1.4': resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} peerDependencies: @@ -2519,19 +2411,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} - 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-primitive@2.1.0': resolution: {integrity: sha512-/J/FhLdK0zVcILOwt5g+dH4KnkonCtkVJsa2G6JmvbbtZfBEI1gMsO3QMjseL4F/SwfAMt1Vc/0XKYKq+xJ1sw==} peerDependencies: @@ -2545,19 +2424,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} - 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-roving-focus@1.1.7': resolution: {integrity: sha512-C6oAg451/fQT3EGbWHbCQjYTtbyjNO1uzQgMzwyivcHT3GKNEmu1q3UuREhN+HzHAVtv3ivMVK08QlC+PkYw9Q==} peerDependencies: @@ -2571,26 +2437,8 @@ packages: '@types/react-dom': optional: true - '@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 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-toast@1.2.15': - resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} + '@radix-ui/react-select@2.2.2': + resolution: {integrity: sha512-HjkVHtBkuq+r3zUAZ/CvNWUGKPfuicGDbgtZgiQuFmNcV5F+Tgy24ep2nsAW2nFgvhGPJVqeBZa6KyVN0EyrBA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2602,18 +2450,14 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.2.8': - resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + '@radix-ui/react-slot@1.2.0': + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} 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-use-callback-ref@1.1.1': resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} @@ -2660,6 +2504,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: @@ -2678,8 +2531,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.2.3': - resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + '@radix-ui/react-visually-hidden@1.2.0': + resolution: {integrity: sha512-rQj0aAWOpCdCMRbI6pLQm8r7S2BM3YhTa0SzOYD55k+hJA8oo9J+H+9wLM9oMlZWOX/wJWPTzfDfmZkf7LvCfg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2694,47 +2547,119 @@ 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==} + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/config@0.17.1': + resolution: {integrity: sha512-CEmvaJuG7pm2ylQg53emPmtgm4nW2nxBgwXzbVEHpGas/lGnMyN8Zlkgiz6rPw0unASg6VW3wlz27SOL5XFHYQ==} + + '@redocly/openapi-core@1.26.0': + resolution: {integrity: sha512-8Ofu6WpBp7eoLmf1qQ4+T0W4LRr8es+4Drw/RJG+acPXmaT2TmHk2B2v+3+1R9GqSIj6kx3N7JmQkxAPCnvDLw==} + engines: {node: '>=14.19.0', npm: '>=7.0.0'} + + '@remix-run/node@2.8.1': + resolution: {integrity: sha512-ddCwBVlfLvRxTQJHPcaM1lhfMjsFYG3EGmYpWJIWnnzDX5EbX9pUNHBWisMuH1eA0c7pbw0PbW0UtCttKYx2qg==} + engines: {node: '>=18.0.0'} + peerDependencies: + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + '@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: + 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==} + + '@rollup/plugin-alias@5.1.1': + resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-commonjs@28.0.1': + resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.3.0': + resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} + engines: {node: '>=14.0.0'} peerDependencies: - '@react-three/fiber': ^9.0.0 - react: ^19 - react-dom: ^19 - three: '>=0.159' + rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: - react-dom: + rollup: 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' + '@rollup/plugin-replace@6.0.1': + resolution: {integrity: sha512-2sPh9b73dj5IxuMmDAsQWVFT7mR+yoHweBaXG2W/R8vQ+IWZlnaI7BR7J6EguVQUp1hd8Z7XuozpDjEKQAAC2Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: - expo: - optional: true - expo-asset: - optional: true - expo-file-system: - optional: true - expo-gl: - optional: true - react-dom: - optional: true - react-native: + rollup: optional: true - '@rolldown/pluginutils@1.0.0-beta.40': - resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2742,271 +2667,198 @@ 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.32.1': + resolution: {integrity: sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + '@rollup/rollup-android-arm64@4.32.1': + resolution: {integrity: sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + '@rollup/rollup-darwin-arm64@4.32.1': + resolution: {integrity: sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + '@rollup/rollup-darwin-x64@4.32.1': + resolution: {integrity: sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + '@rollup/rollup-freebsd-arm64@4.32.1': + resolution: {integrity: sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + '@rollup/rollup-freebsd-x64@4.32.1': + resolution: {integrity: sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==} 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.32.1': + resolution: {integrity: sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==} 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.32.1': + resolution: {integrity: sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==} 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.32.1': + resolution: {integrity: sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==} 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.32.1': + resolution: {integrity: sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': + resolution: {integrity: sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': + resolution: {integrity: sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + '@rollup/rollup-linux-riscv64-gnu@4.32.1': + resolution: {integrity: sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==} 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.32.1': + resolution: {integrity: sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==} 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.32.1': + resolution: {integrity: sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==} 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.32.1': + resolution: {integrity: sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} - 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.32.1': + resolution: {integrity: sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==} 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.32.1': + resolution: {integrity: sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + '@rollup/rollup-win32-x64-msvc@4.32.1': + resolution: {integrity: sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==} 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.32.1': - resolution: {integrity: sha512-sjLLep1es3rTkbtAdTtdpc/a6g7v7bK5YJiZJsUigoJ4NTiFeMI5uIDCxbH/tjJ1q23YE1LzVn7T96I+qBRjHA==} - engines: {node: '>=18'} + '@sentry-internal/browser-utils@8.35.0': + resolution: {integrity: sha512-uj9nwERm7HIS13f/Q52hF/NUS5Al8Ma6jkgpfYGeppYvU0uSjPkwMogtqoJQNbOoZg973tV8qUScbcWY616wNA==} + engines: {node: '>=14.18'} - '@sentry-internal/feedback@10.32.1': - resolution: {integrity: sha512-O24G8jxbfBY1RE/v2qFikPJISVMOrd/zk8FKyl+oUVYdOxU2Ucjk2cR3EQruBFlc7irnL6rT3GPfRZ/kBgLkmQ==} - engines: {node: '>=18'} + '@sentry-internal/feedback@8.35.0': + resolution: {integrity: sha512-7bjSaUhL0bDArozre6EiIhhdWdT/1AWNWBC1Wc5w1IxEi5xF7nvF/FfvjQYrONQzZAI3HRxc45J2qhLUzHBmoQ==} + engines: {node: '>=14.18'} - '@sentry-internal/replay-canvas@10.32.1': - resolution: {integrity: sha512-/XGTzWNWVc+B691fIVekV2KeoHFEDA5KftrLFAhEAW7uWOwk/xy3aQX4TYM0LcPm2PBKvoumlAD+Sd/aXk63oA==} - engines: {node: '>=18'} + '@sentry-internal/replay-canvas@8.35.0': + resolution: {integrity: sha512-TUrH6Piv19kvHIiRyIuapLdnuwxk/Un/l1WDCQfq7mK9p1Pac0FkQ7Uufjp6zY3lyhDDZQ8qvCS4ioCMibCwQg==} + engines: {node: '>=14.18'} - '@sentry-internal/replay@10.32.1': - resolution: {integrity: sha512-KKmLUgIaLRM0VjrMA1ByQTawZyRDYSkG2evvEOVpEtR9F0sumidAQdi7UY71QEKE1RYe/Jcp/3WoaqsMh8tbnQ==} - engines: {node: '>=18'} + '@sentry-internal/replay@8.35.0': + resolution: {integrity: sha512-3wkW03vXYMyWtTLxl9yrtkV+qxbnKFgfASdoGWhXzfLjycgT6o4/04eb3Gn71q9aXqRwH17ISVQbVswnRqMcmA==} + engines: {node: '>=14.18'} - '@sentry/babel-plugin-component-annotate@4.6.1': - resolution: {integrity: sha512-aSIk0vgBqv7PhX6/Eov+vlI4puCE0bRXzUG5HdCsHBpAfeMkI8Hva6kSOusnzKqs8bf04hU7s3Sf0XxGTj/1AA==} + '@sentry/babel-plugin-component-annotate@2.22.6': + resolution: {integrity: sha512-V2g1Y1I5eSe7dtUVMBvAJr8BaLRr4CLrgNgtPaZyMT4Rnps82SrZ5zqmEkLXPumlXhLUWR6qzoMNN2u+RXVXfQ==} engines: {node: '>= 14'} - '@sentry/browser@10.32.1': - resolution: {integrity: sha512-NPNCXTZ05ZGTFyJdKNqjykpFm+urem0ebosILQiw3C4BxNVNGH4vfYZexyl6prRhmg91oB6GjVNiVDuJiap1gg==} - engines: {node: '>=18'} + '@sentry/browser@8.35.0': + resolution: {integrity: sha512-WHfI+NoZzpCsmIvtr6ChOe7yWPLQyMchPnVhY3Z4UeC70bkYNdKcoj/4XZbX3m0D8+71JAsm0mJ9s9OC3Ue6MQ==} + engines: {node: '>=14.18'} - '@sentry/bundler-plugin-core@4.6.1': - resolution: {integrity: sha512-WPeRbnMXm927m4Kr69NTArPfI+p5/34FHftdCRI3LFPMyhZDzz6J3wLy4hzaVUgmMf10eLzmq2HGEMvpQmdynA==} + '@sentry/bundler-plugin-core@2.22.6': + resolution: {integrity: sha512-1esQdgSUCww9XAntO4pr7uAM5cfGhLsgTK9MEwAKNfvpMYJi9NUTYa3A7AZmdA8V6107Lo4OD7peIPrDRbaDCg==} engines: {node: '>= 14'} - '@sentry/cli-darwin@2.58.4': - resolution: {integrity: sha512-kbTD+P4X8O+nsNwPxCywtj3q22ecyRHWff98rdcmtRrvwz8CKi/T4Jxn/fnn2i4VEchy08OWBuZAqaA5Kh2hRQ==} + '@sentry/cli-darwin@2.38.1': + resolution: {integrity: sha512-IHuxm072aSTAvwuHtLg065cF00Pxm2wprnrRr2lkyWp8nLOoO7DmumWZ4pjHvhB8yZXsAbM/PSxLRBoDIRDPzQ==} engines: {node: '>=10'} os: [darwin] - '@sentry/cli-linux-arm64@2.58.4': - resolution: {integrity: sha512-0g0KwsOozkLtzN8/0+oMZoOuQ0o7W6O+hx+ydVU1bktaMGKEJLMAWxOQNjsh1TcBbNIXVOKM/I8l0ROhaAb8Ig==} + '@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.4': - resolution: {integrity: sha512-rdQ8beTwnN48hv7iV7e7ZKucPec5NJkRdrrycMJMZlzGBPi56LqnclgsHySJ6Kfq506A2MNuQnKGaf/sBC9REA==} + '@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.4': - resolution: {integrity: sha512-NseoIQAFtkziHyjZNPTu1Gm1opeQHt7Wm1LbLrGWVIRvUOzlslO9/8i6wETUZ6TjlQxBVRgd3Q0lRBG2A8rFYA==} + '@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.4': - resolution: {integrity: sha512-d3Arz+OO/wJYTqCYlSN3Ktm+W8rynQ/IMtSZLK8nu0ryh5mJOh+9XlXY6oDXw4YlsM8qCRrNquR8iEI1Y/IH+Q==} + '@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.4': - resolution: {integrity: sha512-bqYrF43+jXdDBh0f8HIJU3tbvlOFtGyRjHB8AoRuMQv9TEDUfENZyCelhdjA+KwDKYl48R1Yasb4EHNzsoO83w==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] + os: [linux, freebsd] - '@sentry/cli-win32-i686@2.58.4': - resolution: {integrity: sha512-3triFD6jyvhVcXOmGyttf+deKZcC1tURdhnmDUIBkiDPJKGT/N5xa4qAtHJlAB/h8L9jgYih9bvJnvvFVM7yug==} + '@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.4': - resolution: {integrity: sha512-cSzN4PjM1RsCZ4pxMjI0VI7yNCkxiJ5jmWncyiwHXGiXrV1eXYdQ3n1LhUYLZ91CafyprR0OhDcE+RVZ26Qb5w==} + '@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.4': - resolution: {integrity: sha512-ArDrpuS8JtDYEvwGleVE+FgR+qHaOp77IgdGSacz6SZy6Lv90uX0Nu4UrHCQJz8/xwIcNxSqnN22lq0dH4IqTg==} + '@sentry/cli@2.38.1': + resolution: {integrity: sha512-XFO04nP7cn0tboMQ4ALR81QRF/6xoWAFzNld7Io6jHbaFzihqewjxAqy7pSvVPaieepUjqe7m/Ippt00kKOACg==} engines: {node: '>= 10'} hasBin: true - '@sentry/core@10.32.1': - resolution: {integrity: sha512-PH2ldpSJlhqsMj2vCTyU0BI2Fx1oIDhm7Izo5xFALvjVCS0gmlqHt1udu6YlKn8BtpGH6bGzssvv5APrk+OdPQ==} - engines: {node: '>=18'} - - '@sentry/core@10.33.0': - resolution: {integrity: sha512-ehH1VSUclIHZKEZVdv+klofsFIh8FFzqA6AAV23RtLepptzA8wqQzUGraEuSN25sYcNmYJ0jti5U0Ys+WZv5Dw==} - engines: {node: '>=18'} - - '@sentry/node-core@10.32.1': - resolution: {integrity: sha512-w56rxdBanBKc832zuwnE+zNzUQ19fPxfHEtOhK8JGPu3aSwQYcIxwz9z52lOx3HN7k/8Fj5694qlT3x/PokhRw==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/instrumentation': '>=0.57.1 <1' - '@opentelemetry/resources': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/semantic-conventions': ^1.37.0 - - '@sentry/node-core@10.33.0': - resolution: {integrity: sha512-73J1yLMdtjyadtcsrZ5VBYIyWrJ5gHh5dRsJlfm6XMD3ZFHQQ9Fwd6mwnSY+X+VLJaNq7RtoNECij6LLqE4R0g==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/instrumentation': '>=0.57.1 <1' - '@opentelemetry/resources': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/semantic-conventions': ^1.37.0 - - '@sentry/node@10.32.1': - resolution: {integrity: sha512-oxlybzt8QW0lx/QaEj1DcvZDRXkgouewFelu/10dyUwv5So3YvipfvWInda+yMLmn25OggbloDQ0gyScA2jU3g==} - engines: {node: '>=18'} - - '@sentry/node@10.33.0': - resolution: {integrity: sha512-HZ7U0igIXs8nHSeh0YAe9C3eE/fjkHOprctQHwoYpRrZelsKO8NsvZU0K/1+knFr36vFj7jtt1QlF/UjCQZD+Q==} - engines: {node: '>=18'} - - '@sentry/opentelemetry@10.32.1': - resolution: {integrity: sha512-YLssSz5Y+qPvufrh2cDaTXDoXU8aceOhB+YTjT8/DLF6SOj7Tzen52aAcjNaifawaxEsLCC8O+B+A2iA+BllvA==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/semantic-conventions': ^1.37.0 - - '@sentry/opentelemetry@10.33.0': - resolution: {integrity: sha512-v/6mAYLxtfcKLCw6Ktk46T6fWEQBVWB9Ah81axr8OvuIomK71jkv1zb0v7D8ot0ESesJ3JF6I/aKhfxpyLInSQ==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 || ^2.2.0 - '@opentelemetry/semantic-conventions': ^1.37.0 + '@sentry/core@8.35.0': + resolution: {integrity: sha512-Ci0Nmtw5ETWLqQJGY4dyF+iWh7PWKy6k303fCEoEmqj2czDrKJCp7yHBNV0XYbo00prj2ZTbCr6I7albYiyONA==} + engines: {node: '>=14.18'} - '@sentry/react@10.32.1': - resolution: {integrity: sha512-/tX0HeACbAmVP57x8txTrGk/U3fa9pDBaoAtlOrnPv5VS/aC5SGkehXWeTGSAa+ahlOWwp3IF8ILVXRiOoG/Vg==} - 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/tanstackstart-react@10.32.1': - resolution: {integrity: sha512-zbzMcF4X4NLbGQwJ1/nO4vSVY+m42sMhPUEgJDDr6Yo+4oaT5ejs0+K7t6S08LyDbLKUBPQuFtsroPCpfKPxlQ==} - engines: {node: '>=18'} + '@sentry/types@8.35.0': + resolution: {integrity: sha512-AVEZjb16MlYPifiDDvJ19dPQyDn0jlrtC1PHs6ZKO+Rzyz+2EX2BRdszvanqArldexPoU1p5Bn2w81XZNXThBA==} + engines: {node: '>=14.18'} - '@sentry/vite-plugin@4.6.1': - resolution: {integrity: sha512-Qvys1y3o8/bfL3ikrHnJS9zxdjt0z3POshdBl3967UcflrTqBmnGNkcVk53SlmtJWIfh85fgmrLvGYwZ2YiqNg==} + '@sentry/utils@8.35.0': + resolution: {integrity: sha512-MdMb6+uXjqND7qIPWhulubpSeHzia6HtxeJa8jYI09OCvIcmNGPydv/Gx/LZBwosfMHrLdTWcFH7Y7aCxrq7cg==} + engines: {node: '>=14.18'} + + '@sentry/vite-plugin@2.22.6': + resolution: {integrity: sha512-zIieP1VLWQb3wUjFJlwOAoaaJygJhXeUoGd0e/Ha2RLb2eW2S+4gjf6y6NqyY71tZ74LYVZKg/4prB6FAZSMXQ==} engines: {node: '>= 14'} '@shikijs/core@1.10.3': @@ -3015,251 +2867,126 @@ 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==} + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} - '@so-ric/colorspace@1.1.6': - resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} - - '@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-beta.4': - resolution: {integrity: sha512-d3IxtzLo7P1oZ8s8YNvxzBUXRXojSut8pbPrTYtzsc5sn4+53jVqbk66pQerSZbZSJZQux6LkclB/+8IDordHg==} - - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - - '@tailwindcss/node@4.1.11': - resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} - - '@tailwindcss/oxide-android-arm64@4.1.11': - resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.1.11': - resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.1.11': - resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.1.11': - resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': - resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': - resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-musl@4.1.11': - resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-gnu@4.1.11': - resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-musl@4.1.11': - resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-wasm32-wasi@4.1.11': - resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': - resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.1.11': - resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] + '@stencil/core@4.20.0': + resolution: {integrity: sha512-WPrTHFngvN081RY+dJPneKQLwnOFD60OMCOQGmmSHfCW0f4ujPMzzhwWU1gcSwXPWXz5O+8cBiiCaxAbJU7kAg==} + engines: {node: '>=16.0.0', npm: '>=7.10.0'} + hasBin: true - '@tailwindcss/oxide@4.1.11': - resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} - engines: {node: '>= 10'} + '@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/typography@0.5.13': resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - '@tailwindcss/vite@4.1.11': - resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} + '@tanstack-dev/components@1.4.0': + resolution: {integrity: sha512-d+8NEzqfQpSRUVN8gcP9qBT/M6fOMerGux8pCV4Hmq2mHr+C9tJ3MwFFnP9xXh9LwPzXqKEU/2b/eDSMyunAUw==} peerDependencies: - vite: ^5.2.0 || ^6 || ^7 - - '@tanstack/create@0.49.1': - resolution: {integrity: sha512-Y6MlKg7TLXvKLPkr6roLDKSSqzZKrcPRCg5TlucKX7bsIsG3KIGLTZAhF7jLx4a1zJt/25g92U/JhSm7TFnbrg==} + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 - '@tanstack/devtools-event-client@0.3.5': - resolution: {integrity: sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw==} - engines: {node: '>=18'} - - '@tanstack/history@1.154.14': - resolution: {integrity: sha512-xyIfof8eHBuub1CkBnbKNKQXeRZC4dClhmzePHVOEel4G7lk/dW+TQ16da7CFdeNLv6u6Owf5VoBQxoo6DFTSA==} + '@tanstack/directive-functions-plugin@1.106.0': + resolution: {integrity: sha512-eAK+8tGl+ZZimROdnuHoAc1MVKvmQWh7WTQbh531607NQAuD/7TgbTAiSBfTJYW8qeGovrSp/qq+dnhjqTy3xQ==} engines: {node: '>=12'} - '@tanstack/hotkeys@0.0.2': - resolution: {integrity: sha512-HUki67sfc6z62iIY+ito7HV4+cFmsHlwLOWdFN8Aomgw7HJH8zHtBSksVw9Gh7qSapKi29fWa3DViPMzUawN2Q==} - engines: {node: '>=18'} + '@tanstack/history@1.99.13': + resolution: {integrity: sha512-JMd7USmnp8zV8BRGIjALqzPxazvKtQ7PGXQC7n39HpbqdsmfV2ePCzieO84IvN+mwsTrXErpbjI4BfKCa+ZNCg==} + engines: {node: '>=12'} - '@tanstack/pacer@0.16.4': - resolution: {integrity: sha512-dqd6p1JK6iucOhJSOA1/VCvT46kZDoem/l/xcYtQpG4Ygxl8xzSW69oMk0bTSh+cAvFXDCrXn3wlS7Otir/fsA==} + '@tanstack/pacer@0.2.0': + resolution: {integrity: sha512-fUJs3NpSwtAL/tfq8kuYdgvm9HbbJvHsOG6aHY2dFDfff0NBFNwjvyGreWZZRPs2zgoIbr4nOk+rRV7aQgmf+A==} engines: {node: '>=18'} - '@tanstack/query-core@5.90.12': - resolution: {integrity: sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==} + '@tanstack/query-core@5.66.4': + resolution: {integrity: sha512-skM/gzNX4shPkqmdTCSoHtJAPMTtmIJNS0hE+xwTTUVYwezArCT34NMermABmBVUg5Ls5aiUXEDXfqwR1oVkcA==} - '@tanstack/react-hotkeys@0.0.2': - resolution: {integrity: sha512-LaW28h7omiIWgyw61gEU2k2X4YlesB8Gptvw71si77cXbg7RphD+Qu+q/mA84ai4x2miLA6vvYuZTvIVcbz9tw==} - engines: {node: '>=18'} + '@tanstack/react-cross-context@1.99.0': + resolution: {integrity: sha512-PJuVaijr3FTV8HJcmfzGcQ4+ZlNUwJ0B51MNlawClJ4pBOerJrW/iEKPIg0glPVx3KQ4WHMv8cEGmvN+xYtLJw==} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-pacer@0.17.4': - resolution: {integrity: sha512-VdHuN+FkdKwPMD2uuO0qb04CBMOci68CeciQCTASA5Tmts9uxiSHIJEM+ABh/s4pSEdMKM/GI6sFWDNwwCf6yA==} + '@tanstack/react-pacer@0.2.0': + resolution: {integrity: sha512-KU5GtjkKSeNdYCilen5Dc+Pu/6BPQbsQshKrUUjrg7URyJIiGBCz6ZZFre1QjDz/aeUeqUJWMWSm+2Dsh64v+w==} 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.66.9': + resolution: {integrity: sha512-NRI02PHJsP5y2gAuWKP+awamTIBFBSKMnO6UVzi03GTclmHHHInH5UzVgzi5tpu4+FmGfsdT7Umqegobtsp23A==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.157.16': - resolution: {integrity: sha512-g6ekyzumfLBX6T5e+Vu2r37Z2CFJKrWRFqIy3vZ6A3x7OcuPV8uXNjyrLSiT/IsGTiF8YzwI4nWJa4fyd7NlCw==} - engines: {node: '>=12'} - peerDependencies: - '@tanstack/react-router': ^1.157.16 - '@tanstack/router-core': ^1.157.16 - 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.109.2': + resolution: {integrity: sha512-TpWILt/QEHcwV+Ri3ZL95DPJ57/I+hFIa5rc0bZNvh72fzRmnU3FHRCu26y0sblptTmiPAsO1iDn80/C2XL/fA==} 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' 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.109.2': + resolution: {integrity: sha512-cJZGIvYIrd5lcwbwoB2vxJe379TQZIM5/RAzlDSrvV5KAPlkmK3cqZHZ8zPrsZIBASEyERM8Od+jM9s3qDTXkA==} 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==} - 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==} - 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==} - 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.0': + resolution: {integrity: sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/react-table@8.21.3': - resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} - engines: {node: '>=12'} + '@tanstack/react-virtual@3.1.3': + resolution: {integrity: sha512-YCzcbF/Ws/uZ0q3Z6fagH+JVhx4JLvbSflgldMgLsuvB8aXjZLLb3HvrEVxY480F9wFlBiXlvQxOyXb5ENPrNA==} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + 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.157.16': - resolution: {integrity: sha512-eJuVgM7KZYTTr4uPorbUzUflmljMVcaX2g6VvhITLnHmg9SBx9RAgtQ1HmT+72mzyIbRSlQ1q0fY/m+of/fosA==} + '@tanstack/router-core@1.108.0': + resolution: {integrity: sha512-lo6Nqdp8gxWNZ8YZ6UhiQgR0CgcAiMaw1cxgKK7M4u3nFFwqW7Hzycl5ik1l3NRh5/pQVK+OVzlKok5rrrHxSg==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.157.16': - resolution: {integrity: sha512-XBJTs/kMZYK6J2zhbGucHNuypwDB1t2vi8K5To+V6dUnLGBEyfQTf01fegiF4rpL1yXgomdGnP6aTiOFgldbVg==} + '@tanstack/router-devtools@1.109.2': + resolution: {integrity: sha512-jz3o5srcbFSUTNJHvBlDGcAW+Q2YETbJAiCiSZ7sjaNhNd3odPwGw0JLc4Dh1mkL0Vp94L7eJdIBfmNMBuOR9w==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.157.16 + '@tanstack/react-router': ^1.109.2 csstype: ^3.0.10 + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' peerDependenciesMeta: csstype: optional: true - '@tanstack/router-generator@1.157.16': - resolution: {integrity: sha512-Ae2M00VTFjjED7glSCi/mMLENRzhEym6NgjoOx7UVNbCC/rLU/5ASDe5VIlDa8QLEqP5Pj088Gi51gjmRuICvQ==} + '@tanstack/router-generator@1.109.2': + resolution: {integrity: sha512-CCEH19Vl+ukMkP9gOZPg85U7rMwwlWxJ4hRMPgU7DIyMlzuvv7l6earvXzuGCKLN0m20TO0QuqjJfCFIKkP2RA==} engines: {node: '>=12'} + peerDependencies: + '@tanstack/react-router': ^1.109.2 + peerDependenciesMeta: + '@tanstack/react-router': + optional: true - '@tanstack/router-plugin@1.157.16': - resolution: {integrity: sha512-YQg7L06xyCJAYyrEJNZGAnDL8oChILU+G/eSDIwEfcWn5iLk+47x1Gcdxr82++47PWmOPhzuTo8edDQXWs7kAA==} + '@tanstack/router-plugin@1.109.2': + resolution: {integrity: sha512-Tap6WQIE6elQkTSJpnBxUZDMNGkaqjEPXiotM2VVpD6qy4euZmYdUV1rAgtD2w8AM18XecIC4tBprNLchLYG3A==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.157.16 - vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' - vite-plugin-solid: ^2.11.10 + '@tanstack/react-router': ^1.109.2 + vite: '>=5.0.0 || >=6.0.0' + vite-plugin-solid: ^2.11.2 webpack: '>=5.92.0' peerDependenciesMeta: '@rsbuild/core': @@ -3273,52 +3000,97 @@ packages: webpack: optional: true - '@tanstack/router-ssr-query-core@1.157.16': - resolution: {integrity: sha512-YuwNG4jdtn+r90yyti8yP27IKaVoflWmRezqnj0gyJxpRauBkK7MVLvWSNbJadnk88b9H+rdtNOF2k3owGaong==} + '@tanstack/router-utils@1.102.2': + resolution: {integrity: sha512-Uwl2nbrxhCzviaHHBLNPhSC/OMpZLdOTxTJndUSsXTzWUP4IoQcVmngaIsxi9iriE3ArC1VXuanUAkfGmimNOQ==} + engines: {node: '>=12'} + + '@tanstack/server-functions-plugin@1.106.0': + resolution: {integrity: sha512-uFqiICV0b9t7jluQLroUt9/2PayEKu4hWTS5nezWsW8kNaK0Pw4avdLK+8mYjYuJLBhuQrQZ/mSEMqdJYgYv0Q==} + engines: {node: '>=12'} + + '@tanstack/start-api-routes@1.110.3': + resolution: {integrity: sha512-8Re8h8v3R/S4bdQjODtQl/3hmiQC/5cchpZZboyrEbsjlA2KY9fNTxa6dBNqUL97yivoGV8iyJwlHv7WNCobww==} + engines: {node: '>=12'} + + '@tanstack/start-client@1.109.2': + resolution: {integrity: sha512-GC5v6yICP6CgP9tbdQMhRnzOK6sQFnUdyWJhzpNO1EqFAWygus+staGzKYyUNs8dX/zVrqCMe1J26lIaGzt2Pg==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/start-config@1.109.2': + resolution: {integrity: sha512-ZULr3DUaI4aM9aKUo3rnMUUfo3D7wqFvOdTWiKUt5PsG1+whlV3TTx9d9Ie2PBtOXDVqRw4j61hYdDr4riDHQw==} engines: {node: '>=12'} peerDependencies: - '@tanstack/query-core': '>=5.90.0' - '@tanstack/router-core': '>=1.127.0' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: ^6.0.0 + + '@tanstack/start-plugin@1.107.0': + resolution: {integrity: sha512-g7GI2tGDRVjOKv9cjBHu9DeEWzunoytYbcw1JtsWBolbjmSAz7MYtbV5BKqyP7ebPmBY8WhLvC+X1asb66vfEg==} + engines: {node: '>=12'} - '@tanstack/router-utils@1.154.7': - resolution: {integrity: sha512-61bGx32tMKuEpVRseu2sh1KQe8CfB7793Mch/kyQt0EP3tD7X0sXmimCl3truRiDGUtI0CaSoQV1NPjAII1RBA==} + '@tanstack/start-router-manifest@1.111.0': + resolution: {integrity: sha512-xgoL9hGw8vNB+6VeboC+pgThO2g2FBvFS3dDSFpalrjO9+Ag33bNFakmRgHvgi/JRGXZVOB59+DEMDvnohdRcw==} 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-server-functions-client@1.111.1': + resolution: {integrity: sha512-qAbn8zrO8shCIXgNAAfRqJgrYgwQB0by38issuBOzmtwDQYamtjbj4z7IbS75pCXw34Nr9tWz8jj677UJ/Kuqw==} + engines: {node: '>=12'} - '@tanstack/start-fn-stubs@1.154.7': - resolution: {integrity: sha512-D69B78L6pcFN5X5PHaydv7CScQcKLzJeEYqs7jpuyyqGQHSUIZUjS955j+Sir8cHhuDIovCe2LmsYHeZfWf3dQ==} - engines: {node: '>=22.12.0'} + '@tanstack/start-server-functions-fetcher@1.109.2': + resolution: {integrity: sha512-YO2vzRDvUdPAfyltP/XQxJ7TTdzPV//qRfanCcNlDeJBYr3ZKHM3P0A8Fy0nyoBgQCT8EWVZDlpqoxg7tmiHUg==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/start-plugin-core@1.157.16': - resolution: {integrity: sha512-VmRXuvP5flryUAHeBM4Xb06n544qLtyA2cwmlQLRTUYtQiQEAdd9CvCGy8CPAly3f7eeXKqC7aX0v3MwWkLR8w==} - engines: {node: '>=22.12.0'} + '@tanstack/start-server-functions-handler@1.109.2': + resolution: {integrity: sha512-GPHZSiuUGJVfEXj125QAGendEB7nUplbs9H1V/Dlj95SwJg8WYL2Qjq+TB0bCnWlL5kJOMqE9yJcD/r8iusE7g==} + engines: {node: '>=12'} peerDependencies: - vite: '>=7.0.0' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/start-server-core@1.157.16': - resolution: {integrity: sha512-PEltFleYfiqz6+KcmzNXxc1lXgT7VDNKP6G6i1TirdHBDbRJ9CIY+ASLPlhrRwqwA2PL9PpFjXZl8u5bH/+Q9A==} - engines: {node: '>=22.12.0'} + '@tanstack/start-server-functions-server@1.110.1': + resolution: {integrity: sha512-Y6VVcaPDTuIU8cRLLCOWXGkdYSIAVcmilCjWwm+RMGN+/seKw4Ct1SQvT2HnEf4sGq/iDPyRrfz5/I5Mm5BXtw==} + engines: {node: '>=12'} - '@tanstack/start-storage-context@1.157.16': - resolution: {integrity: sha512-56izE0oihAw2YRwYUEds2H+uO5dyT2CahXCgWX62+l+FHou09M9mSep68n1lBKPdphC2ZU3cPV7wnvgeraJWHg==} - engines: {node: '>=22.12.0'} + '@tanstack/start-server-functions-ssr@1.110.2': + resolution: {integrity: sha512-jvnCIZfRIgUNL9VCPAuCrEHWYOS5ySQa/06H/F0M7auhqzM1pc+tht/jt8nS2JtuCVWlLydXWzdI5zpXIDVbBQ==} + engines: {node: '>=12'} - '@tanstack/store@0.8.0': - resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} + '@tanstack/start-server@1.109.2': + resolution: {integrity: sha512-cnLUQhqVUy9i5qw+2jD2HO7w3qEOJaGXo5rTrZEGoRKX5z8vqfUkyBYVflJmlEQZw0mzTM+2+jdceqqlmYC/Dg==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/table-core@8.21.3': - resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} + '@tanstack/start@1.111.1': + resolution: {integrity: sha512-+bJTtlGFFlNhojPDI381cao2cEh3mV3m9kNIA4lYDgrTOX8behRETtdkuS/F2EjhuuVZEA4a4xx9WK5Z8Z00Jg==} engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: ^6.0.0 + + '@tanstack/store@0.7.0': + resolution: {integrity: sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==} + + '@tanstack/virtual-core@3.1.3': + resolution: {integrity: sha512-Y5B4EYyv1j9V8LzeAoOVeTg0LI7Fo5InYKgAjkY1Pu9GjtUwX/EKxNcU7ng3sKr99WEf+bPTcktAeybyMOYo+g==} - '@tanstack/virtual-file-routes@1.154.7': - resolution: {integrity: sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg==} + '@tanstack/virtual-file-routes@1.99.0': + resolution: {integrity: sha512-XvX8bfdo4CYiCW+ItVdBfCorh3PwQFqYqd7ll+XKWiWOJpqUGIG7VlziVavARZpUySiY2VBlHadiUYS7jhgjRg==} engines: {node: '>=12'} - '@tweenjs/tween.js@23.1.3': - resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} + '@types/aws-lambda@8.10.146': + resolution: {integrity: sha512-3BaDXYTh0e6UCJYL/jwV/3+GRslSc08toAiZSmleYtkAUyV5rtvdPYxrG/88uqvTuT6sb27WE9OS90ZNTIuQ0g==} + + '@types/babel__code-frame@7.0.6': + resolution: {integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3332,11 +3104,8 @@ 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/braces@3.0.4': + resolution: {integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==} '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -3434,23 +3203,17 @@ 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/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - '@types/express-serve-static-core@5.1.1': - resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/express@5.0.6': - resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} @@ -3458,198 +3221,211 @@ packages: '@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/http-proxy@1.17.15': + resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} '@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/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - '@types/node@22.19.3': - resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} + '@types/micromatch@4.0.9': + resolution: {integrity: sha512-7V+8ncr22h4UoYRLnLXSpTxjQrNUXtWHGeMPRJt1nULXI57G9bIcpyrHlmrQ7QK24EyyuXvYcSSWAM8GA9nqCg==} - '@types/node@24.3.0': - resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + '@types/node@14.18.63': + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/node@22.12.0': + resolution: {integrity: sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==} - '@types/offscreencanvas@2019.7.3': - resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + '@types/normalize-package-data@2.4.3': + resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/pg-pool@2.0.6': - resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} - - '@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==} - '@types/retry@0.12.2': - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - - '@types/send@1.2.1': - resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@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/tedious@4.0.14': - resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} - - '@types/three@0.182.0': - resolution: {integrity: sha512-WByN9V3Sbwbe2OkWuSGyoqQO8Du6yhYaXtXLoA5FkKTUJorZ+yOHBZ35zUUPQXlAKABZmbYp5oAqpA4RBjtJ/Q==} - - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} '@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/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - '@types/webxr@0.5.24': - resolution: {integrity: sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==} - - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@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': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@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/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: - '@typescript-eslint/parser': ^8.48.1 - 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/parser@8.48.1': - resolution: {integrity: sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==} - 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: - 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: '*' + peerDependenciesMeta: + typescript: + optional: true - '@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@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/scope-manager@8.48.1': - resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} - 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/tsconfig-utils@8.48.1': - resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@7.2.0': + resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} + engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/type-utils@8.48.1': - resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} - 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/types@8.48.1': - resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/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} + + '@typescript-eslint/types@7.2.0': + resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@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: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@typescript-eslint/typescript-estree@8.48.1': - resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@7.2.0': + resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@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/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + 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/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/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} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@uploadthing/mime-types@0.3.6': - resolution: {integrity: sha512-t3tTzgwFV9+1D7lNDYc7Lr7kBwotHaX0ZsvoCGe7xGnXKo9z0jG2Sjl/msll12FeoLj77nyhsxevXyGpQDBvLg==} + '@vercel/analytics@1.2.2': + resolution: {integrity: sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A==} + peerDependencies: + next: '>= 13' + react: ^18 || ^19 + peerDependenciesMeta: + next: + optional: true + react: + optional: true + + '@vercel/nft@0.27.9': + resolution: {integrity: sha512-pTs7OchHQmSYJPR0puVQCWw/NqzuvAtnAhBurz21lq4Y4KqWoMpYKqmikkETG5r1bHNCM/hQMZ5JiRr9mhOkyg==} + engines: {node: '>=16'} + hasBin: true - '@uploadthing/react@7.3.3': - resolution: {integrity: sha512-GhKbK42jL2Qs7OhRd2Z6j0zTLsnJTRJH31nR7RZnUYVoRh2aS/NabMAnHBNqfunIAGXVaA717Pvzq7vtxuPTmQ==} + '@vercel/speed-insights@1.0.10': + resolution: {integrity: sha512-4uzdKB0RW6Ff2FkzshzjZ+RlJfLPxgm/00i0XXgxfMPhwnnsk92YgtqsxT9OcPLdJUyVU1DqFlSWWjIQMPkh0g==} peerDependencies: - next: '*' - react: ^17.0.2 || ^18.0.0 || ^19.0.0 - uploadthing: ^7.2.0 + '@sveltejs/kit': ^1 || ^2 + next: '>= 13' + react: ^18 || ^19 + svelte: ^4 + vue: ^3 + vue-router: ^4 peerDependenciesMeta: + '@sveltejs/kit': + optional: true next: optional: true + react: + optional: true + svelte: + optional: true + vue: + optional: true + vue-router: + optional: true - '@uploadthing/shared@7.1.10': - resolution: {integrity: sha512-R/XSA3SfCVnLIzFpXyGaKPfbwlYlWYSTuGjTFHuJhdAomuBuhopAHLh2Ois5fJibAHzi02uP1QCKbgTAdmArqg==} - - '@use-gesture/core@10.3.1': - resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} - - '@use-gesture/react@10.3.1': - resolution: {integrity: sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==} - peerDependencies: - react: '>= 16.8.0' - - '@vercel/nft@0.29.4': - resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} - engines: {node: '>=18'} + '@vinxi/listhen@1.5.6': + resolution: {integrity: sha512-WSN1z931BtasZJlgPp704zJFnQFRg7yzSjkm3MzAWQYe4uXFXlFr1hc5Ac2zae5/HDOz5x1/zDM5Cb54vTCnWw==} hasBin: true '@visx/group@2.17.0': @@ -3673,70 +3449,109 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@vue/compiler-core@3.5.22': - resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} - '@vue/compiler-dom@3.5.22': - resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-sfc@3.5.22': - resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} - '@vue/compiler-ssr@3.5.22': - resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} - '@vue/shared@3.5.22': - resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} - '@webcontainer/api@1.6.1': - resolution: {integrity: sha512-2RS2KiIw32BY1Icf6M1DvqSmcon9XICZCDgS29QJb2NmF12ZY2V5Ia+949hMKB3Wno+P/Y8W+sPP59PZeXSELg==} + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} - '@webgpu/types@0.1.68': - resolution: {integrity: sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA==} + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} - '@whatwg-node/disposablestack@0.0.6': - resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} - engines: {node: '>=18.0.0'} + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 - '@whatwg-node/fetch@0.10.11': - resolution: {integrity: sha512-eR8SYtf9Nem1Tnl0IWrY33qJ5wCtIWlt3Fs3c6V4aAaTFLtkEQErXu3SSZg/XCHrj9hXSJ8/8t+CdMk5Qec/ZA==} - engines: {node: '>=18.0.0'} + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - '@whatwg-node/node-fetch@0.8.1': - resolution: {integrity: sha512-cQmQEo7IsI0EPX9VrwygXVzrVlX43Jb7/DBZSmpnC7xH4xkyOnn/HykHpTaQk7TUs7zh59A5uTGqx3p2Ouzffw==} - engines: {node: '>=18.0.0'} + '@web3-storage/multipart-parser@1.0.0': + resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} - '@whatwg-node/promise-helpers@1.3.2': - resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} - engines: {node: '>=16.0.0'} + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - '@whatwg-node/server@0.10.13': - resolution: {integrity: sha512-Otmxo+0mp8az3B48pLI1I4msNOXPIoP7TLm6h5wOEQmynqHt8oP9nR6NJUeJk6iI5OtFpQtkbJFwfGkmplvc3Q==} - engines: {node: '>=18.0.0'} + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - '@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 + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@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==} - abbrev@3.0.1: - resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} - engines: {node: ^18.17.0 || >=20.5.0} + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} abort-controller@3.0.0: 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'} + abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} @@ -3748,8 +3563,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -3757,23 +3572,32 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} - ajv-errors@3.0.0: - resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} - peerDependencies: - ajv: ^8.0.1 + airtable@0.12.2: + resolution: {integrity: sha512-HS3VytUBTKj8A0vPl7DDr5p/w3IOGv6RXL0fv7eczOWAtj9Xe8ri4TAiZRXoOyo+Z/COADCj+oARFenbxhmkIg==} + engines: {node: '>=8.0.0'} - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -3789,12 +3613,19 @@ packages: resolution: {integrity: sha512-QzAKFHl3fm53s44VHrTdEo0TkpL3XVUYQpnZy1r6/EHvMAyIg+O4hwprzlsNmcCHTNyVcF2S13DAUn7XhkC6qg==} engines: {node: '>= 14.0.0'} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -3805,14 +3636,17 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - ansis@4.1.0: - resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + ansis@3.16.0: + resolution: {integrity: sha512-sU7d/tfZiYrsIAXbdL/CNZld5bCkruzwT5KmqmadCJYxuLxHAOBjidxD5+iLmN/6xEfjcQq1l7OpsiCBlc4LzA==} engines: {node: '>=14'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -3825,70 +3659,79 @@ packages: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} engines: {node: '>= 14'} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + 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'} - - ast-module-types@6.0.1: - resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} - engines: {node: '>=18'} - ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} 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} @@ -3900,53 +3743,67 @@ 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==} - b4a@1.7.3: - resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} - peerDependencies: - react-native-b4a: '*' - peerDependenciesMeta: - react-native-b4a: - optional: true + axios@1.7.8: + resolution: {integrity: sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} - babel-dead-code-elimination@1.0.12: - resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + babel-dead-code-elimination@1.0.9: + resolution: {integrity: sha512-JLIhax/xullfInZjtu13UJjaLHDeTzt3vOeomaSUdO/nAMEL/pWC/laKrSvWylXMnVWyL5bpmG9njqBZlUQOdg==} 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==} + 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 + + 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 + + babel-plugin-polyfill-regenerator@0.5.5: + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-transform-react-remove-prop-types@0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + + babel-preset-react-app@10.0.1: + resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} + + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@3.0.1: - resolution: {integrity: sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==} - engines: {node: '>= 16'} - - bare-events@2.7.0: - resolution: {integrity: sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==} + bare-events@2.5.0: + resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - 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 + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} @@ -3958,22 +3815,21 @@ 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@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} - brace-expansion@4.0.1: - resolution: {integrity: sha512-YClrbvTCXGe70pU2JiEiPLYXO9gQkyxYeKpJIQHVS/gOs6EWMQP2RYBwjFLNT322Ji8TOC3IMPfsYCedNpzKfA==} - engines: {node: '>= 18'} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -3984,70 +3840,51 @@ 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==} - buffer-crc32@1.0.0: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} engines: {node: '>=8.0.0'} - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 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==} - engines: {node: '>= 0.4'} + c12@2.0.1: + resolution: {integrity: sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true call-bind@1.0.7: 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'} - - callsite@1.0.0: - resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + camelcase@8.0.0: 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'} @@ -4056,70 +3893,90 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + + 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==} - cheerio@1.1.2: - resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} - engines: {node: '>=20.18.1'} - - chevrotain-allstar@0.3.1: - resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} - peerDependencies: - chevrotain: ^11.0.0 - - chevrotain@11.0.3: - resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + cheerio@1.0.0: + resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} + engines: {node: '>=18.17'} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + 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@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - 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'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + 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'} + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + cmdk@1.1.1: resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} peerDependencies: @@ -4133,123 +3990,114 @@ packages: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-convert@3.1.2: - resolution: {integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==} - engines: {node: '>=14.6'} - color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-name@2.0.2: - resolution: {integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==} - engines: {node: '>=12.20'} - - color-string@2.1.2: - resolution: {integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==} - engines: {node: '>=18'} - - color@5.0.2: - resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==} - engines: {node: '>=18'} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + compatx@0.1.8: + resolution: {integrity: sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==} 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==} confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - 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==} + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} engines: {node: ^14.18.0 || >=16.10.0} - content-disposition@1.0.1: - resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convex-helpers@0.1.67: + resolution: {integrity: sha512-nnb0W2FYKbqJt00UH6raZ/J0A1+CbcFdqmFJTDvvSR1P4RhwBj1TBzS3/B1G1nMYebX3gguSwOWfO0s2rcB/wg==} + hasBin: true + peerDependencies: + convex: ^1.13.0 + hono: ^4.0.5 + react: ^17.0.2 || ^18.0.0 || ^19.0.0 + zod: ^3.22.4 + peerDependenciesMeta: + hono: + optional: true + react: + optional: true + zod: + optional: true + + convex@1.17.2: + resolution: {integrity: sha512-h12LChRZLGSGTIiqtBMyM7BT+zHxpUjtA1YI2vhFza7x+9E1CYzP8c2En6wKnZ9Dr2PYE4vWqUg8EHkBr0hI5A==} + 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: ^17.0.2 || ^18.0.0 || ^19.0.0-0 + react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0-0 + peerDependenciesMeta: + '@auth0/auth0-react': + optional: true + '@clerk/clerk-react': + optional: true + react: + optional: true + react-dom: + optional: true + cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} - cookie-es@2.0.0: - resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} - - cookie-signature@1.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.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - cookie@1.0.2: - resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} - engines: {node: '>=18'} - - copy-file@11.1.0: - 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==} - - cose-base@2.2.0: - resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} - cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -4267,33 +4115,28 @@ 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 + croner@9.0.0: + resolution: {integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==} + engines: {node: '>=18.0'} - 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.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crossws@0.3.5: - resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + crossws@0.3.3: + resolution: {integrity: sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw==} css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -4303,32 +4146,8 @@ packages: engines: {node: '>=4'} hasBin: true - cssfilter@0.0.10: - resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} - - csso@5.0.5: - 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==} - - cytoscape-cose-bilkent@4.1.0: - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} - peerDependencies: - cytoscape: ^3.2.0 - - cytoscape-fcose@2.2.0: - resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} - peerDependencies: - cytoscape: ^3.2.0 - - cytoscape@3.33.1: - resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} - engines: {node: '>=0.10'} - - d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} @@ -4402,9 +4221,6 @@ packages: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} engines: {node: '>=12'} - d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - d3-path@3.1.0: resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} engines: {node: '>=12'} @@ -4421,9 +4237,6 @@ packages: resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} engines: {node: '>=12'} - d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} - d3-scale-chromatic@3.1.0: resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} engines: {node: '>=12'} @@ -4436,9 +4249,6 @@ packages: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} - d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - d3-shape@3.2.0: resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} engines: {node: '>=12'} @@ -4469,61 +4279,70 @@ packages: resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} engines: {node: '>=12'} - dagre-d3-es@7.0.11: - resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} - damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - 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'} + data-uri-to-buffer@3.0.1: + resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} + engines: {node: '>= 6'} date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} - dayjs@1.11.18: - resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} + dax-sh@0.39.2: + resolution: {integrity: sha512-gpuGEkBQM+5y6p4cWaw9+ePy5TNon+fdwFVtTI8leU3UhwhsBfPewRxMXGuQNC+M2b/MDGMlfgpqynkcd0C3FQ==} + + db0@0.2.1: + resolution: {integrity: sha512-BWSFmLaCkfyqbSEZBQINMVNjCVfrogi7GQ2RSy1tmtfK9OXlsup6lUMwLsqSD7FbAjD04eWFdXowSHHUp6SE/Q==} + peerDependencies: + '@electric-sql/pglite': '*' + '@libsql/client': '*' + better-sqlite3: '*' + drizzle-orm: '*' + mysql2: '*' + peerDependenciesMeta: + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + better-sqlite3: + optional: true + drizzle-orm: + optional: true + mysql2: + optional: true + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - decache@4.6.2: - resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} - - decode-named-character-reference@1.2.0: - resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - dedent@1.7.0: - resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -4541,6 +4360,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -4551,6 +4374,14 @@ packages: delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -4562,89 +4393,47 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destr@2.0.5: - resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} - detect-gpu@5.0.70: - resolution: {integrity: sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} hasBin: true - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} - engines: {node: '>=8'} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - detective-amd@6.0.1: - resolution: {integrity: sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==} - engines: {node: '>=18'} - hasBin: true - - detective-cjs@6.0.1: - resolution: {integrity: sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==} - engines: {node: '>=18'} - - detective-es6@5.0.1: - resolution: {integrity: sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==} - engines: {node: '>=18'} - - detective-postcss@7.0.1: - resolution: {integrity: sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==} - engines: {node: ^14.0.0 || >=16.0.0} - peerDependencies: - postcss: ^8.4.47 - - detective-sass@6.0.1: - resolution: {integrity: sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==} - engines: {node: '>=18'} - - detective-scss@5.0.1: - resolution: {integrity: sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==} - engines: {node: '>=18'} - - detective-stylus@5.0.1: - resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} - engines: {node: '>=18'} - - detective-typescript@14.0.0: - resolution: {integrity: sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==} - engines: {node: '>=18'} - peerDependencies: - typescript: ^5.4.4 - - detective-vue2@2.2.0: - resolution: {integrity: sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==} - engines: {node: '>=18'} - peerDependencies: - typescript: ^5.4.4 - - dettle@1.0.5: - resolution: {integrity: sha512-ZVyjhAJ7sCe1PNXEGveObOH9AC8QvMga3HJIghHawtG7mE4K5pW9nz/vDGAr/U7a3LWgdOzEE7ac9MURnyfaTA==} + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff@8.0.2: - resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} 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'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 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==} @@ -4655,11 +4444,11 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.2.6: - resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} + dompurify@3.1.6: + resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} dot-prop@9.0.0: resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} @@ -4673,112 +4462,18 @@ packages: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} 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 - - 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 + download-stats@0.3.4: + resolution: {integrity: sha512-ic2BigbyUWx7/CBbsfGjf71zUNZB4edBGC3oRliSzsoNmvyVx3Ycfp1w3vp2Y78Ee0eIIkjIEO5KzW0zThDGaA==} + engines: {node: '>=0.10.0'} - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + downshift@9.0.9: + resolution: {integrity: sha512-ygOT8blgiz5liDuEFAIaPeU4dDEa+w9p6PHVUisPIjrkF5wfR59a52HpGWAVVMoWnoFO8po2mZSScKZueihS7g==} + peerDependencies: + react: '>=16.12.0' duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -4786,20 +4481,9 @@ packages: 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==} @@ -4809,80 +4493,54 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - empathic@2.0.0: - resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} - engines: {node: '>=14'} - - enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} 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==} + encoding-sniffer@0.2.0: + resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - - env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - 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==} + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} es-errors@1.3.0: 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: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} es-set-tostringtag@2.0.3: 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==} @@ -4890,35 +4548,28 @@ 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==} + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} hasBin: true - esbuild@0.25.10: - resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + esbuild@0.23.0: + resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} hasBin: true - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} hasBin: true - esbuild@0.27.0: - resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + esbuild@0.25.3: + resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} engines: {node: '>=18'} hasBin: true @@ -4941,57 +4592,129 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true + eslint-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.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + 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-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-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.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==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - 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==} @@ -5006,6 +4729,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'} @@ -5013,6 +4740,9 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -5025,42 +4755,17 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - events-universal@1.0.1: - resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.6: - resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} - engines: {node: '>=18.0.0'} - - 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==} - extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -5068,14 +4773,8 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - 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.0: + resolution: {integrity: sha512-fCqg/6Sps8tqk8p+kqyKqYfOF0VjPNYrqpLiqNl0RBKmD80B080AJWVV6EkSkscjToNExcXg1+Mfzftrx6+iSA==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -5093,131 +4792,105 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - - fast-sha256@1.3.0: - resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} - - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - - fflate@0.6.10: - resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} - - fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - - 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'} + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - 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'} - filter-obj@6.1.0: - 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'} - find-up@7.0.0: - 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==} - 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==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - forwarded-parse@2.1.2: - resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + framer-motion@11.15.0: + resolution: {integrity: sha512-MLk8IvZntxOMg7lDBLw2qgTHHv664bYoYmnFTmE0Gm/FW67aOJk0WM3ctMcG+Xhcv+vh5uyyXwxvxhSeJzSe+w==} + 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 - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} - 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.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -5231,10 +4904,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==} @@ -5242,55 +4911,35 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-amd-module-type@6.0.1: - resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} - engines: {node: '>=18'} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-port-please@3.2.0: - resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} - - get-port@7.1.0: - resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} - engines: {node: '>=16'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + get-port-please@3.1.2: + resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} get-stream@8.0.1: 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.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + giget@1.2.3: + resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} + hasBin: true github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -5303,55 +4952,51 @@ 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@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} + 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'} globalthis@1.0.3: 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'} + + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} 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'} - hasBin: true - goober@2.1.16: resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} peerDependencies: csstype: ^3.0.10 - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -5359,28 +5004,29 @@ 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.10.0: + resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} + 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==} + gzip-size@7.0.0: + resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - h3@2.0.1-rc.11: - resolution: {integrity: sha512-2myzjCqy32c1As9TjZW9fNZXtLqNedjFSrdFy2AjFBQQ3LzrnGoDdFDYfC0tV2e4vcyfJ2Sfo/F6NQhO2Ly/Mw==} - engines: {node: '>=20.11.1'} - peerDependencies: - crossws: ^0.4.1 - peerDependenciesMeta: - crossws: - optional: true + h3@1.13.0: + resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} - hachure-fill@0.5.2: - resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + h3@1.14.0: + resolution: {integrity: sha512-ao22eiONdgelqcnknw0iD645qW0s9NnrJHr5OBz4WOMdBdycfSas1EQf1wXRsm+PcB2Yoj43pjBPwqIpJQTeWg==} has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -5398,65 +5044,23 @@ packages: has-proto@1.0.3: 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'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - 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==} + engines: {node: '>= 0.4'} - hastscript@9.0.1: - resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} - 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==} @@ -5465,22 +5069,12 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - 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'} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} - htm@3.1.1: resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} @@ -5496,19 +5090,17 @@ 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==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + http-shutdown@1.2.2: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -5521,31 +5113,17 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + httpxy@0.1.5: + resolution: {integrity: sha512-hqLDO+rfststuyEUTWObQK6zHEEmZ/kaIP2/zclGGZn6X8h/ESTWg+WKecQ/e5k4nPswjzZD+q2VqZIbr15CoQ==} + human-signals@5.0.0: 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==} @@ -5553,47 +5131,35 @@ 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==} - - image-size@2.0.2: - resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} - 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.1: - resolution: {integrity: sha512-bruMpJ7xz+9jwGzrwEhWgvRrlKRYCRDBrfU+ur3FcasYXLJDxTruJ//8g2Noj+QFyRBeqbpj8Bhn4Fbw6HjvhA==} + 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@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} - index-to-position@1.2.0: - resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + index-to-position@0.1.2: + resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} 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==} @@ -5609,13 +5175,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==} - internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -5623,23 +5182,25 @@ 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 + ioredis@5.4.1: + resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} + engines: {node: '>=12.22.0'} 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: @@ -5652,10 +5213,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'} @@ -5664,9 +5221,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==} @@ -5676,17 +5240,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-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} @@ -5706,9 +5265,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==} @@ -5722,6 +5280,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'} @@ -5731,56 +5292,44 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} - engines: {node: '>=16'} - is-number-object@1.0.7: 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@4.0.0: - resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} - engines: {node: '>=12'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} - is-plain-obj@4.1.0: - 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-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 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'} @@ -5789,10 +5338,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'} @@ -5801,45 +5346,18 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - is-string@1.0.7: 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'} - - is-url-superb@4.0.0: - resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} - engines: {node: '>=10'} - - is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -5847,10 +5365,6 @@ 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'} @@ -5873,58 +5387,62 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.31: - resolution: {integrity: sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==} + isbot@5.1.22: + resolution: {integrity: sha512-RqCFY3cJy3c2y1I+rMn81cfzAR4XJwfPBC+M8kffUjbPzxApzyyv7Tbm1C/gXXq2dSCuD238pKFEWlQMTWsTFw==} engines: {node: '>=18'} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + 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 + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true - jiti@2.6.0: - resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - jose@5.10.0: - resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} - jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - jpeg-js@0.4.4: - resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-image-generator@1.0.4: - resolution: {integrity: sha512-ckb7kyVojGAnArouVR+5lBIuwU1fcrn7E/YYSd0FK7oIngAkMmRvHASLro9Zt5SQdWToaI66NybG+OGxPw/HlQ==} + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true - js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true jsesc@3.1.0: @@ -5947,78 +5465,49 @@ 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 - jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - 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'} - - jwa@1.4.2: - resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} - - jws@3.2.3: - resolution: {integrity: sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==} - - jwt-decode@4.0.0: - resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} - engines: {node: '>=18'} - - katex@0.16.22: - resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} - hasBin: true + jwt-decode@3.1.2: + resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - 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'} - kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - - kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - - kysely@0.28.5: - resolution: {integrity: sha512-rlB0I/c6FBDWPcQoDtkxi9zIvpmnV5xoIalfCMSMCa7nuA6VGA3F54TW9mEgX4DVf10sXAWCF5fDbamI/5ZpKA==} - engines: {node: '>=20.0.0'} - - lambda-local@2.2.0: - resolution: {integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==} - engines: {node: '>=8'} - hasBin: true + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} - langium@3.3.1: - resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} - engines: {node: '>=16.0.0'} + knitwork@1.1.0: + resolution: {integrity: sha512-oHnmiBUVHz1V+URE77PNot2lv3QiYU2zQf1JjOVkMt3YDKGbu8NAFr+c4mcNOhdsGrB/VpVbRwPwhiXrPhxQbw==} language-subtag-registry@0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} @@ -6027,404 +5516,208 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} - layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} - - 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'} - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - 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'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.30.1: - resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.30.1: - resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.30.1: - resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.30.1: - resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-arm64-musl@1.30.1: - resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-x64-gnu@1.30.1: - resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.30.1: - resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.30.1: - resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.30.1: - resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} - lightningcss@1.30.1: - resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} - engines: {node: '>= 12.0.0'} + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} 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'} - local-pkg@1.1.2: - resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} 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'} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - logform@2.7.0: - 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 - - 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==} - - lru-cache@7.18.3: - 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 - - 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==} - - 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-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - - 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==} - - mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - - 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'} - - memfs@4.56.10: - resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==} - peerDependencies: - tslib: '2' - - 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'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - 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==} + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + luxon@3.5.0: + resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} + engines: {node: '>=12'} - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + marked-alert@2.0.1: + resolution: {integrity: sha512-dREhBjpPEN87b5AdlpETVoEpYiROQJ2M01sqjvQetKqpfi92BQRfSFKPIEkm90RnMpv5CFLNpWfGO6bx+tnayQ==} + peerDependencies: + marked: '>=7.0.0' - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + marked-gfm-heading-id@4.0.0: + resolution: {integrity: sha512-p53gp+nBIGeryucXzUFP8w67wtpin68+jOFBPw5m9FUfqx2ngAunO/I6KU6J3Xm3fyuv2JsSDxz0Z+pYVrHrwg==} + peerDependencies: + marked: '>=13 <14' - micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + marked-highlight@2.1.4: + resolution: {integrity: sha512-D1GOkcdzP+1dzjoColL7umojefFrASDuLeyaHS0Zr/Uo9jkr1V6vpLRCzfi1djmEaWyK0SYMFtHnpkZ+cwFT1w==} + peerDependencies: + marked: '>=4 <15' - micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + marked@13.0.2: + resolution: {integrity: sha512-J6CPjP8pS5sgrRqxVRvkCIkZ6MFdRIjDkwUwgJ9nL2fbmM6qGQeB2C16hi8Cc9BOzj6xXzy0jyi0iPIfnMHYzA==} + engines: {node: '>= 18'} + hasBin: true - micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + mdast-util-definitions@4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} - micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + mdast-util-to-hast@10.2.0: + resolution: {integrity: sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==} - micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} - 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.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mime@4.0.4: + resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==} + engines: {node: '>=16'} + hasBin: true 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==} @@ -6433,6 +5726,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'} @@ -6440,20 +5741,37 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@3.0.2: - resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} engines: {node: '>= 18'} mkdirp@0.3.0: 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==} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} hasBin: true mkdirp@3.0.1: @@ -6461,58 +5779,74 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.7.3: + resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} - module-definition@6.0.1: - resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} - engines: {node: '>=18'} - hasBin: true + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + motion-dom@11.14.3: + resolution: {integrity: sha512-lW+D2wBy5vxLJi6aCP0xyxTxlTfiu+b+zcpVbGVFUxotwThqhdpPRSmX8xztAgtZMPMeU0WGVn/k1w4I+TbPqA==} - module-details-from-path@1.0.4: - resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + motion-utils@11.14.3: + resolution: {integrity: sha512-Xg+8xnqIJTpr0L/cidfTTBFkvRw26ZtGGuIhA94J9PQ2p4mEa06Xx7QVYZH0BP+EpMSaDlu+q0I0mmvwADPsaQ==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} - hasBin: true - - msgpackr@1.11.8: - resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - 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==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + 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==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + nitropack@2.10.4: + resolution: {integrity: sha512-sJiG/MIQlZCVSw2cQrFG1H6mLeSqHlYfFerRjLKz69vUfdu0EL2l0WdOxlQbzJr3mMv/l4cOlCCLzVRzjzzF/g==} + engines: {node: ^16.11.0 || >=17.0.0} + hasBin: true + peerDependencies: + xml2js: ^0.6.2 + peerDependenciesMeta: + xml2js: + optional: true + + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - - node-fetch-native@1.6.7: - resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -6523,56 +5857,29 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - node-forge@1.3.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 - node-mock-http@1.0.3: - resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} - node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - node-source-walk@7.0.1: - resolution: {integrity: sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==} - engines: {node: '>=18'} - - node-stream-zip@1.15.0: - resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} - engines: {node: '>=0.12.0'} - nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true - nopt@8.1.0: - resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + nopt@8.0.0: + resolution: {integrity: sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} - - normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -6581,8 +5888,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==} @@ -6593,26 +5901,27 @@ 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==} number-flow@0.4.0: resolution: {integrity: sha512-sG2ngZe0y3M8DSa9VQfMA5J9Yi1i4RYaaZ/lgawTJpICftFAGaFgTUydaavZmUbOZcBnjDqNizcsyb1MDhrGaw==} - oauth4webapi@3.7.0: - resolution: {integrity: sha512-Q52wTPUWPsVLVVmTViXPQFMW2h2xv2jnDGxypjpelCFKaOjLsm7AxYuOk1oQgFm95VNDbuggasu9htXrz6XwKw==} + nypm@0.3.12: + resolution: {integrity: sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -6622,30 +5931,33 @@ 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.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + octokit@4.0.3: + resolution: {integrity: sha512-kfqH80Yuuux4fLbZ4SvObjCvVu89U0eCh5+fulh6tr/hJkDYS1inXDGnNJDOp312GANMEhWWMLYmjQR8MvSSMQ==} + engines: {node: '>= 18'} ofetch@1.4.1: resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} - omit.js@2.0.2: - resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==} + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -6654,85 +5966,61 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - open@7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + openapi-typescript@7.4.4: + resolution: {integrity: sha512-7j3nktnRzlQdlHnHsrcr6Gqz8f80/RhfA2I8s1clPI+jkY0hLNmnYVKBfuUEli5EEgK1B6M+ibdS5REasPlsUw==} + hasBin: true + peerDependencies: + typescript: ^5.x 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'} - - 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'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-limit@6.2.0: 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'} - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-map@7.0.3: - resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} - engines: {node: '>=18'} - - p-retry@6.2.1: - resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} - engines: {node: '>=16.17'} - - p-timeout@6.1.4: - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} - engines: {node: '>=14.16'} - - p-wait-for@5.0.2: - resolution: {integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==} - engines: {node: '>=12'} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - 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-gitignore@2.0.0: - resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} - engines: {node: '>=14'} - - parse-imports@2.2.1: - resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==} - engines: {node: '>= 18'} + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} @@ -6742,12 +6030,8 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-json@8.3.0: - resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} - engines: {node: '>=18'} - - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + parse-json@8.1.0: + resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} engines: {node: '>=18'} parse5-htmlparser2-tree-adapter@7.1.0: @@ -6756,23 +6040,20 @@ packages: parse5-parser-stream@7.1.2: resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} 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==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-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==} @@ -6793,12 +6074,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==} @@ -6808,37 +6085,15 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - 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'} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -6847,150 +6102,108 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - picoquery@2.5.0: - resolution: {integrity: sha512-j1kgOFxtaCyoFCkpoYG2Oj3OdGakadO7HZ7o5CqyRazlmBekKhbDoUnNnXASE07xSY4nDImWZkrZv7toSxMi/g==} - pidtree@0.3.1: resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} engines: {node: '>=0.10'} hasBin: true + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + pify@3.0.0: 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 + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} - playwright@1.57.0: - resolution: {integrity: sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==} - engines: {node: '>=18'} - hasBin: true + pkg-types@1.2.1: + resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - points-on-curve@0.2.0: - resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} - - points-on-path@0.2.1: - resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 - postcss-values-parser@6.0.2: - resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} - engines: {node: '>=10'} + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} peerDependencies: - postcss: ^8.2.9 + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 - postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} 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==} + postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} - preact-render-to-string@5.2.3: - resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} - peerDependencies: - preact: '>=10' + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - preact@10.11.3: - resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} preact@10.26.5: resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} - precinct@12.2.0: - resolution: {integrity: sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==} - engines: {node: '>=18'} - hasBin: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - 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.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} engines: {node: '>=14'} hasBin: true - pretty-format@3.8.0: - resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + prettier@3.5.2: + resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} + engines: {node: '>=14'} + hasBin: true - pretty-ms@9.3.0: - resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} - engines: {node: '>=18'} + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -7003,50 +6216,40 @@ 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==} - 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==} - - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + qs@6.13.1: + resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==} engines: {node: '>=0.6'} - quansync@0.2.11: - resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + qs@6.9.7: + resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==} + engines: {node: '>=0.6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + qss@3.0.0: + resolution: {integrity: sha512-ZHoCB3M/3Voev64zhLLUOKDtaEdJ/lymsJJ7R3KBusVZ2ovNiIB7XOq3Xh6V1a8O+Vho+g2B5YElq9zW7D8aQw==} + engines: {node: '>=4'} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quote-unquote@1.0.0: - resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} @@ -7058,9 +6261,8 @@ packages: 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'} + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} react-colorful@5.6.1: resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} @@ -7068,16 +6270,15 @@ packages: 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==} @@ -7095,6 +6296,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==} @@ -7132,40 +6345,30 @@ 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-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + 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@9.0.1: - resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} - engines: {node: '>=18'} + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} readdir-glob@1.1.3: @@ -7175,69 +6378,103 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} - recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} - engines: {node: '>= 4'} + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + 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.19.0: + resolution: {integrity: sha512-B/2+zHNPXu0BAopJU8ZrqMjA0u56M/l6BUxDq8AcU+3LWlOYVuf98I6qpYrB5BeeEICunpmXPcQl2ReGXkiQyw==} - 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==} - remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -7246,25 +6483,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'} @@ -7281,50 +6502,40 @@ 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 - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - reusify@1.0.4: 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} + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rollup-plugin-visualizer@5.12.0: + resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} + engines: {node: '>=14'} hasBin: true + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true - rou3@0.7.12: - resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==} - - 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'} + rollup@4.32.1: + resolution: {integrity: sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -7336,40 +6547,32 @@ 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'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} search-insights@2.17.3: resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} @@ -7386,36 +6589,30 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - seroval-plugins@1.5.0: - resolution: {integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==} - engines: {node: '>=10'} - peerDependencies: - seroval: ^1.0 + serve-placeholder@2.0.2: + resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} - seroval@1.5.0: - resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} - engines: {node: '>=10'} + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} - 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.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -7425,23 +6622,16 @@ 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==} - sharp@0.34.4: - resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} @@ -7465,33 +6655,24 @@ packages: shiki@1.10.3: resolution: {integrity: sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - slashes@3.0.12: - resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} - source-map-explorer@2.5.3: - resolution: {integrity: sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg==} - engines: {node: '>=12'} - hasBin: true + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -7504,12 +6685,12 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} - 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==} @@ -7526,39 +6707,27 @@ 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==} - engines: {node: '>=20.16.0'} - hasBin: true - - 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: '*' + sse.js@2.5.0: + resolution: {integrity: sha512-I7zYndqOOkNpz9KIdFZ8c8A7zs1YazNewBr8Nsi/tqThfJkVPuP1q7UE2h4B0RwoWZxbBYpd06uoW3NI3SaZXg==} - stats.js@0.17.0: - resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} - 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.20.1: + resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} - 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==} @@ -7568,25 +6737,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'} @@ -7594,32 +6751,21 @@ 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'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} strip-bom-string@1.0.0: @@ -7634,22 +6780,30 @@ 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==} engines: {node: '>=8'} + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + 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==} - stylis@4.3.6: - resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -7659,23 +6813,18 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + supports-preserve-symlinks-flag@1.0.0: 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==} - system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} @@ -7686,58 +6835,62 @@ 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==} + tailwindcss@3.4.1: + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} + engines: {node: '>=14.0.0'} + hasBin: true - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + tar@7.4.3: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - temp@0.9.4: - resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} - engines: {node: '>=6.0.0'} + terser-webpack-plugin@5.3.11: + resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true - terser@5.44.0: - resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} engines: {node: '>=10'} hasBin: true - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-decoder@1.2.1: + resolution: {integrity: sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==} - 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 + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - three-mesh-bvh@0.8.3: - resolution: {integrity: sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==} - peerDependencies: - three: '>= 0.159.0' + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} - three-stdlib@2.36.1: - resolution: {integrity: sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==} - peerDependencies: - three: '>=0.128.0' + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - 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==} @@ -7745,79 +6898,40 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - tinyexec@1.0.1: - resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - - tmp-promise@3.0.3: - resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} - - tmp@0.2.5: - 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'} + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - - tomlify-j0.4@3.0.0: - resolution: {integrity: sha512-2Ulkc8T7mXJ2l0W476YC/A209PR38Nw8PuaCNtk9uI3t1zzFdGQeWYGQvmj2PZkVvRC/Yoi4xQKMRnWc/N29tQ==} - 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' - - troika-three-utils@0.52.4: - resolution: {integrity: sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==} - 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==} + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} peerDependencies: - typescript: '>=4.8.4' + typescript: '>=4.2.0' - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} tsconfck@3.1.4: resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} @@ -7829,166 +6943,195 @@ 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.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} 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@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + 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@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@4.30.0: + resolution: {integrity: sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==} engines: {node: '>=16'} - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} + type-fest@4.40.0: + resolution: {integrity: sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==} + engines: {node: '>=16'} 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==} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ulid@3.0.1: - resolution: {integrity: sha512-dPJyqPzx8preQhqq24bBG1YNkvigm87K8kVEHCD+ruZg24t6IFEFv00xMWfxcC4djmFtiTLdFuADn4+DOz6R7Q==} - hasBin: true + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} 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==} + unctx@2.4.1: + resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==} + + undici-types@5.28.4: + resolution: {integrity: sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici@6.21.0: + resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==} + engines: {node: '>=18.17'} - undici@7.14.0: - resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} - engines: {node: '>=20.18.1'} + unenv@1.10.0: + resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + + 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==} + + unimport@3.14.5: + resolution: {integrity: sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==} + + 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.0: + resolution: {integrity: sha512-G5o6f95b5BggDGuUfKDApKaCgNYy2x7OdHY0zSMF081O0EJobw+1130VONhrA7ezGSV2FNOGyM+KQpQZAr9bIQ==} universal-user-agent@6.0.0: resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} - unixify@1.0.0: - resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} - engines: {node: '>=0.10.0'} + universal-user-agent@7.0.2: + resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} unplugin@1.0.1: resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} - unplugin@2.3.10: - resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + + unplugin@2.1.2: + resolution: {integrity: sha512-Q3LU0e4zxKfRko1wMV2HmP8lB9KWislY7hxXpxd+lGx0PRInE4vhMBVEZwpdVYHvtqzhSrzuIfErsob6bQfCzw==} engines: {node: '>=18.12.0'} - unstorage@1.17.1: - resolution: {integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==} + unstorage@1.14.4: + resolution: {integrity: sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg==} peerDependencies: '@azure/app-configuration': ^1.8.0 '@azure/cosmos': ^4.2.0 '@azure/data-tables': ^13.3.0 - '@azure/identity': ^4.6.0 + '@azure/identity': ^4.5.0 '@azure/keyvault-secrets': ^4.9.0 '@azure/storage-blob': ^12.26.0 - '@capacitor/preferences': ^6.0.3 || ^7.0.0 - '@deno/kv': '>=0.9.0' - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@capacitor/preferences': ^6.0.3 + '@deno/kv': '>=0.8.4' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 '@planetscale/database': ^1.19.0 '@upstash/redis': ^1.34.3 - '@vercel/blob': '>=0.27.1' - '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/blob': '>=0.27.0' '@vercel/kv': ^1.0.1 aws4fetch: ^1.0.20 db0: '>=0.2.1' idb-keyval: ^6.2.1 ioredis: ^5.4.2 - uploadthing: ^7.4.4 + uploadthing: ^7.4.1 peerDependenciesMeta: '@azure/app-configuration': optional: true @@ -8014,8 +7157,6 @@ packages: optional: true '@vercel/blob': optional: true - '@vercel/functions': - optional: true '@vercel/kv': optional: true aws4fetch: @@ -8033,45 +7174,28 @@ packages: resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} hasBin: true + untyped@1.5.1: + resolution: {integrity: sha512-reBOnkJBFfBZ8pCKaeHgfZLcehXtM6UTxc+vqs1JvCps0c4amLNp3fhdGBZwYp+VLyoY9n3X5KOP7lCyWBUX9A==} + hasBin: true + + unwasm@0.3.9: + resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} + update-browserslist-db@1.1.2: resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - uploadthing@7.7.4: - resolution: {integrity: sha512-rlK/4JWHW5jP30syzWGBFDDXv3WJDdT8gn9OoxRJmXLoXi94hBmyyjxihGlNrKhBc81czyv8TkzMioe/OuKGfA==} - engines: {node: '>=18.13.0'} - peerDependencies: - express: '*' - fastify: '*' - h3: '*' - next: '*' - tailwindcss: ^3.0.0 || ^4.0.0-beta.0 - peerDependenciesMeta: - express: - optional: true - fastify: - optional: true - h3: - optional: true - next: - optional: true - tailwindcss: - optional: true - uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - urlpattern-polyfill@10.1.0: - resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} - urlpattern-polyfill@8.0.2: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} @@ -8085,15 +7209,6 @@ packages: '@types/react': optional: true - 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 - use-sidecar@1.1.3: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} @@ -8109,56 +7224,28 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - utility-types@3.11.0: - resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} - engines: {node: '>= 4'} - - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - valibot@1.2.0: - resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} - peerDependencies: - typescript: '>=5' - peerDependenciesMeta: - typescript: - optional: true + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} 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} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vfile-location@5.0.3: - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} - vite-bundle-analyzer@1.2.1: - resolution: {integrity: sha512-dpJMQBnVjieMirpHILmgGsZAWU8fGyqK3ckj6O48wdy3fARlH7Mnz7BfYFUsd3ZdbuXjsYe7t5I/q2zsMOd5ig==} + vinxi@0.5.3: + resolution: {integrity: sha512-4sL2SMrRzdzClapP44oXdGjCE1oq7/DagsbjY5A09EibmoIO4LP8ScRVdh03lfXxKRk7nCWK7n7dqKvm+fp/9w==} hasBin: true vite-tsconfig-paths@5.0.1: @@ -8169,19 +7256,19 @@ packages: vite: optional: true - vite@7.1.7: - resolution: {integrity: sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==} - engines: {node: ^20.19.0 || >=22.12.0} + vite@6.0.11: + resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 jiti: '>=1.21.0' - less: ^4.0.0 + less: '*' lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -8209,52 +7296,30 @@ packages: yaml: optional: true - vitefu@1.1.1: - resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + typescript: '*' peerDependenciesMeta: - vite: + typescript: optional: true - 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==} - - vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - - 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==} + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + 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'} - webgl-constants@1.1.1: - resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} - - webgl-sdf-generator@1.1.1: - resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + 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: @@ -8263,10 +7328,19 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webpack@5.97.1: + resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + 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 whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} @@ -8278,12 +7352,8 @@ packages: which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} engines: {node: '>= 0.4'} which-collection@1.0.2: @@ -8291,11 +7361,7 @@ packages: engines: {node: '>= 0.4'} which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} which@1.3.1: @@ -8307,13 +7373,14 @@ packages: engines: {node: '>= 8'} hasBin: true - winston-transport@4.9.0: - resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} - engines: {node: '>= 12.0.0'} + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true - winston@3.18.3: - resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==} - engines: {node: '>= 12.0.0'} + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -8326,22 +7393,6 @@ packages: 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@4.0.3: - resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} - engines: {node: '>=20.0'} - - xss@1.0.15: - resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} - engines: {node: '>= 0.10.0'} - hasBin: true - - xstate@5.25.0: - resolution: {integrity: sha512-yyWzfhVRoTHNLjLoMmdwZGagAYfmnzpm9gPjlX2MhJZsDojXGqRxODDOi4BsgGRKD46NZRAdcLp6CKOyvQS0Bw==} - xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -8353,70 +7404,52 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + 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'} + yaml@2.4.0: + resolution: {integrity: sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==} + engines: {node: '>= 14'} hasBin: true - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - 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==} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} - engines: {node: '>=18'} - zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} - peerDependencies: - zod: ^3.25 || ^4 - - 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 - - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - - zod@4.3.5: - resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} zustand@4.5.2: resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} @@ -8433,27 +7466,6 @@ packages: react: optional: true - 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 - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} @@ -8537,1467 +7549,1465 @@ snapshots: 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': {} - - '@apm-js-collab/code-transformer@0.8.2': {} - - '@apm-js-collab/tracing-hooks@0.3.1': - dependencies: - '@apm-js-collab/code-transformer': 0.8.2 - debug: 4.4.3 - module-details-from-path: 1.0.4 - transitivePeerDependencies: - - supports-color - - '@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) + '@alloc/quick-lru@5.2.0': {} - '@babel/code-frame@7.27.1': + '@ampproject/remapping@2.3.0': dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.26.2': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.5': {} - - '@babel/compat-data@7.29.0': {} + '@babel/compat-data@7.26.5': {} - '@babel/core@7.28.4': + '@babel/core@7.26.9': 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 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helpers': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.0(supports-color@9.4.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.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 + '@babel/eslint-parser@7.23.10(@babel/core@7.26.9)(eslint@8.57.0)': + dependencies: + '@babel/core': 7.26.9 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.57.0 + eslint-visitor-keys: 2.1.0 semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/generator@7.28.3': + '@babel/generator@7.26.9': dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/generator@7.29.0': + '@babel/helper-annotate-as-pure@7.25.9': 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/types': 7.26.9 - '@babel/helper-compilation-targets@7.27.2': + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': dependencies: - '@babel/compat-data': 7.27.5 - '@babel/helper-validator-option': 7.27.1 + '@babel/types': 7.26.9 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.5 + '@babel/helper-validator-option': 7.25.9 browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-compilation-targets@7.28.6': + '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.5 + semver: 6.3.1 + + '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.26.9)': dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.4 - lru-cache: 5.1.1 + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 5.3.2 semver: 6.3.1 - '@babel/helper-globals@7.28.0': {} + '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.4.0(supports-color@9.4.0) + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-imports@7.27.1': + '@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.26.9)': dependencies: - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.2 + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.4.0(supports-color@9.4.0) + lodash.debounce: 4.0.8 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.28.6': + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.26.9 + + '@babel/helper-member-expression-to-functions@7.24.5': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/types': 7.26.9 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': 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 + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-optimise-call-expression@7.22.5': + dependencies: + '@babel/types': 7.26.9 + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + + '@babel/helper-replace-supers@7.24.1(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-optimise-call-expression': 7.22.5 + + '@babel/helper-simple-access@7.24.5': + dependencies: + '@babel/types': 7.26.9 + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + dependencies: + '@babel/types': 7.26.9 + + '@babel/helper-split-export-declaration@7.24.5': + dependencies: + '@babel/types': 7.26.9 + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helper-wrap-function@7.22.20': + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + + '@babel/helpers@7.26.9': + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + + '@babel/parser@7.26.9': + dependencies: + '@babel/types': 7.26.9 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.26.9) + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-proposal-decorators@7.24.0(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-decorators': 7.24.0(@babel/core@7.26.9) + + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.9) + + '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.9) + + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.9) + + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + + '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.9) + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.9)': 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.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-decorators@7.24.0(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.26.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.9) + + '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.26.9) transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-string-parser@7.27.1': {} + '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.9) - '@babel/helper-validator-option@7.27.1': {} + '@babel/plugin-transform-classes@7.23.8(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.9) + '@babel/helper-split-export-declaration': 7.24.5 + globals: 11.12.0 - '@babel/helpers@7.28.4': + '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.26.9 - '@babel/helpers@7.28.6': + '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/parser@7.28.3': + '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/types': 7.28.2 + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/parser@7.28.4': + '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/types': 7.28.5 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/parser@7.29.0': + '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.26.9)': dependencies: - '@babel/types': 7.29.0 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.9 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.26.9)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.28.4)': + '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.26.9)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/runtime@7.24.5': + '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.26.9)': dependencies: - regenerator-runtime: 0.14.1 + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/runtime@7.28.4': {} + '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.9) - '@babel/runtime@7.28.6': - optional: true + '@babel/plugin-transform-literals@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/template@7.27.2': + '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.26.9)': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.9) - '@babel/template@7.28.6': + '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse@7.28.3': + '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.3 - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - debug: 4.4.3 + '@babel/core': 7.26.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/traverse@7.28.4': + '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@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 + '@babel/core': 7.26.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.24.5 transitivePeerDependencies: - supports-color - '@babel/traverse@7.29.0': + '@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.26.9)': 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 - debug: 4.4.3 + '@babel/core': 7.26.9 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/types@7.28.2': + '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/core': 7.26.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/types@7.28.4': + '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.26.9)': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/types@7.28.5': + '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.26.9)': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/types@7.29.0': + '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.26.9)': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.9) - '@braintree/sanitize-url@7.1.1': {} + '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.9) - '@chevrotain/cst-dts-gen@11.0.3': + '@babel/plugin-transform-object-rest-spread@7.24.0(@babel/core@7.26.9)': dependencies: - '@chevrotain/gast': 11.0.3 - '@chevrotain/types': 11.0.3 - lodash-es: 4.17.21 + '@babel/compat-data': 7.26.5 + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.26.9) - '@chevrotain/gast@11.0.3': + '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.26.9)': dependencies: - '@chevrotain/types': 11.0.3 - lodash-es: 4.17.21 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.9) - '@chevrotain/regexp-to-ast@11.0.3': {} + '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.9) - '@chevrotain/types@11.0.3': {} + '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.9) - '@chevrotain/utils@11.0.3': {} + '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@colors/colors@1.6.0': {} + '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 - '@content-collections/core@0.8.2(typescript@5.9.2)': + '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.26.9)': dependencies: - '@parcel/watcher': 2.5.1 - camelcase: 8.0.0 - esbuild: 0.25.9 - gray-matter: 4.0.3 - p-limit: 6.2.0 - picomatch: 4.0.3 - pluralize: 8.0.0 - serialize-javascript: 6.0.2 - tinyglobby: 0.2.14 - typescript: 5.9.2 - yaml: 2.8.1 - zod: 3.25.76 + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.9) - '@content-collections/integrations@0.2.1(@content-collections/core@0.8.2(typescript@5.9.2))': + '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.26.9)': dependencies: - '@content-collections/core': 0.8.2(typescript@5.9.2) + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@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))': + '@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.26.9)': 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) + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@dabh/diagnostics@2.0.8': + '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.26.9)': dependencies: - '@so-ric/colorspace': 1.1.6 - enabled: 2.0.0 - kuler: 2.0.0 + '@babel/core': 7.26.9 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color - '@dependents/detective-less@5.0.1': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.9)': dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 7.0.1 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@dimforge/rapier3d-compat@0.12.0': {} + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@drizzle-team/brocli@0.10.2': {} + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/types': 7.26.9 + transitivePeerDependencies: + - supports-color - '@effect/platform@0.90.3(effect@3.17.7)': + '@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.26.9)': 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 + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 - '@emnapi/runtime@1.5.0': + '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.26.9)': dependencies: - tslib: 2.8.1 - optional: true + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 - '@envelop/instrumentation@1.0.0': + '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.26.9)': dependencies: - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 - '@esbuild-kit/core-utils@3.3.2': + '@babel/plugin-transform-runtime@7.24.0(@babel/core@7.26.9)': dependencies: - esbuild: 0.18.20 - source-map-support: 0.5.21 + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.26.9) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.26.9) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.26.9) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-spread@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + + '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typescript@7.24.5(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) + + '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.26.9) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/preset-env@7.24.0(@babel/core@7.26.9)': + dependencies: + '@babel/compat-data': 7.26.5 + '@babel/core': 7.26.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.26.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.9) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.9) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.26.9) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.26.9) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.26.9) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.26.9) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.26.9) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-object-rest-spread': 7.24.0(@babel/core@7.26.9) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.26.9) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.26.9) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.9) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.26.9) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.26.9) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.26.9) + core-js-compat: 3.36.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@esbuild-kit/esm-loader@2.6.5': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.9)': dependencies: - '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.10.1 + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.9 + esutils: 2.0.3 - '@esbuild/aix-ppc64@0.25.10': - optional: true + '@babel/preset-react@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.26.9) + '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.23.3(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-typescript': 7.24.5(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color + + '@babel/regjsgen@0.8.0': {} + + '@babel/runtime@7.24.5': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/standalone@7.26.4': {} + + '@babel/template@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + + '@babel/traverse@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.0(supports-color@9.4.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.9': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@cloudflare/kv-asset-handler@0.3.4': + dependencies: + mime: 3.0.0 + + '@content-collections/core@0.8.2(typescript@5.6.3)': + dependencies: + '@parcel/watcher': 2.4.1 + camelcase: 8.0.0 + esbuild: 0.25.3 + gray-matter: 4.0.3 + p-limit: 6.2.0 + picomatch: 4.0.2 + pluralize: 8.0.0 + serialize-javascript: 6.0.2 + tinyglobby: 0.2.13 + typescript: 5.6.3 + yaml: 2.7.1 + zod: 3.24.1 + + '@content-collections/integrations@0.2.1(@content-collections/core@0.8.2(typescript@5.6.3))': + dependencies: + '@content-collections/core': 0.8.2(typescript@5.6.3) + + '@content-collections/vite@0.2.4(@content-collections/core@0.8.2(typescript@5.6.3))': + dependencies: + '@content-collections/core': 0.8.2(typescript@5.6.3) + '@content-collections/integrations': 0.2.1(@content-collections/core@0.8.2(typescript@5.6.3)) + + '@convex-dev/crons@0.1.5(convex@1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))': + dependencies: + convex: 1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + cron-parser: 4.9.0 + + '@convex-dev/react-query@0.0.0-alpha.8(@tanstack/react-query@5.66.9(react@19.0.0))(convex@1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))': + dependencies: + '@tanstack/react-query': 5.66.9(react@19.0.0) + convex: 1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + + '@deno/shim-deno-test@0.5.0': {} + + '@deno/shim-deno@0.19.2': + dependencies: + '@deno/shim-deno-test': 0.5.0 + which: 4.0.0 - '@esbuild/aix-ppc64@0.25.9': - optional: true + '@erquhart/convex-oss-stats@0.5.5(convex@1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(zod@3.24.1)': + dependencies: + '@convex-dev/crons': 0.1.5(convex@1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) + '@octokit/graphql': 8.1.2 + '@octokit/graphql-schema': 15.25.0 + cheerio: 1.0.0 + convex: 1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + convex-helpers: 0.1.67(convex@1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(zod@3.24.1) + date-fns: 4.1.0 + framer-motion: 11.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + nano: 10.1.4 + npm-api: 1.0.1 + octokit: 4.0.3 + p-limit: 6.2.0 + react: 19.0.0 + remeda: 2.19.0 + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - debug + - encoding + - hono + - react-dom + - zod - '@esbuild/aix-ppc64@0.27.0': + '@esbuild/aix-ppc64@0.20.2': optional: true - '@esbuild/android-arm64@0.18.20': + '@esbuild/aix-ppc64@0.23.0': optional: true - '@esbuild/android-arm64@0.25.10': + '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/android-arm64@0.25.9': + '@esbuild/aix-ppc64@0.24.2': optional: true - '@esbuild/android-arm64@0.27.0': + '@esbuild/aix-ppc64@0.25.3': optional: true - '@esbuild/android-arm@0.18.20': + '@esbuild/android-arm64@0.20.2': optional: true - '@esbuild/android-arm@0.25.10': + '@esbuild/android-arm64@0.23.0': optional: true - '@esbuild/android-arm@0.25.9': + '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm@0.27.0': + '@esbuild/android-arm64@0.24.2': optional: true - '@esbuild/android-x64@0.18.20': + '@esbuild/android-arm64@0.25.3': optional: true - '@esbuild/android-x64@0.25.10': + '@esbuild/android-arm@0.20.2': optional: true - '@esbuild/android-x64@0.25.9': + '@esbuild/android-arm@0.23.0': optional: true - '@esbuild/android-x64@0.27.0': + '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/darwin-arm64@0.18.20': + '@esbuild/android-arm@0.24.2': optional: true - '@esbuild/darwin-arm64@0.25.10': + '@esbuild/android-arm@0.25.3': optional: true - '@esbuild/darwin-arm64@0.25.9': + '@esbuild/android-x64@0.20.2': optional: true - '@esbuild/darwin-arm64@0.27.0': + '@esbuild/android-x64@0.23.0': optional: true - '@esbuild/darwin-x64@0.18.20': + '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/darwin-x64@0.25.10': + '@esbuild/android-x64@0.24.2': optional: true - '@esbuild/darwin-x64@0.25.9': + '@esbuild/android-x64@0.25.3': optional: true - '@esbuild/darwin-x64@0.27.0': + '@esbuild/darwin-arm64@0.20.2': optional: true - '@esbuild/freebsd-arm64@0.18.20': + '@esbuild/darwin-arm64@0.23.0': optional: true - '@esbuild/freebsd-arm64@0.25.10': + '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.25.9': + '@esbuild/darwin-arm64@0.24.2': optional: true - '@esbuild/freebsd-arm64@0.27.0': + '@esbuild/darwin-arm64@0.25.3': optional: true - '@esbuild/freebsd-x64@0.18.20': + '@esbuild/darwin-x64@0.20.2': optional: true - '@esbuild/freebsd-x64@0.25.10': + '@esbuild/darwin-x64@0.23.0': optional: true - '@esbuild/freebsd-x64@0.25.9': + '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.27.0': + '@esbuild/darwin-x64@0.24.2': optional: true - '@esbuild/linux-arm64@0.18.20': + '@esbuild/darwin-x64@0.25.3': optional: true - '@esbuild/linux-arm64@0.25.10': + '@esbuild/freebsd-arm64@0.20.2': optional: true - '@esbuild/linux-arm64@0.25.9': + '@esbuild/freebsd-arm64@0.23.0': optional: true - '@esbuild/linux-arm64@0.27.0': + '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/linux-arm@0.18.20': + '@esbuild/freebsd-arm64@0.24.2': optional: true - '@esbuild/linux-arm@0.25.10': + '@esbuild/freebsd-arm64@0.25.3': optional: true - '@esbuild/linux-arm@0.25.9': + '@esbuild/freebsd-x64@0.20.2': optional: true - '@esbuild/linux-arm@0.27.0': + '@esbuild/freebsd-x64@0.23.0': optional: true - '@esbuild/linux-ia32@0.18.20': + '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/linux-ia32@0.25.10': + '@esbuild/freebsd-x64@0.24.2': optional: true - '@esbuild/linux-ia32@0.25.9': + '@esbuild/freebsd-x64@0.25.3': optional: true - '@esbuild/linux-ia32@0.27.0': + '@esbuild/linux-arm64@0.20.2': optional: true - '@esbuild/linux-loong64@0.18.20': + '@esbuild/linux-arm64@0.23.0': optional: true - '@esbuild/linux-loong64@0.25.10': + '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-loong64@0.25.9': + '@esbuild/linux-arm64@0.24.2': optional: true - '@esbuild/linux-loong64@0.27.0': + '@esbuild/linux-arm64@0.25.3': optional: true - '@esbuild/linux-mips64el@0.18.20': + '@esbuild/linux-arm@0.20.2': optional: true - '@esbuild/linux-mips64el@0.25.10': + '@esbuild/linux-arm@0.23.0': optional: true - '@esbuild/linux-mips64el@0.25.9': + '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-mips64el@0.27.0': + '@esbuild/linux-arm@0.24.2': optional: true - '@esbuild/linux-ppc64@0.18.20': + '@esbuild/linux-arm@0.25.3': optional: true - '@esbuild/linux-ppc64@0.25.10': + '@esbuild/linux-ia32@0.20.2': optional: true - '@esbuild/linux-ppc64@0.25.9': + '@esbuild/linux-ia32@0.23.0': optional: true - '@esbuild/linux-ppc64@0.27.0': + '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-riscv64@0.18.20': + '@esbuild/linux-ia32@0.24.2': optional: true - '@esbuild/linux-riscv64@0.25.10': + '@esbuild/linux-ia32@0.25.3': optional: true - '@esbuild/linux-riscv64@0.25.9': + '@esbuild/linux-loong64@0.20.2': optional: true - '@esbuild/linux-riscv64@0.27.0': + '@esbuild/linux-loong64@0.23.0': optional: true - '@esbuild/linux-s390x@0.18.20': + '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-s390x@0.25.10': + '@esbuild/linux-loong64@0.24.2': optional: true - '@esbuild/linux-s390x@0.25.9': + '@esbuild/linux-loong64@0.25.3': optional: true - '@esbuild/linux-s390x@0.27.0': + '@esbuild/linux-mips64el@0.20.2': optional: true - '@esbuild/linux-x64@0.18.20': + '@esbuild/linux-mips64el@0.23.0': optional: true - '@esbuild/linux-x64@0.25.10': + '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-x64@0.25.9': + '@esbuild/linux-mips64el@0.24.2': optional: true - '@esbuild/linux-x64@0.27.0': + '@esbuild/linux-mips64el@0.25.3': optional: true - '@esbuild/netbsd-arm64@0.25.10': + '@esbuild/linux-ppc64@0.20.2': optional: true - '@esbuild/netbsd-arm64@0.25.9': + '@esbuild/linux-ppc64@0.23.0': optional: true - '@esbuild/netbsd-arm64@0.27.0': + '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.18.20': + '@esbuild/linux-ppc64@0.24.2': optional: true - '@esbuild/netbsd-x64@0.25.10': + '@esbuild/linux-ppc64@0.25.3': optional: true - '@esbuild/netbsd-x64@0.25.9': + '@esbuild/linux-riscv64@0.20.2': optional: true - '@esbuild/netbsd-x64@0.27.0': + '@esbuild/linux-riscv64@0.23.0': optional: true - '@esbuild/openbsd-arm64@0.25.10': + '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.25.9': + '@esbuild/linux-riscv64@0.24.2': optional: true - '@esbuild/openbsd-arm64@0.27.0': + '@esbuild/linux-riscv64@0.25.3': optional: true - '@esbuild/openbsd-x64@0.18.20': + '@esbuild/linux-s390x@0.20.2': optional: true - '@esbuild/openbsd-x64@0.25.10': + '@esbuild/linux-s390x@0.23.0': optional: true - '@esbuild/openbsd-x64@0.25.9': + '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/openbsd-x64@0.27.0': + '@esbuild/linux-s390x@0.24.2': optional: true - '@esbuild/openharmony-arm64@0.25.10': + '@esbuild/linux-s390x@0.25.3': optional: true - '@esbuild/openharmony-arm64@0.25.9': + '@esbuild/linux-x64@0.20.2': optional: true - '@esbuild/openharmony-arm64@0.27.0': + '@esbuild/linux-x64@0.23.0': optional: true - '@esbuild/sunos-x64@0.18.20': + '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.25.10': + '@esbuild/linux-x64@0.24.2': optional: true - '@esbuild/sunos-x64@0.25.9': + '@esbuild/linux-x64@0.25.3': optional: true - '@esbuild/sunos-x64@0.27.0': + '@esbuild/netbsd-arm64@0.24.2': optional: true - '@esbuild/win32-arm64@0.18.20': + '@esbuild/netbsd-arm64@0.25.3': optional: true - '@esbuild/win32-arm64@0.25.10': + '@esbuild/netbsd-x64@0.20.2': optional: true - '@esbuild/win32-arm64@0.25.9': + '@esbuild/netbsd-x64@0.23.0': optional: true - '@esbuild/win32-arm64@0.27.0': + '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/win32-ia32@0.18.20': + '@esbuild/netbsd-x64@0.24.2': optional: true - '@esbuild/win32-ia32@0.25.10': + '@esbuild/netbsd-x64@0.25.3': optional: true - '@esbuild/win32-ia32@0.25.9': + '@esbuild/openbsd-arm64@0.23.0': optional: true - '@esbuild/win32-ia32@0.27.0': + '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/win32-x64@0.18.20': + '@esbuild/openbsd-arm64@0.24.2': optional: true - '@esbuild/win32-x64@0.25.10': + '@esbuild/openbsd-arm64@0.25.3': optional: true - '@esbuild/win32-x64@0.25.9': + '@esbuild/openbsd-x64@0.20.2': optional: true - '@esbuild/win32-x64@0.27.0': + '@esbuild/openbsd-x64@0.23.0': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.0))': - dependencies: - eslint: 9.39.1(jiti@2.6.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/eslintrc@3.3.3': - dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 3.14.2 - 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 - - '@fastify/accept-negotiator@2.0.1': {} - - '@fastify/busboy@3.2.0': {} - - '@floating-ui/core@1.6.9': - dependencies: - '@floating-ui/utils': 0.2.9 - - '@floating-ui/dom@1.6.13': - dependencies: - '@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)': - dependencies: - '@floating-ui/dom': 1.6.13 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - - '@floating-ui/react@0.27.8(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) - '@floating-ui/utils': 0.2.9 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - 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)': - dependencies: - hono: 4.11.3 - - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.7': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.4.3 - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/momoa@2.0.4': {} - - '@humanwhocodes/retry@0.4.3': {} - - '@iarna/toml@2.2.5': {} - - '@iconify/types@2.0.0': {} - - '@iconify/utils@3.0.1': - dependencies: - '@antfu/install-pkg': 1.1.0 - '@antfu/utils': 9.2.0 - '@iconify/types': 2.0.0 - debug: 4.4.1 - globals: 15.15.0 - kolorist: 1.8.0 - local-pkg: 1.1.2 - mlly: 1.7.4 - transitivePeerDependencies: - - supports-color - - '@img/colour@1.0.0': {} - - '@img/sharp-darwin-arm64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.3 + '@esbuild/openbsd-x64@0.23.1': optional: true - '@img/sharp-darwin-x64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.3 + '@esbuild/openbsd-x64@0.24.2': optional: true - '@img/sharp-libvips-darwin-arm64@1.2.3': + '@esbuild/openbsd-x64@0.25.3': optional: true - '@img/sharp-libvips-darwin-x64@1.2.3': + '@esbuild/sunos-x64@0.20.2': optional: true - '@img/sharp-libvips-linux-arm64@1.2.3': + '@esbuild/sunos-x64@0.23.0': optional: true - '@img/sharp-libvips-linux-arm@1.2.3': + '@esbuild/sunos-x64@0.23.1': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.3': + '@esbuild/sunos-x64@0.24.2': optional: true - '@img/sharp-libvips-linux-s390x@1.2.3': + '@esbuild/sunos-x64@0.25.3': optional: true - '@img/sharp-libvips-linux-x64@1.2.3': + '@esbuild/win32-arm64@0.20.2': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + '@esbuild/win32-arm64@0.23.0': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.3': + '@esbuild/win32-arm64@0.23.1': optional: true - '@img/sharp-linux-arm64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.3 + '@esbuild/win32-arm64@0.24.2': optional: true - '@img/sharp-linux-arm@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.3 + '@esbuild/win32-arm64@0.25.3': optional: true - '@img/sharp-linux-ppc64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@esbuild/win32-ia32@0.20.2': optional: true - '@img/sharp-linux-s390x@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.3 + '@esbuild/win32-ia32@0.23.0': optional: true - '@img/sharp-linux-x64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.3 + '@esbuild/win32-ia32@0.23.1': optional: true - '@img/sharp-linuxmusl-arm64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@esbuild/win32-ia32@0.24.2': optional: true - '@img/sharp-linuxmusl-x64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 + '@esbuild/win32-ia32@0.25.3': optional: true - '@img/sharp-wasm32@0.34.4': - dependencies: - '@emnapi/runtime': 1.5.0 + '@esbuild/win32-x64@0.20.2': optional: true - '@img/sharp-win32-arm64@0.34.4': + '@esbuild/win32-x64@0.23.0': optional: true - '@img/sharp-win32-ia32@0.34.4': + '@esbuild/win32-x64@0.23.1': optional: true - '@img/sharp-win32-x64@0.34.4': + '@esbuild/win32-x64@0.24.2': optional: true - '@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 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - 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 + '@esbuild/win32-x64@0.25.3': 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)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': 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)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)': - 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 - - '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - tslib: 2.8.1 - - '@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 - - '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)': - 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 - - '@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 - - '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': - 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 - - '@jsonjoy.com/json-pack@17.65.0(tslib@2.8.1)': - 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 - - '@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 - - '@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 - - '@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 - - '@jsonjoy.com/util@17.65.0(tslib@2.8.1)': - 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 + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 - '@juggle/resize-observer@3.4.0': {} + '@eslint-community/regexpp@4.10.0': {} - '@mapbox/node-pre-gyp@2.0.0': + '@eslint/eslintrc@2.1.4': dependencies: - consola: 3.4.2 - detect-libc: 2.0.4 - https-proxy-agent: 7.0.6 - node-fetch: 2.7.0 - nopt: 8.1.0 - semver: 7.7.3 - tar: 7.4.3 + ajv: 6.12.6 + debug: 4.4.0(supports-color@9.4.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 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 + '@eslint/js@8.57.0': {} - '@monogrid/gainmap-js@3.4.0(three@0.182.0)': + '@floating-ui/core@1.6.9': 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 + '@floating-ui/utils': 0.2.9 - '@neondatabase/serverless@0.10.4': + '@floating-ui/dom@1.6.13': dependencies: - '@types/pg': 8.11.6 + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 - '@netlify/api@14.0.6': + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@netlify/open-api': 2.39.0 - node-fetch: 3.3.2 - p-wait-for: 5.0.2 - picoquery: 2.5.0 - - '@netlify/binary-info@1.0.0': {} + '@floating-ui/dom': 1.6.13 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@netlify/blobs@10.0.11': + '@floating-ui/react@0.27.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@netlify/dev-utils': 4.2.0 - '@netlify/runtime-utils': 2.1.0 + '@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.0.0 + react-dom: 19.0.0(react@19.0.0) + tabbable: 6.2.0 - '@netlify/cache@3.1.1': - dependencies: - '@netlify/runtime-utils': 2.1.0 + '@floating-ui/utils@0.2.9': {} - '@netlify/config@23.2.0': + '@headlessui/react@1.7.18(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@iarna/toml': 2.2.5 - '@netlify/api': 14.0.6 - '@netlify/headers-parser': 9.0.2 - '@netlify/redirect-parser': 15.0.3 - chalk: 5.6.2 - cron-parser: 4.9.0 - deepmerge: 4.3.1 - dot-prop: 9.0.0 - execa: 8.0.1 - fast-safe-stringify: 2.1.1 - figures: 6.1.0 - filter-obj: 6.1.0 - find-up: 7.0.0 - indent-string: 5.0.0 - is-plain-obj: 4.1.0 - map-obj: 5.0.2 - omit.js: 2.0.2 - p-locate: 6.0.0 - path-type: 6.0.0 - read-package-up: 11.0.0 - tomlify-j0.4: 3.0.0 - validate-npm-package-name: 5.0.1 - yaml: 2.8.1 - yargs: 17.7.2 + '@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) - '@netlify/dev-utils@4.2.0': + '@humanwhocodes/config-array@0.11.14': dependencies: - '@whatwg-node/server': 0.10.13 - ansis: 4.1.0 - chokidar: 4.0.3 - decache: 4.6.2 - dettle: 1.0.5 - dot-prop: 9.0.0 - empathic: 2.0.0 - env-paths: 3.0.0 - image-size: 2.0.2 - js-image-generator: 1.0.4 - parse-gitignore: 2.0.0 - semver: 7.7.2 - tmp-promise: 3.0.3 - 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))': - 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/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/redirects': 3.0.13 - '@netlify/runtime': 4.0.16 - '@netlify/static': 3.0.11 - ulid: 3.0.1 + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.4.0(supports-color@9.4.0) + minimatch: 3.1.2 transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - db0 - - encoding - - idb-keyval - - ioredis - - react-native-b4a - - rollup - supports-color - - uploadthing - - '@netlify/edge-bundler@14.5.6': - dependencies: - '@import-maps/resolve': 2.0.0 - ajv: 8.17.1 - ajv-errors: 3.0.0(ajv@8.17.1) - better-ajv-errors: 1.2.0(ajv@8.17.1) - common-path-prefix: 3.0.0 - env-paths: 3.0.0 - esbuild: 0.25.10 - execa: 8.0.1 - find-up: 7.0.0 - get-port: 7.1.0 - node-stream-zip: 1.15.0 - p-retry: 6.2.1 - p-wait-for: 5.0.2 - parse-imports: 2.2.1 - path-key: 4.0.0 - semver: 7.7.3 - tar: 7.4.3 - tmp-promise: 3.0.3 - urlpattern-polyfill: 8.0.2 - uuid: 11.1.0 - - '@netlify/edge-functions-bootstrap@2.16.0': {} - - '@netlify/edge-functions@2.18.2': - dependencies: - '@netlify/dev-utils': 4.2.0 - '@netlify/edge-bundler': 14.5.6 - '@netlify/edge-functions-bootstrap': 2.16.0 - '@netlify/runtime-utils': 2.1.0 - '@netlify/types': 2.0.3 - get-port: 7.1.0 - '@netlify/functions@4.2.7(rollup@4.53.3)': - 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) - cron-parser: 4.9.0 - decache: 4.6.2 - extract-zip: 2.0.1 - is-stream: 4.0.1 - jwt-decode: 4.0.0 - lambda-local: 2.2.0 - read-package-up: 11.0.0 - source-map-support: 0.5.21 - transitivePeerDependencies: - - encoding - - react-native-b4a - - rollup - - supports-color + '@humanwhocodes/module-importer@1.0.1': {} - '@netlify/functions@5.1.0': - dependencies: - '@netlify/types': 2.2.0 + '@humanwhocodes/object-schema@2.0.2': {} - '@netlify/headers-parser@9.0.2': - dependencies: - '@iarna/toml': 2.2.5 - escape-string-regexp: 5.0.0 - fast-safe-stringify: 2.1.1 - is-plain-obj: 4.1.0 - map-obj: 5.0.2 - path-exists: 5.0.0 + '@ioredis/commands@1.2.0': {} - '@netlify/headers@2.0.12': + '@isaacs/cliui@8.0.2': dependencies: - '@netlify/headers-parser': 9.0.2 + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - '@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))': + '@isaacs/fs-minipass@4.0.1': 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)) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - db0 - - idb-keyval - - ioredis - - uploadthing + minipass: 7.1.2 - '@netlify/neon@0.1.0': + '@jridgewell/gen-mapping@0.3.8': dependencies: - '@neondatabase/serverless': 0.10.4 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 - '@netlify/open-api@2.39.0': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@netlify/redirect-parser@15.0.3': - dependencies: - '@iarna/toml': 2.2.5 - fast-safe-stringify: 2.1.1 - is-plain-obj: 4.1.0 - path-exists: 5.0.0 + '@jridgewell/set-array@1.2.1': {} - '@netlify/redirects@3.0.13': + '@jridgewell/source-map@0.3.6': dependencies: - '@netlify/dev-utils': 4.2.0 - '@netlify/redirect-parser': 15.0.3 - cookie: 1.0.2 - jsonwebtoken: 9.0.2 - netlify-redirector: 0.5.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - '@netlify/runtime-utils@2.1.0': {} + '@jridgewell/sourcemap-codec@1.5.0': {} - '@netlify/runtime@4.0.16': + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@netlify/blobs': 10.0.11 - '@netlify/cache': 3.1.1 - '@netlify/runtime-utils': 2.1.0 - '@netlify/types': 2.0.3 - - '@netlify/serverless-functions-api@2.6.0': {} + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - '@netlify/static@3.0.11': - dependencies: - mime-types: 3.0.2 + '@juggle/resize-observer@3.4.0': {} - '@netlify/types@2.0.3': {} + '@lit-labs/ssr-dom-shim@1.2.1': {} - '@netlify/types@2.2.0': {} + '@lit/reactive-element@2.0.4': + dependencies: + '@lit-labs/ssr-dom-shim': 1.2.1 - '@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))': + '@mapbox/node-pre-gyp@2.0.0-rc.0': 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) - 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)) + consola: 3.4.0 + detect-libc: 2.0.3 + https-proxy-agent: 7.0.6(supports-color@9.4.0) + node-fetch: 2.7.0 + nopt: 8.0.0 + semver: 7.6.3 + tar: 7.4.3 transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - babel-plugin-macros - - db0 - encoding - - idb-keyval - - ioredis - - react-native-b4a - - rollup - 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/functions@2.8.2': 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-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) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - babel-plugin-macros - - db0 - - encoding - - idb-keyval - - ioredis - - react-native-b4a - - rollup - - supports-color - - uploadthing + '@netlify/serverless-functions-api': 1.26.1 - '@netlify/zip-it-and-ship-it@14.1.8(rollup@4.53.3)': + '@netlify/node-cookies@0.1.0': {} + + '@netlify/serverless-functions-api@1.26.1': 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) - archiver: 7.0.1 - common-path-prefix: 3.0.0 - copy-file: 11.1.0 - es-module-lexer: 1.7.0 - esbuild: 0.25.10 - execa: 8.0.1 - fast-glob: 3.3.3 - filter-obj: 6.1.0 - find-up: 7.0.0 - is-path-inside: 4.0.0 - junk: 4.0.1 - locate-path: 7.2.0 - merge-options: 3.0.4 - minimatch: 9.0.5 - normalize-path: 3.0.0 - p-map: 7.0.3 - path-exists: 5.0.0 - precinct: 12.2.0 - require-package-name: 2.0.1 - resolve: 2.0.0-next.5 - semver: 7.7.3 - tmp-promise: 3.0.3 - toml: 3.0.0 - unixify: 1.0.0 + '@netlify/node-cookies': 0.1.0 urlpattern-polyfill: 8.0.2 - yargs: 17.7.2 - zod: 3.25.76 - transitivePeerDependencies: - - encoding - - react-native-b4a - - rollup - - supports-color + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + + '@noble/hashes@1.4.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -10011,12 +9021,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: @@ -10024,992 +9034,922 @@ snapshots: interval-tree-1d: 1.0.4 isoformat: 0.2.1 - '@octokit/endpoint@9.0.2': + '@octokit/app@15.1.1': dependencies: - '@octokit/types': 12.1.1 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 + '@octokit/auth-app': 7.1.3 + '@octokit/auth-unauthenticated': 6.1.0 + '@octokit/core': 6.1.2 + '@octokit/oauth-app': 7.1.4 + '@octokit/plugin-paginate-rest': 11.3.6(@octokit/core@6.1.2) + '@octokit/types': 13.6.2 + '@octokit/webhooks': 13.4.1 - '@octokit/graphql@7.0.2': + '@octokit/auth-app@7.1.3': dependencies: - '@octokit/request': 8.1.4 - '@octokit/types': 12.1.1 - universal-user-agent: 6.0.0 + '@octokit/auth-oauth-app': 8.1.1 + '@octokit/auth-oauth-user': 5.1.1 + '@octokit/request': 9.1.4 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.6.2 + toad-cache: 3.7.0 + universal-github-app-jwt: 2.2.0 + universal-user-agent: 7.0.2 - '@octokit/openapi-types@19.0.2': {} + '@octokit/auth-oauth-app@8.1.1': + dependencies: + '@octokit/auth-oauth-device': 7.1.1 + '@octokit/auth-oauth-user': 5.1.1 + '@octokit/request': 9.1.4 + '@octokit/types': 13.6.2 + universal-user-agent: 7.0.2 - '@octokit/request-error@5.0.1': + '@octokit/auth-oauth-device@7.1.1': dependencies: - '@octokit/types': 12.1.1 - deprecation: 2.3.1 - once: 1.4.0 + '@octokit/oauth-methods': 5.1.3 + '@octokit/request': 9.1.4 + '@octokit/types': 13.6.2 + universal-user-agent: 7.0.2 - '@octokit/request@8.1.4': + '@octokit/auth-oauth-user@5.1.1': dependencies: - '@octokit/endpoint': 9.0.2 + '@octokit/auth-oauth-device': 7.1.1 + '@octokit/oauth-methods': 5.1.3 + '@octokit/request': 9.1.4 + '@octokit/types': 13.6.2 + universal-user-agent: 7.0.2 + + '@octokit/auth-token@4.0.0': {} + + '@octokit/auth-token@5.1.1': {} + + '@octokit/auth-unauthenticated@6.1.0': + dependencies: + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.6.2 + + '@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.2': dependencies: - '@octokit/openapi-types': 19.0.2 + '@octokit/auth-token': 5.1.1 + '@octokit/graphql': 8.1.2 + '@octokit/request': 9.1.4 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.6.2 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.2 - '@oozcitak/dom@2.0.2': + '@octokit/endpoint@10.1.2': dependencies: - '@oozcitak/infra': 2.0.2 - '@oozcitak/url': 3.0.0 - '@oozcitak/util': 10.0.0 + '@octokit/types': 13.6.2 + universal-user-agent: 7.0.2 - '@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.25.0': dependencies: - '@oozcitak/infra': 2.0.2 - '@oozcitak/util': 10.0.0 - - '@oozcitak/util@10.0.0': {} + graphql: 16.10.0 + graphql-tag: 2.12.6(graphql@16.10.0) - '@opentelemetry/api-logs@0.208.0': + '@octokit/graphql@7.0.2': dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api@1.9.0': {} + '@octokit/request': 8.1.4 + '@octokit/types': 12.1.1 + universal-user-agent: 6.0.0 - '@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0)': + '@octokit/graphql@8.1.2': dependencies: - '@opentelemetry/api': 1.9.0 + '@octokit/request': 9.1.4 + '@octokit/types': 13.6.2 + universal-user-agent: 7.0.2 - '@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0)': + '@octokit/oauth-app@7.1.4': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 + '@octokit/auth-oauth-app': 8.1.1 + '@octokit/auth-oauth-user': 5.1.1 + '@octokit/auth-unauthenticated': 6.1.0 + '@octokit/core': 6.1.2 + '@octokit/oauth-authorization-url': 7.1.1 + '@octokit/oauth-methods': 5.1.3 + '@types/aws-lambda': 8.10.146 + universal-user-agent: 7.0.2 - '@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 + '@octokit/oauth-authorization-url@7.1.1': {} - '@opentelemetry/instrumentation-amqplib@0.55.0(@opentelemetry/api@1.9.0)': + '@octokit/oauth-methods@5.1.3': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/oauth-authorization-url': 7.1.1 + '@octokit/request': 9.1.4 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.6.2 - '@opentelemetry/instrumentation-connect@0.52.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - '@types/connect': 3.4.38 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-types@19.0.2': {} - '@opentelemetry/instrumentation-dataloader@0.26.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/openapi-types@22.2.0': {} - '@opentelemetry/instrumentation-express@0.57.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-webhooks-types@8.5.1': {} - '@opentelemetry/instrumentation-fs@0.28.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-paginate-graphql@5.2.4(@octokit/core@6.1.2)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/core': 6.1.2 - '@opentelemetry/instrumentation-generic-pool@0.52.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-paginate-rest@11.3.6(@octokit/core@6.1.2)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/core': 6.1.2 + '@octokit/types': 13.6.2 - '@opentelemetry/instrumentation-graphql@0.56.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/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/core': 5.0.1 + '@octokit/types': 12.1.1 - '@opentelemetry/instrumentation-hapi@0.55.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.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - transitivePeerDependencies: - - supports-color + '@octokit/core': 5.0.1 - '@opentelemetry/instrumentation-http@0.208.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/core': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - forwarded-parse: 2.1.2 - transitivePeerDependencies: - - supports-color + '@octokit/core': 5.0.1 + '@octokit/types': 12.1.1 - '@opentelemetry/instrumentation-ioredis@0.56.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-rest-endpoint-methods@13.2.6(@octokit/core@6.1.2)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.2 - transitivePeerDependencies: - - supports-color + '@octokit/core': 6.1.2 + '@octokit/types': 13.6.2 - '@opentelemetry/instrumentation-kafkajs@0.18.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-retry@7.1.2(@octokit/core@6.1.2)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - transitivePeerDependencies: - - supports-color + '@octokit/core': 6.1.2 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.6.2 + bottleneck: 2.19.5 - '@opentelemetry/instrumentation-knex@0.53.0(@opentelemetry/api@1.9.0)': + '@octokit/plugin-throttling@9.3.2(@octokit/core@6.1.2)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - transitivePeerDependencies: - - supports-color + '@octokit/core': 6.1.2 + '@octokit/types': 13.6.2 + bottleneck: 2.19.5 - '@opentelemetry/instrumentation-koa@0.57.0(@opentelemetry/api@1.9.0)': + '@octokit/request-error@5.0.1': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - transitivePeerDependencies: - - supports-color + '@octokit/types': 12.1.1 + deprecation: 2.3.1 + once: 1.4.0 - '@opentelemetry/instrumentation-lru-memoizer@0.53.0(@opentelemetry/api@1.9.0)': + '@octokit/request-error@6.1.6': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/types': 13.6.2 - '@opentelemetry/instrumentation-mongodb@0.61.0(@opentelemetry/api@1.9.0)': + '@octokit/request@8.1.4': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.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-mongoose@0.55.0(@opentelemetry/api@1.9.0)': + '@octokit/request@9.1.4': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + '@octokit/endpoint': 10.1.2 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.6.2 + fast-content-type-parse: 2.0.0 + universal-user-agent: 7.0.2 - '@opentelemetry/instrumentation-mysql2@0.55.0(@opentelemetry/api@1.9.0)': + '@octokit/rest@20.0.2': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - '@opentelemetry/sql-common': 0.41.2(@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-mysql@0.54.0(@opentelemetry/api@1.9.0)': + '@octokit/types@12.1.1': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@types/mysql': 2.15.27 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-types': 19.0.2 - '@opentelemetry/instrumentation-pg@0.61.0(@opentelemetry/api@1.9.0)': + '@octokit/types@13.6.2': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) - '@types/pg': 8.15.6 - '@types/pg-pool': 2.0.6 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-types': 22.2.0 - '@opentelemetry/instrumentation-redis@0.57.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.38.0 - transitivePeerDependencies: - - supports-color + '@octokit/webhooks-methods@5.1.0': {} - '@opentelemetry/instrumentation-tedious@0.27.0(@opentelemetry/api@1.9.0)': + '@octokit/webhooks@13.4.1': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@types/tedious': 4.0.14 - transitivePeerDependencies: - - supports-color + '@octokit/openapi-webhooks-types': 8.5.1 + '@octokit/request-error': 6.1.6 + '@octokit/webhooks-methods': 5.1.0 - '@opentelemetry/instrumentation-undici@0.19.0(@opentelemetry/api@1.9.0)': + '@orama/cuid2@2.2.3': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - transitivePeerDependencies: - - supports-color + '@noble/hashes': 1.4.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.1 - require-in-the-middle: 8.0.1 - transitivePeerDependencies: - - supports-color + '@orama/highlight@0.1.8': {} - '@opentelemetry/redis-common@0.38.2': {} + '@orama/orama@3.0.3': {} - '@opentelemetry/resources@2.3.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/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@orama/wc-components': 0.1.23 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0)': + '@orama/switch@3.0.3(@orama/orama@3.0.3)(@oramacloud/client@2.1.4)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@orama/orama': 3.0.3 + '@oramacloud/client': 2.1.4 - '@opentelemetry/semantic-conventions@1.38.0': {} - - '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': + '@orama/wc-components@0.1.23': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.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.1.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 - '@panva/hkdf@1.2.1': {} + '@oramacloud/client@2.1.4': + dependencies: + '@orama/cuid2': 2.2.3 + '@orama/orama': 3.0.3 + lodash: 4.17.21 - '@parcel/watcher-android-arm64@2.5.1': + '@parcel/watcher-android-arm64@2.4.1': optional: true - '@parcel/watcher-darwin-arm64@2.5.1': + '@parcel/watcher-darwin-arm64@2.4.1': optional: true - '@parcel/watcher-darwin-x64@2.5.1': + '@parcel/watcher-darwin-x64@2.4.1': optional: true - '@parcel/watcher-freebsd-x64@2.5.1': + '@parcel/watcher-freebsd-x64@2.4.1': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': + '@parcel/watcher-linux-arm-glibc@2.4.1': optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': + '@parcel/watcher-linux-arm64-glibc@2.4.1': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': + '@parcel/watcher-linux-arm64-musl@2.4.1': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': + '@parcel/watcher-linux-x64-glibc@2.4.1': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': + '@parcel/watcher-linux-x64-musl@2.4.1': optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': - optional: true + '@parcel/watcher-wasm@2.3.0': + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.8 - '@parcel/watcher-wasm@2.5.1': + '@parcel/watcher-wasm@2.4.1': dependencies: is-glob: 4.0.3 micromatch: 4.0.8 - '@parcel/watcher-win32-arm64@2.5.1': + '@parcel/watcher-win32-arm64@2.4.1': optional: true - '@parcel/watcher-win32-ia32@2.5.1': + '@parcel/watcher-win32-ia32@2.4.1': optional: true - '@parcel/watcher-win32-x64@2.5.1': + '@parcel/watcher-win32-x64@2.4.1': optional: true - '@parcel/watcher@2.5.1': + '@parcel/watcher@2.4.1': dependencies: detect-libc: 1.0.3 is-glob: 4.0.3 micromatch: 4.0.8 node-addon-api: 7.1.1 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 + '@parcel/watcher-android-arm64': 2.4.1 + '@parcel/watcher-darwin-arm64': 2.4.1 + '@parcel/watcher-darwin-x64': 2.4.1 + '@parcel/watcher-freebsd-x64': 2.4.1 + '@parcel/watcher-linux-arm-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-musl': 2.4.1 + '@parcel/watcher-linux-x64-glibc': 2.4.1 + '@parcel/watcher-linux-x64-musl': 2.4.1 + '@parcel/watcher-win32-arm64': 2.4.1 + '@parcel/watcher-win32-ia32': 2.4.1 + '@parcel/watcher-win32-x64': 2.4.1 + + '@phosphor-icons/webcomponents@2.1.5': + dependencies: + lit: 3.2.0 '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.57.0': + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.2': {} + + '@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: - playwright: 1.57.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) + 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 - '@posthog/core@1.9.1': + '@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: - cross-spawn: 7.0.6 + '@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': 18.3.12 + '@types/react-dom': 18.3.1 - '@prisma/instrumentation@6.19.0(@opentelemetry/api@1.9.0)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.12)(react@19.0.0)': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color + react: 19.0.0 + optionalDependencies: + '@types/react': 18.3.12 - '@radix-ui/primitive@1.1.2': {} + '@radix-ui/react-context@1.1.2(@types/react@18.3.12)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 18.3.12 - '@radix-ui/primitive@1.1.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.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.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': 18.3.12 + '@types/react-dom': 18.3.1 - '@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-direction@1.1.1(@types/react@18.3.12)(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) - 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-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-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/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/primitive': 1.1.2 + '@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-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-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/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/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-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-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-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-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) + 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-compose-refs@1.1.2(@types/react@19.2.10)(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: - 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': 18.3.12 + '@types/react-dom': 18.3.1 - '@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@18.3.12)(react@19.0.0)': dependencies: - 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 - - '@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)': - 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) + '@types/react': 18.3.12 + + '@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@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': 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.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-direction@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@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: - 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) + '@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': 18.3.12 + '@types/react-dom': 18.3.1 - '@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-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/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-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-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-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/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-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-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-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/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) + '@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-focus-guards@1.1.2(@types/react@19.2.10)(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: - react: 19.2.3 + '@radix-ui/number': 1.1.1 + '@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-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': 18.3.12 + '@types/react-dom': 18.3.1 - '@radix-ui/react-focus-guards@1.1.3(@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: - 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-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-use-callback-ref@1.1.1(@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-use-controllable-state@1.2.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.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-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-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 - '@radix-ui/react-id@1.1.1(@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-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-use-escape-keydown@1.1.1(@types/react@18.3.12)(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) - 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) - 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) - '@radix-ui/rect': 1.1.1 - 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-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) + '@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-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 - '@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-use-layout-effect@1.1.1(@types/react@18.3.12)(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) + 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-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-use-previous@1.1.1(@types/react@18.3.12)(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) + 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-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-use-rect@1.1.1(@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-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/rect': 1.1.1 + 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-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-use-size@1.1.1(@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-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-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-dom': 19.2.3(@types/react@19.2.10) + '@types/react': 18.3.12 - '@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-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-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-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/rect@1.1.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)': + '@redocly/ajv@8.11.2': 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) - optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/config@0.17.1': {} + + '@redocly/openapi-core@1.26.0(supports-color@9.4.0)': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.17.1 + colorette: 1.4.0 + https-proxy-agent: 7.0.6(supports-color@9.4.0) + js-levenshtein: 1.1.6 + js-yaml: 4.1.0 + lodash.isequal: 4.5.0 + minimatch: 5.1.6 + node-fetch: 2.7.0 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - encoding + - supports-color - '@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)': + '@remix-run/node@2.8.1(typescript@5.6.3)': 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-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) + '@remix-run/server-runtime': 2.8.1(typescript@5.6.3) + '@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: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + typescript: 5.6.3 - '@radix-ui/react-slot@1.2.0(@types/react@19.2.10)(react@19.2.3)': + '@remix-run/router@1.15.3': {} + + '@remix-run/server-runtime@2.8.1(typescript@5.6.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - 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.6.0 + source-map: 0.7.4 optionalDependencies: - '@types/react': 19.2.10 + typescript: 5.6.3 - '@radix-ui/react-slot@1.2.3(@types/react@19.2.10)(react@19.2.3)': + '@remix-run/web-blob@3.1.0': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.10 - - '@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)': - 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) - optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) - - '@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)': - 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) - optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@remix-run/web-stream': 1.1.0 + web-encoding: 1.1.5 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@remix-run/web-fetch@4.4.2': dependencies: - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.10 + '@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 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.10)(react@19.2.3)': + '@remix-run/web-file@3.1.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 - optionalDependencies: - '@types/react': 19.2.10 + '@remix-run/web-blob': 3.1.0 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.10)(react@19.2.3)': + '@remix-run/web-form-data@3.1.0': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.10 + web-encoding: 1.1.5 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@remix-run/web-stream@1.1.0': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 + web-streams-polyfill: 3.3.3 + + '@rollup/plugin-alias@5.1.1(rollup@4.32.1)': optionalDependencies: - '@types/react': 19.2.10 + rollup: 4.32.1 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.32.1)': dependencies: - react: 19.2.3 + '@rollup/pluginutils': 5.1.3(rollup@4.32.1) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.2(picomatch@4.0.2) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.2 optionalDependencies: - '@types/react': 19.2.10 + rollup: 4.32.1 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@rollup/plugin-inject@5.0.5(rollup@4.32.1)': dependencies: - '@radix-ui/rect': 1.1.1 - react: 19.2.3 + '@rollup/pluginutils': 5.1.3(rollup@4.32.1) + estree-walker: 2.0.2 + magic-string: 0.30.17 optionalDependencies: - '@types/react': 19.2.10 + rollup: 4.32.1 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.10)(react@19.2.3)': + '@rollup/plugin-json@6.1.0(rollup@4.32.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.3) - react: 19.2.3 + '@rollup/pluginutils': 5.1.3(rollup@4.32.1) optionalDependencies: - '@types/react': 19.2.10 + rollup: 4.32.1 - '@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)': + '@rollup/plugin-node-resolve@15.3.0(rollup@4.32.1)': 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) + '@rollup/pluginutils': 5.1.3(rollup@4.32.1) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) + rollup: 4.32.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)) + '@rollup/plugin-replace@6.0.1(rollup@4.32.1)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@4.32.1) + magic-string: 0.30.17 optionalDependencies: - react-dom: 19.2.3(react@19.2.3) - transitivePeerDependencies: - - '@types/react' - - '@types/three' - - immer + rollup: 4.32.1 - '@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)': + '@rollup/plugin-terser@0.4.4(rollup@4.32.1)': 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)) + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.37.0 optionalDependencies: - react-dom: 19.2.3(react@19.2.3) - transitivePeerDependencies: - - '@types/react' - - immer + rollup: 4.32.1 - '@rolldown/pluginutils@1.0.0-beta.40': {} - - '@rollup/pluginutils@5.3.0(rollup@4.53.3)': + '@rollup/pluginutils@5.1.3(rollup@4.32.1)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.2 optionalDependencies: - rollup: 4.53.3 - - '@rollup/rollup-android-arm-eabi@4.53.3': - optional: true - - '@rollup/rollup-android-arm64@4.53.3': - optional: true - - '@rollup/rollup-darwin-arm64@4.53.3': - optional: true + rollup: 4.32.1 - '@rollup/rollup-darwin-x64@4.53.3': + '@rollup/rollup-android-arm-eabi@4.32.1': optional: true - '@rollup/rollup-freebsd-arm64@4.53.3': + '@rollup/rollup-android-arm64@4.32.1': optional: true - '@rollup/rollup-freebsd-x64@4.53.3': + '@rollup/rollup-darwin-arm64@4.32.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + '@rollup/rollup-darwin-x64@4.32.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.3': + '@rollup/rollup-freebsd-arm64@4.32.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.3': + '@rollup/rollup-freebsd-x64@4.32.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.3': + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.3': + '@rollup/rollup-linux-arm-musleabihf@4.32.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.3': + '@rollup/rollup-linux-arm64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.3': + '@rollup/rollup-linux-arm64-musl@4.32.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.3': + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.3': + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-x64-musl@4.53.3': + '@rollup/rollup-linux-s390x-gnu@4.32.1': optional: true - '@rollup/rollup-openharmony-arm64@4.53.3': + '@rollup/rollup-linux-x64-gnu@4.32.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.3': + '@rollup/rollup-linux-x64-musl@4.32.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.3': + '@rollup/rollup-win32-arm64-msvc@4.32.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.3': + '@rollup/rollup-win32-ia32-msvc@4.32.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.3': + '@rollup/rollup-win32-x64-msvc@4.32.1': optional: true - '@sec-ant/readable-stream@0.4.1': {} + '@rushstack/eslint-patch@1.7.2': {} - '@sentry-internal/browser-utils@10.32.1': + '@sentry-internal/browser-utils@8.35.0': dependencies: - '@sentry/core': 10.32.1 + '@sentry/core': 8.35.0 + '@sentry/types': 8.35.0 + '@sentry/utils': 8.35.0 - '@sentry-internal/feedback@10.32.1': + '@sentry-internal/feedback@8.35.0': dependencies: - '@sentry/core': 10.32.1 + '@sentry/core': 8.35.0 + '@sentry/types': 8.35.0 + '@sentry/utils': 8.35.0 - '@sentry-internal/replay-canvas@10.32.1': + '@sentry-internal/replay-canvas@8.35.0': dependencies: - '@sentry-internal/replay': 10.32.1 - '@sentry/core': 10.32.1 + '@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.32.1': + '@sentry-internal/replay@8.35.0': dependencies: - '@sentry-internal/browser-utils': 10.32.1 - '@sentry/core': 10.32.1 + '@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@4.6.1': {} + '@sentry/babel-plugin-component-annotate@2.22.6': {} - '@sentry/browser@10.32.1': + '@sentry/browser@8.35.0': dependencies: - '@sentry-internal/browser-utils': 10.32.1 - '@sentry-internal/feedback': 10.32.1 - '@sentry-internal/replay': 10.32.1 - '@sentry-internal/replay-canvas': 10.32.1 - '@sentry/core': 10.32.1 + '@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@4.6.1': + '@sentry/bundler-plugin-core@2.22.6': dependencies: - '@babel/core': 7.28.4 - '@sentry/babel-plugin-component-annotate': 4.6.1 - '@sentry/cli': 2.58.4 - dotenv: 16.6.1 + '@babel/core': 7.26.9 + '@sentry/babel-plugin-component-annotate': 2.22.6 + '@sentry/cli': 2.38.1 + dotenv: 16.4.7 find-up: 5.0.0 - glob: 10.5.0 + glob: 9.3.5 magic-string: 0.30.8 unplugin: 1.0.1 transitivePeerDependencies: - encoding - supports-color - '@sentry/cli-darwin@2.58.4': - optional: true - - '@sentry/cli-linux-arm64@2.58.4': + '@sentry/cli-darwin@2.38.1': optional: true - '@sentry/cli-linux-arm@2.58.4': + '@sentry/cli-linux-arm64@2.38.1': optional: true - '@sentry/cli-linux-i686@2.58.4': + '@sentry/cli-linux-arm@2.38.1': optional: true - '@sentry/cli-linux-x64@2.58.4': + '@sentry/cli-linux-i686@2.38.1': optional: true - '@sentry/cli-win32-arm64@2.58.4': + '@sentry/cli-linux-x64@2.38.1': optional: true - '@sentry/cli-win32-i686@2.58.4': + '@sentry/cli-win32-i686@2.38.1': optional: true - '@sentry/cli-win32-x64@2.58.4': + '@sentry/cli-win32-x64@2.38.1': optional: true - '@sentry/cli@2.58.4': + '@sentry/cli@2.38.1': dependencies: https-proxy-agent: 5.0.1 node-fetch: 2.7.0 @@ -11017,174 +9957,40 @@ snapshots: proxy-from-env: 1.1.0 which: 2.0.2 optionalDependencies: - '@sentry/cli-darwin': 2.58.4 - '@sentry/cli-linux-arm': 2.58.4 - '@sentry/cli-linux-arm64': 2.58.4 - '@sentry/cli-linux-i686': 2.58.4 - '@sentry/cli-linux-x64': 2.58.4 - '@sentry/cli-win32-arm64': 2.58.4 - '@sentry/cli-win32-i686': 2.58.4 - '@sentry/cli-win32-x64': 2.58.4 + '@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.32.1': {} - - '@sentry/core@10.33.0': {} - - '@sentry/node-core@10.32.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': - dependencies: - '@apm-js-collab/tracing-hooks': 0.3.1 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - '@sentry/core': 10.32.1 - '@sentry/opentelemetry': 10.32.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - import-in-the-middle: 2.0.1 - transitivePeerDependencies: - - supports-color - - '@sentry/node-core@10.33.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': - dependencies: - '@apm-js-collab/tracing-hooks': 0.3.1 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - '@sentry/core': 10.33.0 - '@sentry/opentelemetry': 10.33.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - import-in-the-middle: 2.0.1 - transitivePeerDependencies: - - supports-color - - '@sentry/node@10.32.1': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.18.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.61.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.54.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.61.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.19.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - '@prisma/instrumentation': 6.19.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.32.1 - '@sentry/node-core': 10.32.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@sentry/opentelemetry': 10.32.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - import-in-the-middle: 2.0.1 - minimatch: 9.0.5 - transitivePeerDependencies: - - supports-color - - '@sentry/node@10.33.0': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.56.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.18.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.61.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.54.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.61.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.27.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.19.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - '@prisma/instrumentation': 6.19.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.33.0 - '@sentry/node-core': 10.33.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@sentry/opentelemetry': 10.33.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - import-in-the-middle: 2.0.1 - minimatch: 9.0.5 - transitivePeerDependencies: - - supports-color - - '@sentry/opentelemetry@10.32.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - '@sentry/core': 10.32.1 - - '@sentry/opentelemetry@10.33.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.3.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': + '@sentry/core@8.35.0': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.3.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 - '@sentry/core': 10.33.0 + '@sentry/types': 8.35.0 + '@sentry/utils': 8.35.0 - '@sentry/react@10.32.1(react@19.2.3)': + '@sentry/react@8.35.0(react@19.0.0)': dependencies: - '@sentry/browser': 10.32.1 - '@sentry/core': 10.32.1 + '@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.2.3 + react: 19.0.0 - '@sentry/tanstackstart-react@10.32.1(react@19.2.3)': + '@sentry/types@8.35.0': {} + + '@sentry/utils@8.35.0': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 - '@sentry-internal/browser-utils': 10.32.1 - '@sentry/core': 10.32.1 - '@sentry/node': 10.32.1 - '@sentry/react': 10.32.1(react@19.2.3) - transitivePeerDependencies: - - react - - supports-color + '@sentry/types': 8.35.0 - '@sentry/vite-plugin@4.6.1': + '@sentry/vite-plugin@2.22.6': dependencies: - '@sentry/bundler-plugin-core': 4.6.1 + '@sentry/bundler-plugin-core': 2.22.6 unplugin: 1.0.1 transitivePeerDependencies: - encoding @@ -11198,401 +10004,748 @@ snapshots: dependencies: shiki: 1.10.3 - '@sindresorhus/merge-streams@4.0.0': {} + '@sindresorhus/merge-streams@2.3.0': {} - '@so-ric/colorspace@1.1.6': - dependencies: - color: 5.0.2 - text-hex: 1.0.0 - - '@stablelib/base64@1.0.1': {} - - '@stackblitz/sdk@1.11.0': {} - - '@standard-schema/spec@1.0.0-beta.4': {} + '@stencil/core@4.20.0': {} - '@standard-schema/spec@1.1.0': {} - - '@tailwindcss/node@4.1.11': + '@stencil/store@2.0.16(@stencil/core@4.20.0)': dependencies: - '@ampproject/remapping': 2.3.0 - enhanced-resolve: 5.18.3 - jiti: 2.5.1 - lightningcss: 1.30.1 - magic-string: 0.30.17 - source-map-js: 1.2.1 - tailwindcss: 4.1.11 + '@stencil/core': 4.20.0 - '@tailwindcss/oxide-android-arm64@4.1.11': - optional: true + '@tailwindcss/typography@0.5.13(tailwindcss@3.4.1)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.1 - '@tailwindcss/oxide-darwin-arm64@4.1.11': - optional: true + '@tanstack-dev/components@1.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-icons: 5.3.0(react@19.0.0) - '@tailwindcss/oxide-darwin-x64@4.1.11': - optional: true + '@tanstack/directive-functions-plugin@1.106.0(babel-plugin-macros@3.1.0)': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + '@tanstack/router-utils': 1.102.2 + '@types/babel__code-frame': 7.0.6 + '@types/babel__core': 7.20.5 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + babel-dead-code-elimination: 1.0.9 + dedent: 1.5.3(babel-plugin-macros@3.1.0) + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color - '@tailwindcss/oxide-freebsd-x64@4.1.11': - optional: true + '@tanstack/history@1.99.13': {} - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': - optional: true + '@tanstack/pacer@0.2.0': {} - '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': - optional: true + '@tanstack/query-core@5.66.4': {} - '@tailwindcss/oxide-linux-arm64-musl@4.1.11': - optional: true + '@tanstack/react-cross-context@1.99.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@tailwindcss/oxide-linux-x64-gnu@4.1.11': - optional: true + '@tanstack/react-pacer@0.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@tanstack/pacer': 0.2.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - '@tailwindcss/oxide-linux-x64-musl@4.1.11': - optional: true + '@tanstack/react-query@5.66.9(react@19.0.0)': + dependencies: + '@tanstack/query-core': 5.66.4 + react: 19.0.0 - '@tailwindcss/oxide-wasm32-wasi@4.1.11': - optional: true + '@tanstack/react-router-with-query@1.109.2(@tanstack/react-query@5.66.9(react@19.0.0))(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@tanstack/react-query': 5.66.9(react@19.0.0) + '@tanstack/react-router': 1.109.2(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) - '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': - optional: true + '@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@tanstack/history': 1.99.13 + '@tanstack/react-store': 0.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-core': 1.108.0 + jsesc: 3.1.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 - '@tailwindcss/oxide-win32-x64-msvc@4.1.11': - optional: true + '@tanstack/react-store@0.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@tanstack/store': 0.7.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + use-sync-external-store: 1.4.0(react@19.0.0) - '@tailwindcss/oxide@4.1.11': + '@tanstack/react-virtual@3.1.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - detect-libc: 2.0.4 - tar: 7.4.3 - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.11 - '@tailwindcss/oxide-darwin-arm64': 4.1.11 - '@tailwindcss/oxide-darwin-x64': 4.1.11 - '@tailwindcss/oxide-freebsd-x64': 4.1.11 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 - '@tailwindcss/oxide-linux-x64-musl': 4.1.11 - '@tailwindcss/oxide-wasm32-wasi': 4.1.11 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 - - '@tailwindcss/typography@0.5.13(tailwindcss@4.1.11)': + '@tanstack/virtual-core': 3.1.3 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@tanstack/router-core@1.108.0': dependencies: - lodash.castarray: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - postcss-selector-parser: 6.0.10 - tailwindcss: 4.1.11 + '@tanstack/history': 1.99.13 + '@tanstack/store': 0.7.0 - '@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))': + '@tanstack/router-devtools@1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': 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/react-router': 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + clsx: 2.1.1 + goober: 2.1.16(csstype@3.1.3) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + csstype: 3.1.3 - '@tanstack/create@0.49.1(tslib@2.8.1)': + '@tanstack/router-generator@1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))': 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 + '@tanstack/virtual-file-routes': 1.99.0 + prettier: 3.5.2 + tsx: 4.19.2 + zod: 3.24.1 + optionalDependencies: + '@tanstack/react-router': 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + + '@tanstack/router-plugin@1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(webpack@5.97.1)': + dependencies: + '@babel/core': 7.26.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + '@tanstack/router-generator': 1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) + '@tanstack/router-utils': 1.102.2 + '@tanstack/virtual-file-routes': 1.99.0 + '@types/babel__core': 7.20.5 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + babel-dead-code-elimination: 1.0.9 + chokidar: 3.6.0 + unplugin: 2.1.2 + zod: 3.24.1 + optionalDependencies: + '@tanstack/react-router': 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + webpack: 5.97.1 transitivePeerDependencies: - - tslib - - '@tanstack/devtools-event-client@0.3.5': {} - - '@tanstack/history@1.154.14': {} + - supports-color - '@tanstack/hotkeys@0.0.2': + '@tanstack/router-utils@1.102.2': dependencies: - '@tanstack/store': 0.8.0 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + ansis: 3.16.0 + diff: 7.0.0 - '@tanstack/pacer@0.16.4': + '@tanstack/server-functions-plugin@1.106.0(babel-plugin-macros@3.1.0)': dependencies: - '@tanstack/devtools-event-client': 0.3.5 - '@tanstack/store': 0.8.0 - - '@tanstack/query-core@5.90.12': {} + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + '@tanstack/directive-functions-plugin': 1.106.0(babel-plugin-macros@3.1.0) + '@types/babel__code-frame': 7.0.6 + '@types/babel__core': 7.20.5 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + babel-dead-code-elimination: 1.0.9 + dedent: 1.5.3(babel-plugin-macros@3.1.0) + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color - '@tanstack/react-hotkeys@0.0.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/start-api-routes@1.110.3(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1)': 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/router-core': 1.108.0 + '@tanstack/start-server': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + vinxi: 0.5.3(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - react + - react-dom + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - xml2js + - yaml - '@tanstack/react-pacer@0.17.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/start-client@1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1)': 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/react-cross-context': 1.99.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-router': 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + cookie-es: 1.2.2 + jsesc: 3.1.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + tiny-invariant: 1.3.3 + vinxi: 0.5.3(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - xml2js + - yaml + + '@tanstack/start-config@1.109.2(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(webpack@5.97.1)(yaml@2.7.1)': + dependencies: + '@tanstack/react-router': 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/router-generator': 1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) + '@tanstack/router-plugin': 1.109.2(@tanstack/react-router@1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(webpack@5.97.1) + '@tanstack/server-functions-plugin': 1.106.0(babel-plugin-macros@3.1.0) + '@tanstack/start-plugin': 1.107.0 + '@tanstack/start-server-functions-handler': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + '@vitejs/plugin-react': 4.3.4 + import-meta-resolve: 4.1.0 + nitropack: 2.10.4(typescript@5.6.3) + ofetch: 1.4.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + vinxi: 0.5.3(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + zod: 3.24.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@rsbuild/core' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - babel-plugin-macros + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - vite-plugin-solid + - webpack + - xml2js + - yaml + + '@tanstack/start-plugin@1.107.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 + '@tanstack/router-utils': 1.102.2 + '@types/babel__code-frame': 7.0.6 + '@types/babel__core': 7.20.5 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + babel-dead-code-elimination: 1.0.9 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - supports-color - '@tanstack/react-query@5.90.12(react@19.2.3)': + '@tanstack/start-router-manifest@1.111.0(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1)': dependencies: - '@tanstack/query-core': 5.90.12 - react: 19.2.3 + '@tanstack/router-core': 1.108.0 + tiny-invariant: 1.3.3 + vinxi: 0.5.3(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - xml2js + - yaml - '@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/start-server-functions-client@1.111.1(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1)': 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 + '@tanstack/server-functions-plugin': 1.106.0(babel-plugin-macros@3.1.0) + '@tanstack/start-server-functions-fetcher': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) transitivePeerDependencies: - - csstype + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - babel-plugin-macros + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - react + - react-dom + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - xml2js + - yaml - '@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/start-server-functions-fetcher@1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.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.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/start-client': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) 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 - isbot: 5.1.31 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - xml2js + - yaml - '@tanstack/react-start-client@1.157.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/start-server-functions-handler@1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1)': 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.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/start-client': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + '@tanstack/start-server': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + 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)': - 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) - 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))': - 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 - 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) transitivePeerDependencies: - - '@rsbuild/core' - - crossws + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - sass + - sass-embedded + - stylus + - sugarss - supports-color - - vite-plugin-solid - - webpack - - '@tanstack/react-store@0.8.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - 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/react-table@8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@tanstack/table-core': 8.21.3 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - - '@tanstack/router-core@1.157.16': - dependencies: - '@tanstack/history': 1.154.14 - '@tanstack/store': 0.8.0 - cookie-es: 2.0.0 - seroval: 1.5.0 - seroval-plugins: 1.5.0(seroval@1.5.0) - tiny-invariant: 1.3.3 - tiny-warning: 1.0.3 + - terser + - tsx + - typescript + - uploadthing + - xml2js + - yaml - '@tanstack/router-devtools-core@1.157.16(@tanstack/router-core@1.157.16)(csstype@3.2.3)': + '@tanstack/start-server-functions-server@1.110.1(babel-plugin-macros@3.1.0)': dependencies: - '@tanstack/router-core': 1.157.16 - clsx: 2.1.1 - goober: 2.1.16(csstype@3.2.3) + '@tanstack/server-functions-plugin': 1.106.0(babel-plugin-macros@3.1.0) tiny-invariant: 1.3.3 - 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 - recast: 0.23.11 - source-map: 0.7.6 - tsx: 4.21.0 - zod: 3.25.76 transitivePeerDependencies: + - babel-plugin-macros - 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.27.2 - '@babel/traverse': 7.29.0 - '@babel/types': 7.28.5 - '@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 - 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/start-server-functions-ssr@1.110.2(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1)': + dependencies: + '@tanstack/server-functions-plugin': 1.106.0(babel-plugin-macros@3.1.0) + '@tanstack/start-client': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + '@tanstack/start-server': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + '@tanstack/start-server-functions-fetcher': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + tiny-invariant: 1.3.3 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - babel-plugin-macros + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - react + - react-dom + - sass + - sass-embedded + - stylus + - sugarss - supports-color + - terser + - tsx + - typescript + - uploadthing + - xml2js + - yaml - '@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/start-server@1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1)': dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.0 - '@babel/parser': 7.29.0 - ansis: 4.1.0 - diff: 8.0.2 - pathe: 2.0.3 - tinyglobby: 0.2.15 + '@tanstack/react-cross-context': 1.99.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-router': 1.109.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/start-client': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + h3: 1.13.0 + isbot: 5.1.22 + jsesc: 3.1.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + unctx: 2.4.1 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - sass + - sass-embedded + - stylus + - sugarss - supports-color - - '@tanstack/start-client-core@1.157.16': - 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 - 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))': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.29.0 - '@babel/types': 7.28.5 - '@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 - cheerio: 1.1.2 - exsolve: 1.0.7 - pathe: 2.0.3 - srvx: 0.10.1 - 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 - zod: 3.25.76 + - terser + - tsx + - typescript + - uploadthing + - xml2js + - yaml + + '@tanstack/start@1.111.1(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(webpack@5.97.1)(yaml@2.7.1)': + dependencies: + '@tanstack/start-api-routes': 1.110.3(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + '@tanstack/start-client': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + '@tanstack/start-config': 1.109.2(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(webpack@5.97.1)(yaml@2.7.1) + '@tanstack/start-router-manifest': 1.111.0(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + '@tanstack/start-server': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + '@tanstack/start-server-functions-client': 1.111.1(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + '@tanstack/start-server-functions-handler': 1.109.2(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + '@tanstack/start-server-functions-server': 1.110.1(babel-plugin-macros@3.1.0) + '@tanstack/start-server-functions-ssr': 1.110.2(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' - '@rsbuild/core' - - '@tanstack/react-router' - - crossws + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - babel-plugin-macros + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - sass + - sass-embedded + - stylus + - sugarss - supports-color + - terser + - tsx + - typescript + - uploadthing - vite-plugin-solid - webpack + - xml2js + - yaml - '@tanstack/start-server-core@1.157.16': - 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 - tiny-invariant: 1.3.3 - transitivePeerDependencies: - - crossws - - '@tanstack/start-storage-context@1.157.16': - dependencies: - '@tanstack/router-core': 1.157.16 + '@tanstack/store@0.7.0': {} - '@tanstack/store@0.8.0': {} + '@tanstack/virtual-core@3.1.3': {} - '@tanstack/table-core@8.21.3': {} + '@tanstack/virtual-file-routes@1.99.0': {} - '@tanstack/virtual-file-routes@1.154.7': {} + '@types/aws-lambda@8.10.146': {} - '@tweenjs/tween.js@23.1.3': {} + '@types/babel__code-frame@7.0.6': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.5 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 '@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.26.9 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.5 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.26.9 - '@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 + '@types/braces@3.0.4': {} '@types/cookie@0.6.0': {} @@ -11713,430 +10866,530 @@ 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': + '@types/eslint-scope@3.7.7': dependencies: - '@types/node': 24.3.0 - '@types/qs': 6.9.18 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + optional: true - '@types/express@5.0.6': + '@types/eslint@9.6.1': dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.1.1 - '@types/serve-static': 2.2.0 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + optional: true + + '@types/estree@1.0.6': {} '@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/http-proxy@1.17.15': + dependencies: + '@types/node': 22.12.0 '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} + '@types/lodash@4.14.200': {} - '@types/mdast@4.0.4': + '@types/mdast@3.0.15': dependencies: - '@types/unist': 3.0.3 + '@types/unist': 2.0.10 - '@types/ms@2.1.0': {} - - '@types/mysql@2.15.27': + '@types/micromatch@4.0.9': dependencies: - '@types/node': 24.3.0 + '@types/braces': 3.0.4 - '@types/node@22.19.3': - dependencies: - undici-types: 6.21.0 + '@types/node@14.18.63': {} - '@types/node@24.3.0': + '@types/node@22.12.0': dependencies: - undici-types: 7.10.0 - - '@types/normalize-package-data@2.4.4': {} - - '@types/offscreencanvas@2019.7.3': {} + undici-types: 6.20.0 - '@types/parse-json@4.0.2': - optional: true - - '@types/pg-pool@2.0.6': - dependencies: - '@types/pg': 8.15.6 + '@types/normalize-package-data@2.4.3': {} - '@types/pg@8.11.6': - dependencies: - '@types/node': 24.3.0 - pg-protocol: 1.10.3 - pg-types: 4.1.0 + '@types/parse-json@4.0.2': {} - '@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/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/triple-beam@1.3.5': {} + '@types/resolve@1.20.2': {} - '@types/trusted-types@2.0.7': - optional: true + '@types/semver@7.5.8': {} - '@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': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3)': dependencies: - '@types/node': 24.3.0 - optional: true + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + debug: 4.4.0(supports-color@9.4.0) + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color - '@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/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.6.3)': 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) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + eslint: 8.57.0 transitivePeerDependencies: - supports-color + - typescript - '@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3)': 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: 5.9.2 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) + debug: 4.4.0(supports-color@9.4.0) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.48.1(typescript@5.9.2)': + '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.2) - '@typescript-eslint/types': 8.48.1 - debug: 4.4.3 - typescript: 5.9.2 + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.4.0(supports-color@9.4.0) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.48.1': + '@typescript-eslint/scope-manager@5.62.0': dependencies: - '@typescript-eslint/types': 8.48.1 - '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.9.2)': + '@typescript-eslint/scope-manager@7.2.0': dependencies: - typescript: 5.9.2 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 - '@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.6.3)': 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: 5.9.2 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + debug: 4.4.0(supports-color@9.4.0) + eslint: 8.57.0 + tsutils: 3.21.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.48.1': {} + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/types@7.2.0': {} - '@typescript-eslint/typescript-estree@8.48.1(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.3)': 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 - debug: 4.4.3 - minimatch: 9.0.5 - semver: 7.7.3 - tinyglobby: 0.2.15 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.0(supports-color@9.4.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.1(eslint@9.39.1(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@7.2.0(typescript@5.6.3)': 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 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.4.0(supports-color@9.4.0) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.48.1': + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.6.3)': 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': {} + '@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.6.3) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript - '@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@5.62.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': 5.62.0 + eslint-visitor-keys: 3.4.3 - '@uploadthing/shared@7.1.10': + '@typescript-eslint/visitor-keys@7.2.0': dependencies: - '@uploadthing/mime-types': 0.3.6 - effect: 3.17.7 - sqids: 0.3.0 + '@typescript-eslint/types': 7.2.0 + eslint-visitor-keys: 3.4.3 - '@use-gesture/core@10.3.1': {} + '@ungap/structured-clone@1.2.0': {} - '@use-gesture/react@10.3.1(react@19.2.3)': + '@vercel/analytics@1.2.2(react@19.0.0)': dependencies: - '@use-gesture/core': 10.3.1 - react: 19.2.3 + server-only: 0.0.1 + optionalDependencies: + react: 19.0.0 - '@vercel/nft@0.29.4(rollup@4.53.3)': + '@vercel/nft@0.27.9(rollup@4.32.1)': dependencies: - '@mapbox/node-pre-gyp': 2.0.0 - '@rollup/pluginutils': 5.3.0(rollup@4.53.3) - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + '@mapbox/node-pre-gyp': 2.0.0-rc.0 + '@rollup/pluginutils': 5.1.3(rollup@4.32.1) + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 - glob: 13.0.0 + glob: 7.2.3 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 - picomatch: 4.0.3 + picomatch: 4.0.2 resolve-from: 5.0.0 transitivePeerDependencies: - encoding - rollup - supports-color - '@visx/group@2.17.0(react@19.2.3)': + '@vercel/speed-insights@1.0.10(react@19.0.0)(vue@3.5.13(typescript@5.6.3))': + optionalDependencies: + react: 19.0.0 + vue: 3.5.13(typescript@5.6.3) + + '@vinxi/listhen@1.5.6': + dependencies: + '@parcel/watcher': 2.4.1 + '@parcel/watcher-wasm': 2.3.0 + citty: 0.1.6 + clipboardy: 4.0.0 + consola: 3.4.0 + defu: 6.1.4 + get-port-please: 3.1.2 + h3: 1.14.0 + http-shutdown: 1.2.2 + jiti: 1.21.6 + mlly: 1.7.3 + node-forge: 1.3.1 + pathe: 1.1.2 + std-env: 3.8.0 + ufo: 1.5.4 + untun: 0.1.3 + uqr: 0.1.2 + + '@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': 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.26.9 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9) '@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) transitivePeerDependencies: - supports-color - '@vue/compiler-core@3.5.22': + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.26.9 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + optional: true + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + optional: true + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.26.9 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.1 + source-map-js: 1.2.1 + optional: true + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + optional: true + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + optional: true + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + optional: true + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + optional: true + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.6.3))': dependencies: - '@babel/parser': 7.28.4 - '@vue/shared': 3.5.22 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.6.3) + optional: true + + '@vue/shared@3.5.13': + optional: true + + '@web3-storage/multipart-parser@1.0.0': {} - '@vue/compiler-dom@3.5.22': + '@webassemblyjs/ast@1.14.1': dependencies: - '@vue/compiler-core': 3.5.22 - '@vue/shared': 3.5.22 + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + optional: true + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + optional: true + + '@webassemblyjs/helper-api-error@1.13.2': + optional: true + + '@webassemblyjs/helper-buffer@1.14.1': + optional: true - '@vue/compiler-sfc@3.5.22': + '@webassemblyjs/helper-numbers@1.13.2': dependencies: - '@babel/parser': 7.28.4 - '@vue/compiler-core': 3.5.22 - '@vue/compiler-dom': 3.5.22 - '@vue/compiler-ssr': 3.5.22 - '@vue/shared': 3.5.22 - estree-walker: 2.0.2 - magic-string: 0.30.19 - postcss: 8.5.6 - source-map-js: 1.2.1 + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + optional: true + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + optional: true - '@vue/compiler-ssr@3.5.22': + '@webassemblyjs/helper-wasm-section@1.14.1': dependencies: - '@vue/compiler-dom': 3.5.22 - '@vue/shared': 3.5.22 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + optional: true - '@vue/shared@3.5.22': {} + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + optional: true - '@webcontainer/api@1.6.1': {} + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + optional: true - '@webgpu/types@0.1.68': {} + '@webassemblyjs/utf8@1.13.2': + optional: true - '@whatwg-node/disposablestack@0.0.6': + '@webassemblyjs/wasm-edit@1.14.1': dependencies: - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + optional: true - '@whatwg-node/fetch@0.10.11': + '@webassemblyjs/wasm-gen@1.14.1': dependencies: - '@whatwg-node/node-fetch': 0.8.1 - urlpattern-polyfill: 10.1.0 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + optional: true - '@whatwg-node/node-fetch@0.8.1': + '@webassemblyjs/wasm-opt@1.14.1': dependencies: - '@fastify/busboy': 3.2.0 - '@whatwg-node/disposablestack': 0.0.6 - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + optional: true - '@whatwg-node/promise-helpers@1.3.2': + '@webassemblyjs/wasm-parser@1.14.1': dependencies: - tslib: 2.8.1 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + optional: true - '@whatwg-node/server@0.10.13': + '@webassemblyjs/wast-printer@1.14.1': dependencies: - '@envelop/instrumentation': 1.0.0 - '@whatwg-node/disposablestack': 0.0.6 - '@whatwg-node/fetch': 0.10.11 - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + optional: true + + '@xtuc/ieee754@1.2.0': + optional: true + + '@xtuc/long@4.2.2': + optional: true + + '@zxing/text-encoding@0.9.0': + optional: true - '@xstate/react@6.0.0(@types/react@19.2.10)(react@19.2.3)(xstate@5.25.0)': + 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: {} - abbrev@3.0.1: {} + abbrev@2.0.0: {} abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - accepts@2.0.0: - dependencies: - mime-types: 3.0.1 - negotiator: 1.0.0 + abortcontroller-polyfill@1.7.5: {} - acorn-import-attributes@1.9.5(acorn@8.15.0): + acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: - acorn: 8.15.0 + acorn: 8.14.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.15.0 + acorn: 8.14.0 - acorn@8.15.0: {} + acorn@8.14.0: {} agent-base@6.0.2: dependencies: - debug: 4.4.3 + debug: 4.4.0(supports-color@9.4.0) transitivePeerDependencies: - supports-color - agent-base@7.1.4: {} + agent-base@7.1.3: {} - ajv-errors@3.0.0(ajv@8.17.1): + airtable@0.12.2: dependencies: - ajv: 8.17.1 + '@types/node': 14.18.63 + abort-controller: 3.0.0 + abortcontroller-polyfill: 1.7.5 + lodash: 4.17.21 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding - ajv-formats@3.0.1(ajv@8.17.1): + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 + optional: true + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + optional: true + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + optional: true ajv@6.12.6: dependencies: @@ -12148,9 +11401,10 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + optional: true algoliasearch-helper@3.24.3(algoliasearch@5.23.4): dependencies: @@ -12173,9 +11427,15 @@ snapshots: '@algolia/requester-fetch': 5.23.4 '@algolia/requester-node-http': 5.23.4 + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.3: {} + ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} + ansi-regex@6.1.0: {} ansi-styles@3.2.1: dependencies: @@ -12185,9 +11445,11 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.3: {} + ansi-styles@6.2.1: {} - ansis@4.1.0: {} + ansis@3.16.0: {} + + any-promise@1.3.0: {} anymatch@3.1.3: dependencies: @@ -12196,85 +11458,105 @@ 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 lodash: 4.17.21 normalize-path: 3.0.0 - readable-stream: 4.7.0 + readable-stream: 4.5.2 archiver@7.0.1: dependencies: archiver-utils: 5.0.2 async: 3.2.6 buffer-crc32: 1.0.0 - readable-stream: 4.7.0 + readable-stream: 4.5.2 readdir-glob: 1.1.3 tar-stream: 3.1.7 zip-stream: 6.0.1 - transitivePeerDependencies: - - react-native-b4a + + arg@5.0.2: {} argparse@1.0.10: 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.2.4 + is-string: 1.0.7 + + array-union@2.1.0: {} + + array.prototype.filter@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 - array-includes@3.1.9: + array.prototype.findlast@1.2.4: 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-errors: 1.3.0 + es-shim-unscopables: 1.0.2 - array.prototype.findlast@1.2.5: + array.prototype.findlastindex@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-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 @@ -12285,90 +11567,133 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.5 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - arraybuffer.prototype.slice@1.0.4: - 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 - - ast-module-types@6.0.1: {} - ast-types-flow@0.0.8: {} - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 - async-sema@3.1.1: {} async@3.2.6: {} - autoprefixer@10.4.18(postcss@8.5.6): + asynciterator.prototype@1.0.0: + dependencies: + has-symbols: 1.0.3 + + asynckit@0.4.0: {} + + autoprefixer@10.4.18(postcss@8.5.1): dependencies: browserslist: 4.24.4 caniuse-lite: 1.0.30001692 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.1 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: 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: {} + b4a@1.6.7: {} - babel-dead-code-elimination@1.0.12: + babel-dead-code-elimination@1.0.9: dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.28.4 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.5 + '@babel/core': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 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 + resolve: 1.22.10 + + babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.26.9): + dependencies: + '@babel/compat-data': 7.26.5 + '@babel/core': 7.26.9 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.26.9) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - bail@2.0.2: {} + babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.26.9) + core-js-compat: 3.36.0 + transitivePeerDependencies: + - supports-color - balanced-match@1.0.2: {} + babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.26.9): + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.26.9) + transitivePeerDependencies: + - supports-color - balanced-match@3.0.1: {} + babel-plugin-transform-react-remove-prop-types@0.4.24: {} + + babel-preset-react-app@10.0.1: + dependencies: + '@babel/core': 7.26.9 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.9) + '@babel/plugin-proposal-decorators': 7.24.0(@babel/core@7.26.9) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.9) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.26.9) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.9) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.26.9) + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.26.9) + '@babel/plugin-transform-runtime': 7.24.0(@babel/core@7.26.9) + '@babel/preset-env': 7.24.0(@babel/core@7.26.9) + '@babel/preset-react': 7.23.3(@babel/core@7.26.9) + '@babel/preset-typescript': 7.23.3(@babel/core@7.26.9) + '@babel/runtime': 7.24.5 + babel-plugin-macros: 3.1.0 + babel-plugin-transform-react-remove-prop-types: 0.4.24 + transitivePeerDependencies: + - supports-color - bare-events@2.7.0: {} + bail@1.0.5: {} + + balanced-match@1.0.2: {} + + bare-events@2.5.0: + optional: true base64-js@1.5.1: {} - better-ajv-errors@1.2.0(ajv@8.17.1): - dependencies: - '@babel/code-frame': 7.27.1 - '@humanwhocodes/momoa': 2.0.4 - ajv: 8.17.1 - chalk: 4.1.2 - jsonpointer: 5.0.1 - leven: 3.1.0 + before-after-hook@2.2.3: {} - bidi-js@1.0.3: - dependencies: - require-from-string: 2.0.2 + before-after-hook@3.0.2: {} binary-extensions@2.2.0: {} @@ -12378,34 +11703,29 @@ 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: {} + + boxen@7.1.1: dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.4.1 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 - brace-expansion@2.0.2: + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 + concat-map: 0.0.1 - brace-expansion@4.0.1: + brace-expansion@2.0.1: dependencies: - balanced-match: 3.0.1 + balanced-match: 1.0.2 braces@3.0.3: dependencies: @@ -12418,14 +11738,8 @@ 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: {} - buffer-equal-constant-time@1.0.1: {} - buffer-from@1.1.2: {} buffer@6.0.3: @@ -12433,47 +11747,43 @@ 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: + c12@2.0.1(magicast@0.3.5): dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 + chokidar: 4.0.1 + confbox: 0.1.8 + defu: 6.1.4 + dotenv: 16.4.7 + giget: 1.2.3 + jiti: 2.4.2 + mlly: 1.7.3 + ohash: 1.1.4 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.2.1 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 call-bind@1.0.7: dependencies: - es-define-property: 1.0.1 + es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - 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 + get-intrinsic: 1.2.4 set-function-length: 1.2.2 - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 + callsites@3.1.0: {} - callsite@1.0.0: {} + camelcase-css@2.0.1: {} - callsites@3.1.0: {} + camelcase@7.0.1: {} 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 @@ -12485,13 +11795,15 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.6.2: {} + chalk@5.4.1: {} + + change-case@5.4.4: {} - 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: @@ -12500,36 +11812,22 @@ snapshots: css-what: 6.1.0 domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.2.2 + domutils: 3.1.0 - cheerio@1.1.2: + cheerio@1.0.0: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 - domutils: 3.2.2 - encoding-sniffer: 0.2.1 - htmlparser2: 10.0.0 - parse5: 7.3.0 + domutils: 3.1.0 + encoding-sniffer: 0.2.0 + htmlparser2: 9.1.0 + parse5: 7.2.1 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.14.0 + undici: 6.21.0 whatwg-mimetype: 4.0.0 - chevrotain-allstar@0.3.1(chevrotain@11.0.3): - dependencies: - chevrotain: 11.0.3 - lodash-es: 4.17.21 - - chevrotain@11.0.3: - dependencies: - '@chevrotain/cst-dts-gen': 11.0.3 - '@chevrotain/gast': 11.0.3 - '@chevrotain/regexp-to-ast': 11.0.3 - '@chevrotain/types': 11.0.3 - '@chevrotain/utils': 11.0.3 - lodash-es: 4.17.21 - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -12542,48 +11840,63 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.3: + chokidar@4.0.1: dependencies: - readdirp: 4.1.2 + readdirp: 4.0.2 + + chownr@2.0.0: {} chownr@3.0.0: {} + chrome-trace-event@1.0.4: + optional: true + + ci-info@3.9.0: {} + citty@0.1.6: dependencies: - consola: 3.4.2 - - cjs-module-lexer@1.4.3: {} + consola: 3.4.0 classnames@2.3.2: {} + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + cli-boxes@3.0.0: {} + + 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): + cluster-key-slot@1.1.2: {} + + 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.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) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -12596,40 +11909,27 @@ snapshots: dependencies: color-name: 1.1.4 - color-convert@3.1.2: - dependencies: - color-name: 2.0.2 - color-name@1.1.3: {} color-name@1.1.4: {} - color-name@2.0.2: {} + colorette@1.4.0: {} - color-string@2.1.2: + combined-stream@1.0.8: dependencies: - color-name: 2.0.2 - - color@5.0.2: - dependencies: - color-convert: 3.1.2 - color-string: 2.1.2 - - comma-separated-tokens@2.0.3: {} - - commander@10.0.1: {} + delayed-stream: 1.0.0 - commander@11.1.0: {} - - commander@12.1.0: {} + comma-separated-tokens@1.0.8: {} commander@2.20.3: {} + commander@4.1.1: {} + commander@7.2.0: {} - commander@8.3.0: {} + commondir@1.0.1: {} - common-path-prefix@3.0.0: {} + compatx@0.1.8: {} compress-commons@6.0.2: dependencies: @@ -12637,79 +11937,70 @@ snapshots: crc32-stream: 6.0.0 is-stream: 2.0.1 normalize-path: 3.0.0 - readable-stream: 4.7.0 + readable-stream: 4.5.2 + + compute-scroll-into-view@3.1.1: {} concat-map@0.0.1: {} confbox@0.1.8: {} - confbox@0.2.2: {} - - consola@3.4.2: {} + confusing-browser-globals@1.0.11: {} - content-disposition@1.0.1: {} - - content-type@1.0.5: {} - - convert-source-map@1.9.0: {} + consola@3.4.0: {} convert-source-map@2.0.0: {} - cookie-es@1.2.2: {} + convex-helpers@0.1.67(convex@1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(zod@3.24.1): + dependencies: + convex: 1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + optionalDependencies: + react: 19.0.0 + zod: 3.24.1 - cookie-es@2.0.0: {} + convex@1.17.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + esbuild: 0.23.0 + jwt-decode: 3.1.2 + prettier: 3.2.5 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - cookie-signature@1.2.2: {} + cookie-es@1.2.2: {} - cookie@0.7.1: {} + cookie-signature@1.2.1: {} - cookie@1.0.2: {} + cookie@0.6.0: {} - copy-file@11.1.0: + core-js-compat@3.36.0: dependencies: - graceful-fs: 4.2.11 - p-event: 6.0.1 + browserslist: 4.24.4 core-util-is@1.0.3: {} - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - cose-base@1.0.3: - dependencies: - layout-base: 1.0.2 - - cose-base@2.2.0: - dependencies: - layout-base: 2.0.1 - 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: {} crc32-stream@6.0.0: dependencies: crc-32: 1.2.2 - readable-stream: 4.7.0 + readable-stream: 4.5.2 cron-parser@4.9.0: dependencies: luxon: 3.5.0 - cross-env@7.0.3: - dependencies: - cross-spawn: 7.0.6 + croner@9.0.0: {} - cross-spawn@6.0.6: + cross-spawn@6.0.5: dependencies: nice-try: 1.0.5 path-key: 2.0.1 @@ -12717,13 +12008,19 @@ snapshots: shebang-command: 1.2.0 which: 1.3.1 + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - crossws@0.3.5: + crossws@0.3.3: dependencies: uncrypto: 0.1.3 @@ -12731,47 +12028,15 @@ snapshots: dependencies: boolbase: 1.0.0 css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - - css-tree@2.2.1: - dependencies: - mdn-data: 2.0.28 - source-map-js: 1.2.1 - - css-tree@3.1.0: - dependencies: - mdn-data: 2.12.2 - source-map-js: 1.2.1 - - css-what@6.1.0: {} - - cssesc@3.0.0: {} - - cssfilter@0.0.10: {} - - csso@5.0.5: - dependencies: - css-tree: 2.2.1 - - csstype@3.2.3: {} - - cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): - dependencies: - cose-base: 1.0.3 - cytoscape: 3.33.1 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 - cytoscape-fcose@2.2.0(cytoscape@3.33.1): - dependencies: - cose-base: 2.2.0 - cytoscape: 3.33.1 + css-what@6.1.0: {} - cytoscape@3.33.1: {} + cssesc@3.0.0: {} - d3-array@2.12.1: - dependencies: - internmap: 1.0.1 + csstype@3.1.3: {} d3-array@3.2.4: dependencies: @@ -12840,8 +12105,6 @@ snapshots: dependencies: d3-color: 3.1.0 - d3-path@1.0.9: {} - d3-path@3.1.0: {} d3-polygon@3.0.1: {} @@ -12850,11 +12113,6 @@ snapshots: d3-random@3.0.1: {} - d3-sankey@0.12.3: - dependencies: - d3-array: 2.12.1 - d3-shape: 1.3.7 - d3-scale-chromatic@3.1.0: dependencies: d3-color: 3.1.0 @@ -12870,10 +12128,6 @@ snapshots: d3-selection@3.0.0: {} - d3-shape@1.3.7: - dependencies: - d3-path: 1.0.9 - d3-shape@3.2.0: dependencies: d3-path: 3.1.0 @@ -12938,56 +12192,38 @@ snapshots: d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 - dagre-d3-es@7.0.11: - dependencies: - d3: 7.9.0 - lodash-es: 4.17.21 - 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-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@3.0.1: {} date-fns@2.30.0: dependencies: '@babel/runtime': 7.24.5 - dayjs@1.11.18: {} + date-fns@4.1.0: {} - debug@4.4.1: + dax-sh@0.39.2: dependencies: - ms: 2.1.3 + '@deno/shim-deno': 0.19.2 + undici-types: 5.28.4 - debug@4.4.3: + db0@0.2.1: {} + + debug@2.6.9: dependencies: - ms: 2.1.3 + ms: 2.0.0 - decache@4.6.2: + debug@3.2.7: dependencies: - callsite: 1.0.0 + ms: 2.1.3 - decode-named-character-reference@1.2.0: + debug@4.4.0(supports-color@9.4.0): dependencies: - character-entities: 2.0.2 + ms: 2.1.3 + optionalDependencies: + supports-color: 9.4.0 - dedent@1.7.0(babel-plugin-macros@3.1.0): + dedent@1.5.3(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -12997,9 +12233,11 @@ snapshots: define-data-property@1.1.4: dependencies: - es-define-property: 1.0.1 + es-define-property: 1.0.0 es-errors: 1.3.0 - gopd: 1.2.0 + gopd: 1.0.1 + + define-lazy-prop@2.0.0: {} define-properties@1.2.1: dependencies: @@ -13013,93 +12251,41 @@ snapshots: dependencies: robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} + + denque@2.1.0: {} + depd@2.0.0: {} deprecation@2.3.1: {} dequal@2.0.3: {} - destr@2.0.5: {} + destr@2.0.3: {} - detect-gpu@5.0.70: - dependencies: - webgl-constants: 1.1.1 + destroy@1.2.0: {} detect-libc@1.0.3: {} - detect-libc@2.0.4: {} - - detect-libc@2.1.2: {} + detect-libc@2.0.3: {} detect-node-es@1.1.0: {} - detective-amd@6.0.1: - dependencies: - ast-module-types: 6.0.1 - escodegen: 2.1.0 - get-amd-module-type: 6.0.1 - node-source-walk: 7.0.1 - - detective-cjs@6.0.1: - dependencies: - ast-module-types: 6.0.1 - node-source-walk: 7.0.1 - - detective-es6@5.0.1: - dependencies: - node-source-walk: 7.0.1 - - detective-postcss@7.0.1(postcss@8.5.6): - dependencies: - is-url: 1.2.4 - postcss: 8.5.6 - postcss-values-parser: 6.0.2(postcss@8.5.6) - - detective-sass@6.0.1: - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 7.0.1 - - detective-scss@5.0.1: - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 7.0.1 - - detective-stylus@5.0.1: {} + didyoumean@1.2.2: {} - detective-typescript@14.0.0(typescript@5.9.2): - dependencies: - '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.2) - ast-module-types: 6.0.1 - node-source-walk: 7.0.1 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + diff@7.0.0: {} - detective-vue2@2.2.0(typescript@5.9.2): + dir-glob@3.0.1: dependencies: - '@dependents/detective-less': 5.0.1 - '@vue/compiler-sfc': 3.5.22 - detective-es6: 5.0.1 - detective-sass: 6.0.1 - detective-scss: 5.0.1 - detective-stylus: 5.0.1 - detective-typescript: 14.0.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + path-type: 4.0.0 - dettle@1.0.5: {} + dlv@1.1.3: {} - devlop@1.1.0: + doctrine@2.1.0: dependencies: - dequal: 2.0.3 - - diff@8.0.2: {} - - discord-interactions@4.4.0: {} + esutils: 2.0.3 - doctrine@2.1.0: + doctrine@3.0.0: dependencies: esutils: 2.0.3 @@ -13115,11 +12301,9 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.2.6: - optionalDependencies: - '@types/trusted-types': 2.0.7 + dompurify@3.1.6: {} - domutils@3.2.2: + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -13127,122 +12311,85 @@ snapshots: dot-prop@9.0.0: dependencies: - type-fest: 4.41.0 + type-fest: 4.30.0 dotenv-cli@8.0.0: dependencies: cross-spawn: 7.0.6 - dotenv: 16.6.1 + dotenv: 16.4.7 dotenv-expand: 10.0.0 minimist: 1.2.8 dotenv-expand@10.0.0: {} - dotenv@16.6.1: {} + dotenv@16.4.7: {} - 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 - - 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 + JSONStream: 1.3.5 + lazy-cache: 2.0.2 + moment: 2.30.1 - dunder-proto@1.0.1: + downshift@9.0.9(react@19.0.0): dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 + '@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 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: {} emoji-regex@9.2.2: {} - empathic@2.0.0: {} - - enabled@2.0.0: {} + encodeurl@1.0.2: {} encodeurl@2.0.0: {} - encoding-sniffer@0.2.1: + encoding-sniffer@0.2.0: dependencies: iconv-lite: 0.6.3 whatwg-encoding: 3.1.1 - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - - enhanced-resolve@5.18.3: + enhanced-resolve@5.18.0: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.2 + tapable: 2.2.1 + optional: true entities@4.5.0: {} - entities@6.0.1: {} - - env-paths@3.0.0: {} - error-ex@1.3.2: 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 arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.7 call-bind: 1.0.7 - es-define-property: 1.0.1 + es-define-property: 1.0.0 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 globalthis: 1.0.3 - gopd: 1.2.0 + gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 - has-symbols: 1.1.0 + has-symbols: 1.0.3 hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 @@ -13253,7 +12400,7 @@ snapshots: is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.13.4 + object-inspect: 1.13.1 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 @@ -13269,102 +12416,37 @@ snapshots: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - es-abstract@1.24.0: + es-array-method-boxes-properly@1.0.0: {} + + es-define-property@1.0.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-define-property@1.0.1: {} + get-intrinsic: 1.2.4 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 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - - es-module-lexer@1.7.0: {} + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 + es-module-lexer@1.6.0: {} es-set-tostringtag@2.0.3: dependencies: - get-intrinsic: 1.3.0 - 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 + get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -13378,132 +12460,141 @@ 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: + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + esbuild@0.23.0: 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: + '@esbuild/aix-ppc64': 0.23.0 + '@esbuild/android-arm': 0.23.0 + '@esbuild/android-arm64': 0.23.0 + '@esbuild/android-x64': 0.23.0 + '@esbuild/darwin-arm64': 0.23.0 + '@esbuild/darwin-x64': 0.23.0 + '@esbuild/freebsd-arm64': 0.23.0 + '@esbuild/freebsd-x64': 0.23.0 + '@esbuild/linux-arm': 0.23.0 + '@esbuild/linux-arm64': 0.23.0 + '@esbuild/linux-ia32': 0.23.0 + '@esbuild/linux-loong64': 0.23.0 + '@esbuild/linux-mips64el': 0.23.0 + '@esbuild/linux-ppc64': 0.23.0 + '@esbuild/linux-riscv64': 0.23.0 + '@esbuild/linux-s390x': 0.23.0 + '@esbuild/linux-x64': 0.23.0 + '@esbuild/netbsd-x64': 0.23.0 + '@esbuild/openbsd-arm64': 0.23.0 + '@esbuild/openbsd-x64': 0.23.0 + '@esbuild/sunos-x64': 0.23.0 + '@esbuild/win32-arm64': 0.23.0 + '@esbuild/win32-ia32': 0.23.0 + '@esbuild/win32-x64': 0.23.0 + + esbuild@0.23.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.10 - '@esbuild/android-arm': 0.25.10 - '@esbuild/android-arm64': 0.25.10 - '@esbuild/android-x64': 0.25.10 - '@esbuild/darwin-arm64': 0.25.10 - '@esbuild/darwin-x64': 0.25.10 - '@esbuild/freebsd-arm64': 0.25.10 - '@esbuild/freebsd-x64': 0.25.10 - '@esbuild/linux-arm': 0.25.10 - '@esbuild/linux-arm64': 0.25.10 - '@esbuild/linux-ia32': 0.25.10 - '@esbuild/linux-loong64': 0.25.10 - '@esbuild/linux-mips64el': 0.25.10 - '@esbuild/linux-ppc64': 0.25.10 - '@esbuild/linux-riscv64': 0.25.10 - '@esbuild/linux-s390x': 0.25.10 - '@esbuild/linux-x64': 0.25.10 - '@esbuild/netbsd-arm64': 0.25.10 - '@esbuild/netbsd-x64': 0.25.10 - '@esbuild/openbsd-arm64': 0.25.10 - '@esbuild/openbsd-x64': 0.25.10 - '@esbuild/openharmony-arm64': 0.25.10 - '@esbuild/sunos-x64': 0.25.10 - '@esbuild/win32-arm64': 0.25.10 - '@esbuild/win32-ia32': 0.25.10 - '@esbuild/win32-x64': 0.25.10 - - esbuild@0.25.9: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + esbuild@0.24.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 - - esbuild@0.27.0: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + esbuild@0.25.3: 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 + '@esbuild/aix-ppc64': 0.25.3 + '@esbuild/android-arm': 0.25.3 + '@esbuild/android-arm64': 0.25.3 + '@esbuild/android-x64': 0.25.3 + '@esbuild/darwin-arm64': 0.25.3 + '@esbuild/darwin-x64': 0.25.3 + '@esbuild/freebsd-arm64': 0.25.3 + '@esbuild/freebsd-x64': 0.25.3 + '@esbuild/linux-arm': 0.25.3 + '@esbuild/linux-arm64': 0.25.3 + '@esbuild/linux-ia32': 0.25.3 + '@esbuild/linux-loong64': 0.25.3 + '@esbuild/linux-mips64el': 0.25.3 + '@esbuild/linux-ppc64': 0.25.3 + '@esbuild/linux-riscv64': 0.25.3 + '@esbuild/linux-s390x': 0.25.3 + '@esbuild/linux-x64': 0.25.3 + '@esbuild/netbsd-arm64': 0.25.3 + '@esbuild/netbsd-x64': 0.25.3 + '@esbuild/openbsd-arm64': 0.25.3 + '@esbuild/openbsd-x64': 0.25.3 + '@esbuild/sunos-x64': 0.25.3 + '@esbuild/win32-arm64': 0.25.3 + '@esbuild/win32-ia32': 0.25.3 + '@esbuild/win32-x64': 0.25.3 escalade@3.2.0: {} @@ -13515,123 +12606,232 @@ snapshots: escape-string-regexp@5.0.0: {} - escodegen@2.1.0: + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0)(typescript@5.6.3): + dependencies: + '@babel/core': 7.26.9 + '@babel/eslint-parser': 7.23.10(@babel/core@7.26.9)(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.6.3))(eslint@8.57.0)(typescript@5.6.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + 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.26.0(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(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.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + 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.6.3) + optionalDependencies: + typescript: 5.6.3 + 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: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 + 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.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + dependencies: + debug: 3.2.7 optionalDependencies: - source-map: 0.6.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + 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.26.0(@babel/core@7.26.9))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.9))(eslint@8.57.0): + dependencies: + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.9) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.9) + 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.6.3))(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.6.3))(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.6.3) + 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.6.3))(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + eslint: 8.57.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.6.3))(eslint@8.57.0)(typescript@5.6.3) + transitivePeerDependencies: + - supports-color + - typescript - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1(jiti@2.6.0)): + 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 - - eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.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 + object.entries: 1.1.7 + object.fromentries: 2.0.7 - eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.0)): + eslint-plugin-react-hooks@4.6.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 + eslint: 8.57.0 + + eslint-plugin-react@7.34.0(eslint@8.57.0): + dependencies: + 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.6.3): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.3) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-unicorn@49.0.0(eslint@8.57.0): + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + '@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.6.3 + 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@3.4.3: {} + eslint-visitor-keys@2.1.0: {} - eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@3.4.3: {} - eslint@9.39.1(jiti@2.6.0): + eslint@8.57.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-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 + cross-spawn: 7.0.3 + debug: 4.4.0(supports-color@9.4.0) + 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 + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -13643,31 +12843,29 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + esutils@2.0.3: {} etag@1.8.1: {} event-target-shim@5.0.1: {} - events-universal@1.0.1: - dependencies: - bare-events: 2.7.0 + eventemitter3@4.0.7: {} 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 + cross-spawn: 7.0.3 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -13677,79 +12875,13 @@ 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: dependencies: is-extendable: 0.1.1 extend@3.0.2: {} - extract-zip@2.0.1: - dependencies: - debug: 4.4.3 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - - fast-check@3.23.2: - dependencies: - pure-rand: 6.1.0 + fast-content-type-parse@2.0.0: {} fast-deep-equal@3.1.3: {} @@ -13767,121 +12899,90 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-safe-stringify@2.1.1: {} - - fast-sha256@1.3.0: {} - - fast-uri@3.1.0: {} + fast-uri@3.0.6: + optional: true fastq@1.17.1: dependencies: reusify: 1.0.4 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - - fdir@6.5.0(picomatch@4.0.3): + fdir@6.4.2(picomatch@4.0.2): optionalDependencies: - picomatch: 4.0.3 - - fecha@4.2.3: {} - - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - - fflate@0.6.10: {} - - fflate@0.8.2: {} - - figures@6.1.0: - dependencies: - is-unicode-supported: 2.1.0 + picomatch: 4.0.2 - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 - 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: + find-up@4.1.0: 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: {} + locate-path: 5.0.0 + path-exists: 4.0.0 find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@7.0.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - unicorn-magic: 0.1.0 - - 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: {} + follow-redirects@1.15.9: {} for-each@0.3.3: dependencies: is-callable: 1.2.7 - for-each@0.3.5: + foreground-child@3.3.0: dependencies: - is-callable: 1.2.7 - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 + cross-spawn: 7.0.3 signal-exit: 4.1.0 - formdata-polyfill@4.0.10: + form-data@4.0.0: dependencies: - fetch-blob: 3.2.0 + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 - forwarded-parse@2.1.2: {} + fraction.js@4.3.7: {} - forwarded@0.2.0: {} + framer-motion@11.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + motion-dom: 11.14.3 + motion-utils: 11.14.3 + tslib: 2.8.1 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) - fraction.js@4.3.7: {} + fresh@0.5.2: {} - fresh@2.0.0: {} + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 - fsevents@2.3.2: - optional: true + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} fsevents@2.3.3: optional: true @@ -13895,76 +12996,46 @@ 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: {} - get-amd-module-type@6.0.1: - dependencies: - ast-module-types: 6.0.1 - node-source-walk: 7.0.1 - get-caller-file@2.0.5: {} - get-intrinsic@1.3.0: + get-intrinsic@1.2.4: dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 + has-proto: 1.0.3 + has-symbols: 1.0.3 hasown: 2.0.2 - math-intrinsics: 1.1.0 get-nonce@1.0.1: {} - get-port-please@3.2.0: {} - - get-port@7.1.0: {} - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-stream@5.2.0: - dependencies: - pump: 3.0.3 + get-port-please@3.1.2: {} 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-intrinsic: 1.2.4 - get-symbol-description@1.1.0: + get-tsconfig@4.10.0: dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 + resolve-pkg-maps: 1.0.0 - get-tsconfig@4.10.1: + giget@1.2.3: dependencies: - resolve-pkg-maps: 1.0.0 + citty: 0.1.6 + consola: 3.4.0 + defu: 6.1.4 + node-fetch-native: 1.6.6 + nypm: 0.3.12 + ohash: 1.1.4 + pathe: 1.1.2 + tar: 6.2.1 github-slugger@2.0.0: {} @@ -13976,85 +13047,119 @@ 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: + optional: true - glob@10.5.0: + glob@10.4.5: dependencies: - foreground-child: 3.3.1 + foreground-child: 3.3.0 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 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@15.15.0: {} + globals@13.24.0: + dependencies: + type-fest: 0.20.2 globalthis@1.0.3: 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: {} + globby@14.0.2: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 5.3.2 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 - glsl-noise@0.0.0: {} + globrex@0.1.2: {} - gonzales-pe@4.3.0: + goober@2.1.16(csstype@3.1.3): dependencies: - minimist: 1.2.8 + csstype: 3.1.3 - goober@2.1.16(csstype@3.2.3): + gopd@1.0.1: dependencies: - csstype: 3.2.3 - - gopd@1.2.0: {} + get-intrinsic: 1.2.4 graceful-fs@4.2.11: {} graphemer@1.4.0: {} + graphql-tag@2.12.6(graphql@16.10.0): + dependencies: + graphql: 16.10.0 + tslib: 2.8.1 + + graphql@16.10.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: + gzip-size@7.0.0: dependencies: duplexer: 0.1.2 - h3@1.15.4: + h3@1.13.0: dependencies: cookie-es: 1.2.2 - crossws: 0.3.5 + crossws: 0.3.3 defu: 6.1.4 - destr: 2.0.5 + destr: 2.0.3 iron-webcrypto: 1.2.1 - node-mock-http: 1.0.3 + ohash: 1.1.4 radix3: 1.1.2 - ufo: 1.6.1 + ufo: 1.5.4 uncrypto: 0.1.3 + unenv: 1.10.0 - h3@2.0.1-rc.11: + h3@1.14.0: dependencies: - rou3: 0.7.12 - srvx: 0.10.1 - - hachure-fill@0.5.2: {} + cookie-es: 1.2.2 + crossws: 0.3.3 + defu: 6.1.4 + destr: 2.0.3 + iron-webcrypto: 1.2.1 + ohash: 1.1.4 + radix3: 1.1.2 + ufo: 1.5.4 + uncrypto: 0.1.3 + unenv: 1.10.0 has-bigints@1.0.2: {} @@ -14064,119 +13169,21 @@ snapshots: has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.1 + es-define-property: 1.0.0 has-proto@1.0.3: {} - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - - has-symbols@1.1.0: {} + has-symbols@1.0.3: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.1.0 + has-symbols: 1.0.3 hasown@2.0.2: 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: @@ -14187,18 +13194,10 @@ snapshots: dependencies: react-is: 16.13.1 - hono-rate-limiter@0.4.2(hono@4.11.3): - dependencies: - hono: 4.11.3 - - hono@4.11.3: {} + hookable@5.5.3: {} hosted-git-info@2.8.9: {} - hosted-git-info@7.0.2: - dependencies: - lru-cache: 10.4.3 - htm@3.1.1: {} html-dom-parser@5.0.8: @@ -14206,115 +13205,94 @@ 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: {} - - htmlparser2@10.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 6.0.1 + '@types/react': 18.3.12 htmlparser2@9.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.2.2 + domutils: 3.1.0 entities: 4.5.0 - http-errors@2.0.1: + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 - statuses: 2.0.2 + statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + http-shutdown@1.2.2: {} https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.3 + debug: 4.4.0(supports-color@9.4.0) transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@9.4.0): dependencies: - agent-base: 7.1.4 - debug: 4.4.3 + agent-base: 7.1.3 + debug: 4.4.0(supports-color@9.4.0) transitivePeerDependencies: - supports-color - human-signals@5.0.0: {} - - human-signals@8.0.1: {} - - husky@9.1.7: {} + httpxy@0.1.5: {} - hyperdyperid@1.2.0: {} + human-signals@5.0.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.1: - dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) - cjs-module-lexer: 1.4.3 - module-details-from-path: 1.0.4 + import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} - indent-string@5.0.0: {} + indent-string@4.0.0: {} - index-to-position@1.2.0: {} + index-to-position@0.1.2: {} + + 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: @@ -14329,22 +13307,14 @@ 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: dependencies: es-errors: 1.3.0 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: {} + side-channel: 1.0.6 internmap@2.0.3: {} @@ -14352,59 +13322,38 @@ 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)): - dependencies: - '@fastify/accept-negotiator': 2.0.1 - citty: 0.1.6 - consola: 3.4.2 - defu: 6.1.4 - destr: 2.0.5 - etag: 1.8.1 - h3: 1.15.4 - image-meta: 0.2.2 - listhen: 1.9.0 - ofetch: 1.4.1 - pathe: 2.0.3 - 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)) - xss: 1.0.15 + ioredis@5.4.1: + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.4.0(supports-color@9.4.0) + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - db0 - - idb-keyval - - ioredis - - uploadthing + - supports-color 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 - get-intrinsic: 1.3.0 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-arrayish@0.2.1: {} @@ -14416,10 +13365,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 @@ -14429,10 +13374,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: {} @@ -14440,20 +13388,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-decimal@1.0.4: {} is-docker@2.2.1: {} @@ -14463,9 +13402,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: {} @@ -14477,114 +13416,75 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@1.0.4: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 is-map@2.0.3: {} - is-negative-zero@2.0.3: {} + is-module@1.0.0: {} - is-network-error@1.1.0: {} + is-negative-zero@2.0.3: {} is-number-object@1.0.7: 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@4.0.0: {} + is-path-inside@3.0.3: {} is-plain-obj@2.1.0: {} - is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 is-plain-object@5.0.0: {} - is-promise@2.2.2: {} - - is-promise@4.0.0: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.6 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: {} - is-stream@4.0.1: {} - is-string@1.0.7: 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 + has-symbols: 1.0.3 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: {} - - is-url@1.2.4: {} - is-weakmap@2.0.2: {} is-weakref@1.0.2: 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 - get-intrinsic: 1.3.0 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-wsl@2.2.0: dependencies: @@ -14602,27 +13502,23 @@ snapshots: isarray@2.0.5: {} - isbot@5.1.31: {} + isbot@5.1.22: {} isexe@2.0.0: {} - isoformat@0.2.1: {} + isexe@3.1.1: {} - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 + isobject@3.0.1: {} + + isoformat@0.2.1: {} - its-fine@2.0.0(@types/react@19.2.10)(react@19.2.3): + iterator.prototype@1.1.2: dependencies: - '@types/react-reconciler': 0.28.9(@types/react@19.2.10) - react: 19.2.3 - transitivePeerDependencies: - - '@types/react' + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.5 + set-function-name: 2.0.1 jackspeak@3.4.3: dependencies: @@ -14630,128 +13526,84 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.4: + jest-worker@27.5.1: 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: {} + '@types/node': 22.12.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + optional: true - jose@6.1.3: {} + jiti@1.21.6: {} - jpeg-js@0.4.4: {} + jiti@2.4.2: {} - js-image-generator@1.0.4: - dependencies: - jpeg-js: 0.4.4 + js-levenshtein@1.1.6: {} js-tokens@4.0.0: {} - js-yaml@3.14.2: + js-tokens@9.0.1: {} + + 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@2.2.3: {} - - jsonpointer@5.0.1: {} - - jsonwebtoken@9.0.2: - dependencies: - jws: 3.2.3 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.7.3 - - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.2 - object.assign: 4.1.7 - object.values: 1.2.1 - - jszip@3.10.1: + json5@1.0.2: dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - - junk@4.0.1: {} + minimist: 1.2.8 - jwa@1.4.2: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 + json5@2.2.3: {} - jws@3.2.3: + jsonfile@6.1.0: dependencies: - jwa: 1.4.2 - safe-buffer: 5.2.1 + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 - jwt-decode@4.0.0: {} + jsonparse@1.3.1: {} - katex@0.16.22: + jsx-ast-utils@3.3.5: dependencies: - commander: 8.3.0 + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.1.7 + + jwt-decode@3.1.2: {} keyv@4.5.4: dependencies: json-buffer: 3.0.1 - 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 - - lambda-local@2.2.0: - dependencies: - commander: 10.0.1 - dotenv: 16.6.1 - winston: 3.18.3 + klona@2.0.6: {} - langium@3.3.1: - dependencies: - chevrotain: 11.0.3 - chevrotain-allstar: 0.3.1(chevrotain@11.0.3) - vscode-languageserver: 9.0.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.0.8 + knitwork@1.1.0: {} language-subtag-registry@0.3.22: {} @@ -14759,94 +13611,66 @@ snapshots: dependencies: language-subtag-registry: 0.3.22 - layout-base@1.0.2: {} - - 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 - leven@3.1.0: {} - levn@0.4.1: dependencies: 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 - - lightningcss-darwin-x64@1.30.1: - optional: true - - lightningcss-freebsd-x64@1.30.1: - optional: true - - lightningcss-linux-arm-gnueabihf@1.30.1: - optional: true - - lightningcss-linux-arm64-gnu@1.30.1: - optional: true - - lightningcss-linux-arm64-musl@1.30.1: - optional: true - - lightningcss-linux-x64-gnu@1.30.1: - optional: true - - lightningcss-linux-x64-musl@1.30.1: - optional: true + lilconfig@2.1.0: {} - lightningcss-win32-arm64-msvc@1.30.1: - optional: true + lilconfig@3.1.1: {} - lightningcss-win32-x64-msvc@1.30.1: - optional: true + lines-and-columns@1.2.4: {} - lightningcss@1.30.1: + linkify-it@5.0.0: dependencies: - detect-libc: 2.0.4 - optionalDependencies: - lightningcss-darwin-arm64: 1.30.1 - lightningcss-darwin-x64: 1.30.1 - lightningcss-freebsd-x64: 1.30.1 - lightningcss-linux-arm-gnueabihf: 1.30.1 - lightningcss-linux-arm64-gnu: 1.30.1 - lightningcss-linux-arm64-musl: 1.30.1 - lightningcss-linux-x64-gnu: 1.30.1 - lightningcss-linux-x64-musl: 1.30.1 - lightningcss-win32-arm64-msvc: 1.30.1 - lightningcss-win32-x64-msvc: 1.30.1 - - lines-and-columns@1.2.4: - optional: true + uc.micro: 2.1.0 listhen@1.9.0: dependencies: - '@parcel/watcher': 2.5.1 - '@parcel/watcher-wasm': 2.5.1 + '@parcel/watcher': 2.4.1 + '@parcel/watcher-wasm': 2.4.1 citty: 0.1.6 clipboardy: 4.0.0 - consola: 3.4.2 - crossws: 0.3.5 + consola: 3.4.0 + crossws: 0.3.3 defu: 6.1.4 - get-port-please: 3.2.0 - h3: 1.15.4 + get-port-please: 3.1.2 + h3: 1.14.0 http-shutdown: 1.2.2 - jiti: 2.6.0 - mlly: 1.7.4 - node-forge: 1.3.3 + jiti: 2.4.2 + mlly: 1.7.3 + node-forge: 1.3.1 pathe: 1.1.2 - std-env: 3.9.0 - ufo: 1.6.1 + std-env: 3.8.0 + ufo: 1.5.4 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 @@ -14854,609 +13678,368 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 - local-pkg@1.1.2: - dependencies: - mlly: 1.7.4 - pkg-types: 2.3.0 - quansync: 0.2.11 + loader-runner@4.3.0: + optional: true - locate-path@6.0.0: + local-pkg@0.5.1: dependencies: - p-locate: 5.0.0 + mlly: 1.7.3 + pkg-types: 1.2.1 - locate-path@7.2.0: + locate-path@5.0.0: dependencies: - p-locate: 6.0.0 + p-locate: 4.1.0 - lodash-es@4.17.21: {} + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 lodash.castarray@4.4.0: {} - lodash.includes@4.3.0: {} + lodash.debounce@4.0.8: {} - lodash.isboolean@3.0.3: {} + lodash.defaults@4.2.0: {} - lodash.isinteger@4.0.4: {} + lodash.isarguments@3.1.0: {} - lodash.isnumber@3.0.3: {} + lodash.isequal@4.5.0: {} lodash.isplainobject@4.0.6: {} - lodash.isstring@4.0.1: {} - lodash.merge@4.6.2: {} - lodash.once@4.1.1: {} - lodash@4.17.21: {} - logform@2.7.0: - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.5.0 - triple-beam: 1.4.1 - - 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): - dependencies: - react: 19.2.3 - 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 - - magic-string@0.30.19: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.0 magic-string@0.30.8: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - map-obj@5.0.2: {} - - markdown-table@3.0.4: {} + '@jridgewell/sourcemap-codec': 1.5.0 - marked@15.0.12: {} - - match-sorter@8.2.0: + magicast@0.3.5: dependencies: - '@babel/runtime': 7.28.4 - remove-accents: 0.5.0 - - math-intrinsics@1.1.0: {} + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + source-map-js: 1.2.1 - mdast-util-find-and-replace@3.0.2: + markdown-it@14.1.0: 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 + 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 - mdast-util-gfm-autolink-literal@2.0.1: + marked-alert@2.0.1(marked@13.0.2): 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 + marked: 13.0.2 - mdast-util-gfm-footnote@2.1.0: + marked-gfm-heading-id@4.0.0(marked@13.0.2): 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 + github-slugger: 2.0.0 + marked: 13.0.2 - mdast-util-gfm-strikethrough@2.0.0: + marked-highlight@2.1.4(marked@13.0.2): dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color + marked: 13.0.2 - 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 + marked@13.0.2: {} - mdast-util-gfm-task-list-item@2.0.0: + mdast-util-definitions@4.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 + unist-util-visit: 2.0.3 - mdast-util-gfm@3.1.0: + mdast-util-from-markdown@0.8.5: 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 + '@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 - mdast-util-phrasing@4.1.0: + mdast-util-to-hast@10.2.0: dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.1 + '@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 - 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 + mdast-util-to-string@2.0.0: {} - memorystream@0.3.1: {} + mdurl@1.0.1: {} - merge-descriptors@2.0.0: {} + mdurl@2.0.0: {} - merge-options@3.0.4: - dependencies: - is-plain-obj: 2.1.0 + memorystream@0.3.1: {} merge-stream@2.0.0: {} merge2@1.4.1: {} - mermaid@11.11.0: + micromark@2.11.4: 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 + debug: 4.4.0(supports-color@9.4.0) + parse-entities: 2.0.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: - 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 - - micromark-extension-gfm-tagfilter@2.0.0: - dependencies: - micromark-util-types: 2.0.2 - - micromark-extension-gfm-task-list-item@2.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 - - micromark-extension-gfm@3.0.0: + micromatch@4.0.8: 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 + braces: 3.0.3 + picomatch: 2.3.1 - micromark-factory-destination@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + mime-db@1.52.0: {} - micromark-factory-label@2.0.1: + mime-types@2.1.35: dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + mime-db: 1.52.0 - micromark-factory-space@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 + mime@1.6.0: {} - 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 + mime@3.0.0: {} - 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 + mime@4.0.4: {} - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + mimic-fn@4.0.0: {} - micromark-util-chunked@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 + min-indent@1.0.1: {} - micromark-util-classify-character@2.0.1: + minimatch@3.1.2: dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + brace-expansion: 1.1.11 - micromark-util-combine-extensions@2.0.1: + minimatch@5.1.6: dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 + brace-expansion: 2.0.1 - micromark-util-decode-numeric-character-reference@2.0.2: + minimatch@8.0.4: dependencies: - micromark-util-symbol: 2.0.1 + brace-expansion: 2.0.1 - micromark-util-decode-string@2.0.1: + minimatch@9.0.3: 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 - - micromark-util-encode@2.0.1: {} + brace-expansion: 2.0.1 - micromark-util-html-tag-name@2.0.1: {} - - micromark-util-normalize-identifier@2.0.1: + minimatch@9.0.5: dependencies: - micromark-util-symbol: 2.0.1 + brace-expansion: 2.0.1 - micromark-util-resolve-all@2.0.1: - dependencies: - micromark-util-types: 2.0.2 + minimist@1.2.8: {} - micromark-util-sanitize-uri@2.0.1: + minipass@3.3.6: dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 + yallist: 4.0.0 - micromark-util-subtokenize@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + minipass@4.2.8: {} - micromark-util-symbol@2.0.1: {} + minipass@5.0.0: {} - micromark-util-types@2.0.2: {} + minipass@7.1.2: {} - micromark@4.0.2: + minizlib@2.1.2: 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 - transitivePeerDependencies: - - supports-color + minipass: 3.3.6 + yallist: 4.0.0 - micromatch@4.0.8: + minizlib@3.0.1: dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.54.0: {} + minipass: 7.1.2 + rimraf: 5.0.10 - mime-types@3.0.1: - dependencies: - mime-db: 1.54.0 + mkdirp@0.3.0: {} - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 + mkdirp@1.0.4: {} - mimic-fn@4.0.0: {} + mkdirp@3.0.1: {} - minimatch@10.1.1: + mlly@1.7.3: dependencies: - '@isaacs/brace-expansion': 5.0.0 + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 + moment@2.30.1: {} - minimatch@5.1.6: - dependencies: - brace-expansion: 4.0.1 + motion-dom@11.14.3: {} - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 + motion-utils@11.14.3: {} - minimist@1.2.8: {} + mri@1.2.0: {} - minipass@7.1.2: {} + mrmime@1.0.1: {} - minizlib@3.0.2: - dependencies: - minipass: 7.1.2 + ms@2.0.0: {} - mkdirp@0.3.0: {} + ms@2.1.3: {} - mkdirp@0.5.6: + mz@2.7.0: dependencies: - minimist: 1.2.8 - - mkdirp@3.0.1: {} + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 - mlly@1.7.4: + nano@10.1.4: dependencies: - acorn: 8.15.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.1 + axios: 1.7.8 + node-abort-controller: 3.1.1 + qs: 6.13.1 + transitivePeerDependencies: + - debug - module-definition@6.0.1: - dependencies: - ast-module-types: 6.0.1 - node-source-walk: 7.0.1 + nanoid@3.3.8: {} - module-details-from-path@1.0.4: {} + natural-compare-lite@1.4.0: {} - ms@2.1.3: {} + natural-compare@1.4.0: {} - msgpackr-extract@3.0.3: - 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 + neo-async@2.6.2: optional: true - msgpackr@1.11.8: - optionalDependencies: - msgpackr-extract: 3.0.3 - - multipasta@0.2.7: {} - - nanoid@3.3.11: {} - - natural-compare@1.4.0: {} - - negotiator@1.0.0: {} + nice-try@1.0.5: {} - netlify-redirector@0.5.0: {} + nitropack@2.10.4(typescript@5.6.3): + dependencies: + '@cloudflare/kv-asset-handler': 0.3.4 + '@netlify/functions': 2.8.2 + '@rollup/plugin-alias': 5.1.1(rollup@4.32.1) + '@rollup/plugin-commonjs': 28.0.1(rollup@4.32.1) + '@rollup/plugin-inject': 5.0.5(rollup@4.32.1) + '@rollup/plugin-json': 6.1.0(rollup@4.32.1) + '@rollup/plugin-node-resolve': 15.3.0(rollup@4.32.1) + '@rollup/plugin-replace': 6.0.1(rollup@4.32.1) + '@rollup/plugin-terser': 0.4.4(rollup@4.32.1) + '@rollup/pluginutils': 5.1.3(rollup@4.32.1) + '@types/http-proxy': 1.17.15 + '@vercel/nft': 0.27.9(rollup@4.32.1) + archiver: 7.0.1 + c12: 2.0.1(magicast@0.3.5) + chokidar: 3.6.0 + citty: 0.1.6 + compatx: 0.1.8 + confbox: 0.1.8 + consola: 3.4.0 + cookie-es: 1.2.2 + croner: 9.0.0 + crossws: 0.3.3 + db0: 0.2.1 + defu: 6.1.4 + destr: 2.0.3 + dot-prop: 9.0.0 + esbuild: 0.24.2 + escape-string-regexp: 5.0.0 + etag: 1.8.1 + fs-extra: 11.2.0 + globby: 14.0.2 + gzip-size: 7.0.0 + h3: 1.14.0 + hookable: 5.5.3 + httpxy: 0.1.5 + ioredis: 5.4.1 + jiti: 2.4.2 + klona: 2.0.6 + knitwork: 1.1.0 + listhen: 1.9.0 + magic-string: 0.30.17 + magicast: 0.3.5 + mime: 4.0.4 + mlly: 1.7.3 + node-fetch-native: 1.6.6 + ofetch: 1.4.1 + ohash: 1.1.4 + openapi-typescript: 7.4.4(typescript@5.6.3) + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.2.1 + pretty-bytes: 6.1.1 + radix3: 1.1.2 + rollup: 4.32.1 + rollup-plugin-visualizer: 5.12.0(rollup@4.32.1) + scule: 1.3.0 + semver: 7.6.3 + serve-placeholder: 2.0.2 + serve-static: 1.16.2 + std-env: 3.8.0 + ufo: 1.5.4 + uncrypto: 0.1.3 + unctx: 2.4.1 + unenv: 1.10.0 + unimport: 3.14.5(rollup@4.32.1) + unstorage: 1.14.4(db0@0.2.1)(ioredis@5.4.1) + untyped: 1.5.1 + unwasm: 0.3.9 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - supports-color + - typescript + - uploadthing - nice-try@1.0.5: {} + node-abort-controller@3.1.1: {} node-addon-api@7.1.1: {} - node-domexception@1.0.0: {} - - node-fetch-native@1.6.7: {} + node-fetch-native@1.6.6: {} node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - - node-forge@1.3.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: {} - node-mock-http@1.0.3: {} - node-releases@2.0.19: {} - node-source-walk@7.0.1: - dependencies: - '@babel/parser': 7.28.4 - - node-stream-zip@1.15.0: {} - nopt@1.0.10: dependencies: abbrev: 1.1.1 - nopt@8.1.0: + nopt@8.0.0: dependencies: - abbrev: 3.0.1 + abbrev: 2.0.0 normalize-package-data@2.5.0: dependencies: @@ -15465,27 +14048,27 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 - normalize-package-data@6.0.2: - dependencies: - hosted-git-info: 7.0.2 - semver: 7.7.3 - validate-npm-package-license: 3.0.4 - - normalize-path@2.1.1: - dependencies: - remove-trailing-separator: 1.1.0 - normalize-path@3.0.0: {} 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 @@ -15497,11 +14080,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 @@ -15510,11 +14088,20 @@ snapshots: dependencies: esm-env: 1.1.4 - oauth4webapi@3.7.0: {} + nypm@0.3.12: + dependencies: + citty: 0.1.6 + consola: 3.4.0 + execa: 8.0.1 + pathe: 1.1.2 + pkg-types: 1.2.1 + ufo: 1.5.4 object-assign@4.1.1: {} - object-inspect@1.13.4: {} + object-hash@3.0.0: {} + + object-inspect@1.13.1: {} object-keys@1.1.1: {} @@ -15522,48 +14109,60 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - has-symbols: 1.1.0 + has-symbols: 1.0.3 object-keys: 1.1.1 - object.assign@4.1.7: + object.entries@1.1.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.5 + + 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 - has-symbols: 1.1.0 - object-keys: 1.1.1 + es-abstract: 1.22.5 - object.entries@1.1.9: + object.groupby@1.0.2: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 + array.prototype.filter: 1.0.3 + call-bind: 1.0.7 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-abstract: 1.22.5 + es-errors: 1.3.0 - object.fromentries@2.0.8: + object.hasown@1.1.3: dependencies: - call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 + es-abstract: 1.22.5 - object.values@1.2.1: + object.values@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 + es-abstract: 1.22.5 - obuf@1.1.2: {} + octokit@4.0.3: + dependencies: + '@octokit/app': 15.1.1 + '@octokit/core': 6.1.2 + '@octokit/oauth-app': 7.1.4 + '@octokit/plugin-paginate-graphql': 5.2.4(@octokit/core@6.1.2) + '@octokit/plugin-paginate-rest': 11.3.6(@octokit/core@6.1.2) + '@octokit/plugin-rest-endpoint-methods': 13.2.6(@octokit/core@6.1.2) + '@octokit/plugin-retry': 7.1.2(@octokit/core@6.1.2) + '@octokit/plugin-throttling': 9.3.2(@octokit/core@6.1.2) + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.6.2 ofetch@1.4.1: dependencies: - destr: 2.0.5 - node-fetch-native: 1.6.7 - ufo: 1.6.1 + destr: 2.0.3 + node-fetch-native: 1.6.6 + ufo: 1.5.4 - omit.js@2.0.2: {} + ohash@1.1.4: {} on-finished@2.4.1: dependencies: @@ -15573,19 +14172,28 @@ snapshots: dependencies: wrappy: 1.0.2 - one-time@1.0.0: - dependencies: - fn.name: 1.1.0 - onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - open@7.4.2: + open@8.4.2: dependencies: + define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 + openapi-typescript@7.4.4(typescript@5.6.3): + dependencies: + '@redocly/openapi-core': 1.26.0(supports-color@9.4.0) + ansi-colors: 4.1.3 + change-case: 5.4.4 + parse-json: 8.1.0 + supports-color: 9.4.0 + typescript: 5.6.3 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - encoding + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -15595,66 +14203,48 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - - p-event@6.0.1: + p-limit@2.3.0: dependencies: - p-timeout: 6.1.4 + p-try: 2.2.0 p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: + p-limit@6.2.0: dependencies: - yocto-queue: 1.2.1 + yocto-queue: 1.1.1 - p-limit@6.2.0: + p-locate@4.1.0: dependencies: - yocto-queue: 1.2.1 + p-limit: 2.3.0 p-locate@5.0.0: dependencies: p-limit: 3.1.0 - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - - p-map@7.0.3: {} - - p-retry@6.2.1: - dependencies: - '@types/retry': 0.12.2 - is-network-error: 1.1.0 - retry: 0.13.1 - - p-timeout@6.1.4: {} - - p-wait-for@5.0.2: - dependencies: - p-timeout: 6.1.4 + p-try@2.2.0: {} package-json-from-dist@1.0.1: {} - 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-gitignore@2.0.0: {} - - parse-imports@2.2.1: + parse-entities@2.0.0: dependencies: - es-module-lexer: 1.7.0 - slashes: 3.0.12 + 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-json@4.0.0: dependencies: @@ -15663,40 +14253,35 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 - error-ex: 1.3.4 + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - optional: true - parse-json@8.3.0: + parse-json@8.1.0: dependencies: - '@babel/code-frame': 7.27.1 - index-to-position: 1.2.0 - type-fest: 4.41.0 - - parse-ms@4.0.0: {} + '@babel/code-frame': 7.26.2 + index-to-position: 0.1.2 + type-fest: 4.30.0 parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 - parse5: 7.3.0 + parse5: 7.2.1 parse5-parser-stream@7.1.2: dependencies: - parse5: 7.3.0 + parse5: 7.2.1 - parse5@7.3.0: + parse5@7.2.1: dependencies: - entities: 6.0.1 + entities: 4.5.0 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: {} @@ -15711,185 +14296,97 @@ 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: {} + path-type@5.0.0: {} pathe@1.1.2: {} - pathe@2.0.3: {} - - 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 + perfect-debounce@1.0.0: {} picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.3: {} - - picoquery@2.5.0: {} + picomatch@4.0.2: {} pidtree@0.3.1: {} + pify@2.3.0: {} + pify@3.0.0: {} - pkce-challenge@5.0.1: {} + pirates@4.0.6: {} - pkg-types@1.3.1: + pkg-types@1.2.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.3 - - pkg-types@2.3.0: - dependencies: - confbox: 0.2.2 - 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 + mlly: 1.7.3 + pathe: 1.1.2 pluralize@8.0.0: {} - points-on-curve@0.2.0: {} - - points-on-path@0.2.1: - dependencies: - path-data-parser: 0.1.0 - points-on-curve: 0.2.0 - possible-typed-array-names@1.0.0: {} - postcss-selector-parser@6.0.10: + postcss-import@15.1.0(postcss@8.5.1): dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-value-parser@4.2.0: {} + postcss: 8.5.1 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 - postcss-values-parser@6.0.2(postcss@8.5.6): + postcss-js@4.0.1(postcss@8.5.1): dependencies: - color-name: 1.1.4 - is-url-superb: 4.0.0 - postcss: 8.5.6 - quote-unquote: 1.0.0 + camelcase-css: 2.0.1 + postcss: 8.5.1 - postcss@8.5.6: + postcss-load-config@4.0.2(postcss@8.5.1): dependencies: - nanoid: 3.3.11 - 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: {} + lilconfig: 3.1.1 + yaml: 2.4.0 + optionalDependencies: + postcss: 8.5.1 - postgres-bytea@3.0.0: + postcss-nested@6.0.1(postcss@8.5.1): dependencies: - obuf: 1.1.2 - - postgres-date@1.0.7: {} + postcss: 8.5.1 + postcss-selector-parser: 6.0.15 - postgres-date@2.1.0: {} - - postgres-interval@1.2.0: + postcss-selector-parser@6.0.10: dependencies: - xtend: 4.0.2 - - postgres-interval@3.0.0: {} - - postgres-range@1.1.4: {} - - postgres@3.4.7: {} + cssesc: 3.0.0 + util-deprecate: 1.0.2 - posthog-node@5.20.0: + postcss-selector-parser@6.0.15: dependencies: - '@posthog/core': 1.9.1 + cssesc: 3.0.0 + util-deprecate: 1.0.2 - potpack@1.0.2: {} + postcss-value-parser@4.2.0: {} - preact-render-to-string@5.2.3(preact@10.11.3): + postcss@8.5.1: dependencies: - preact: 10.11.3 - pretty-format: 3.8.0 - - preact@10.11.3: {} + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 preact@10.26.5: {} - precinct@12.2.0: - dependencies: - '@dependents/detective-less': 5.0.1 - commander: 12.1.0 - detective-amd: 6.0.1 - detective-cjs: 6.0.1 - detective-es6: 5.0.1 - detective-postcss: 7.0.1(postcss@8.5.6) - detective-sass: 6.0.1 - detective-scss: 5.0.1 - detective-stylus: 5.0.1 - detective-typescript: 14.0.0(typescript@5.9.2) - detective-vue2: 2.2.0(typescript@5.9.2) - module-definition: 6.0.1 - node-source-walk: 7.0.1 - postcss: 8.5.6 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - prelude-ls@1.2.1: {} - prettier@3.7.4: {} + prettier@2.8.8: {} - pretty-format@3.8.0: {} + prettier@3.2.5: {} - pretty-ms@9.3.0: - dependencies: - parse-ms: 4.0.0 + prettier@3.5.2: {} + + pretty-bytes@6.1.1: {} process-nextick-args@2.0.1: {} @@ -15897,48 +14394,33 @@ 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: {} - pump@3.0.3: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 + punycode.js@2.3.1: {} punycode@2.3.1: {} - pure-rand@6.1.0: {} - - qs@6.14.1: + qs@6.13.1: dependencies: - side-channel: 1.1.0 + side-channel: 1.0.6 - quansync@0.2.11: {} + qs@6.9.7: {} - querystringify@2.2.0: {} + qss@3.0.0: {} queue-microtask@1.2.3: {} - quote-unquote@1.0.0: {} + queue-tick@1.0.1: {} radix3@1.1.2: {} @@ -15948,95 +14430,112 @@ snapshots: range-parser@1.2.1: {} - raw-body@3.0.2: + rc9@2.1.2: dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - unpipe: 1.0.0 + defu: 6.1.4 + destr: 2.0.3 - 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.4.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 + '@types/react': 18.3.12 - 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) + react@19.0.0: {} - react@19.2.3: {} + read-cache@1.0.0: + dependencies: + pify: 2.3.0 - read-package-up@11.0.0: + read-pkg-up@7.0.1: dependencies: - find-up-simple: 1.0.1 - read-pkg: 9.0.1 - type-fest: 4.41.0 + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 read-pkg@3.0.0: dependencies: @@ -16044,13 +14543,12 @@ snapshots: normalize-package-data: 2.5.0 path-type: 3.0.0 - read-pkg@9.0.1: + read-pkg@5.2.0: dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.2 - parse-json: 8.3.0 - type-fest: 4.41.0 - unicorn-magic: 0.1.0 + '@types/normalize-package-data': 2.4.3 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 readable-stream@2.3.8: dependencies: @@ -16062,13 +14560,7 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readable-stream@4.7.0: + readable-stream@4.5.2: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 @@ -16084,147 +14576,91 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.1.2: {} + readdirp@4.0.2: {} - recast@0.23.11: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 + redis-errors@1.2.0: {} - reflect.getprototypeof@1.0.10: + redis-parser@3.0.0: dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - 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 - - regenerator-runtime@0.14.1: {} + redis-errors: 1.2.0 - regexp.prototype.flags@1.5.2: + reflect.getprototypeof@1.0.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 + es-abstract: 1.22.5 es-errors: 1.3.0 - set-function-name: 2.0.1 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 - regexp.prototype.flags@1.5.4: + regenerate-unicode-properties@10.1.1: 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 + regenerate: 1.4.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 + regenerate@1.4.2: {} - 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 + regenerator-runtime@0.14.1: {} - rehype-parse@9.0.1: + regenerator-transform@0.15.2: dependencies: - '@types/hast': 3.0.4 - hast-util-from-html: 2.0.3 - unified: 11.0.5 + '@babel/runtime': 7.24.5 + + regexp-tree@0.1.27: {} - rehype-raw@7.0.0: + regexp.prototype.flags@1.5.2: dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.1.0 - vfile: 6.0.3 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.1 - rehype-slug@6.0.0: + regexpu-core@5.3.2: 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 + '@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-stringify@10.0.1: + regjsparser@0.10.0: 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: + regjsparser@0.9.1: 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 - transitivePeerDependencies: - - supports-color + jsesc: 0.5.0 - remark-parse@11.0.0: + remark-parse@9.0.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.2 - unified: 11.0.5 + mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - remark-rehype@11.1.2: + remark-rehype@8.1.0: 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 + mdast-util-to-hast: 10.2.0 - remark-stringify@11.0.0: + remeda@2.19.0: dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.2 - unified: 11.0.5 + type-fest: 4.30.0 - remove-accents@0.5.0: {} + remix-utils@8.5.0(react@19.0.0)(zod@3.24.1): + dependencies: + type-fest: 4.40.0 + optionalDependencies: + react: 19.0.0 + zod: 3.24.1 remove-markdown@0.5.0: {} - remove-trailing-separator@1.1.0: {} - require-directory@2.1.1: {} 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: {} @@ -16237,80 +14673,57 @@ 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 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - retry@0.13.1: {} - reusify@1.0.4: {} - rimraf@2.6.3: + rimraf@3.0.2: dependencies: - glob: 13.0.0 + glob: 7.2.3 - rimraf@6.1.2: + rimraf@5.0.10: dependencies: - glob: 13.0.0 - package-json-from-dist: 1.0.1 + glob: 10.4.5 robust-predicates@3.0.2: {} - rollup@4.53.3: + rollup-plugin-visualizer@5.12.0(rollup@4.32.1): dependencies: - '@types/estree': 1.0.8 + open: 8.4.2 + picomatch: 2.3.1 + source-map: 0.7.4 + yargs: 17.7.2 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 - fsevents: 2.3.3 - - rou3@0.7.12: {} + rollup: 4.32.1 - roughjs@4.6.6: + rollup@4.32.1: dependencies: - hachure-fill: 0.5.2 - path-data-parser: 0.1.0 - 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 + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.32.1 + '@rollup/rollup-android-arm64': 4.32.1 + '@rollup/rollup-darwin-arm64': 4.32.1 + '@rollup/rollup-darwin-x64': 4.32.1 + '@rollup/rollup-freebsd-arm64': 4.32.1 + '@rollup/rollup-freebsd-x64': 4.32.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.32.1 + '@rollup/rollup-linux-arm-musleabihf': 4.32.1 + '@rollup/rollup-linux-arm64-gnu': 4.32.1 + '@rollup/rollup-linux-arm64-musl': 4.32.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.32.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.32.1 + '@rollup/rollup-linux-riscv64-gnu': 4.32.1 + '@rollup/rollup-linux-s390x-gnu': 4.32.1 + '@rollup/rollup-linux-x64-gnu': 4.32.1 + '@rollup/rollup-linux-x64-musl': 4.32.1 + '@rollup/rollup-win32-arm64-msvc': 4.32.1 + '@rollup/rollup-win32-ia32-msvc': 4.32.1 + '@rollup/rollup-win32-x64-msvc': 4.32.1 + fsevents: 2.3.3 run-parallel@1.2.0: dependencies: @@ -16321,46 +14734,40 @@ snapshots: safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 - get-intrinsic: 1.3.0 - 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 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 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 + safer-buffer@2.1.2: {} - safe-stable-stringify@2.5.0: {} + scheduler@0.25.0: {} - safer-buffer@2.1.2: {} + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + optional: true - sax@1.4.1: {} + schema-utils@4.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + optional: true - scheduler@0.27.0: {} + scule@1.3.0: {} search-insights@2.17.3: {} @@ -16373,23 +14780,23 @@ snapshots: semver@6.3.1: {} - semver@7.7.2: {} - - semver@7.7.3: {} + semver@7.6.3: {} - send@1.2.1: + send@0.19.0: dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 escape-html: 1.0.3 etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.1 - mime-types: 3.0.2 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.2 + statuses: 2.0.1 transitivePeerDependencies: - supports-color @@ -16397,28 +14804,30 @@ snapshots: dependencies: randombytes: 2.1.0 - seroval-plugins@1.5.0(seroval@1.5.0): + serve-placeholder@2.0.2: dependencies: - seroval: 1.5.0 - - seroval@1.5.0: {} + defu: 6.1.4 - serve-static@2.2.1: + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.2.1 + send: 0.19.0 transitivePeerDependencies: - supports-color + server-only@0.0.1: {} + + set-cookie-parser@2.6.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 has-property-descriptors: 1.0.2 set-function-name@2.0.1: @@ -16427,51 +14836,15 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: + set-getter@0.1.1: dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - - setimmediate@1.0.5: {} + to-object-path: 0.3.0 setprototypeof@1.2.0: {} - sharp@0.34.4: + shallow-clone@3.0.1: dependencies: - '@img/colour': 1.0.0 - detect-libc: 2.1.2 - semver: 7.7.3 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.4 - '@img/sharp-darwin-x64': 0.34.4 - '@img/sharp-libvips-darwin-arm64': 1.2.3 - '@img/sharp-libvips-darwin-x64': 1.2.3 - '@img/sharp-libvips-linux-arm': 1.2.3 - '@img/sharp-libvips-linux-arm64': 1.2.3 - '@img/sharp-libvips-linux-ppc64': 1.2.3 - '@img/sharp-libvips-linux-s390x': 1.2.3 - '@img/sharp-libvips-linux-x64': 1.2.3 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 - '@img/sharp-linux-arm': 0.34.4 - '@img/sharp-linux-arm64': 0.34.4 - '@img/sharp-linux-ppc64': 0.34.4 - '@img/sharp-linux-s390x': 0.34.4 - '@img/sharp-linux-x64': 0.34.4 - '@img/sharp-linuxmusl-arm64': 0.34.4 - '@img/sharp-linuxmusl-x64': 0.34.4 - '@img/sharp-wasm32': 0.34.4 - '@img/sharp-win32-arm64': 0.34.4 - '@img/sharp-win32-ia32': 0.34.4 - '@img/sharp-win32-x64': 0.34.4 + kind-of: 6.0.3 shebang-command@1.2.0: dependencies: @@ -16492,52 +14865,20 @@ snapshots: '@shikijs/core': 1.10.3 '@types/hast': 3.0.4 - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: + side-channel@1.0.6: dependencies: + call-bind: 1.0.7 es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 signal-exit@4.1.0: {} - slashes@3.0.12: {} + slash@3.0.0: {} - source-map-explorer@2.5.3: - 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 + slash@5.1.0: {} + + smob@1.5.0: {} source-map-js@1.2.1: {} @@ -16548,9 +14889,9 @@ snapshots: source-map@0.6.1: {} - source-map@0.7.6: {} + source-map@0.7.4: {} - space-separated-tokens@2.0.2: {} + space-separated-tokens@1.1.5: {} spdx-correct@3.2.0: dependencies: @@ -16568,35 +14909,25 @@ snapshots: sprintf-js@1.0.3: {} - sqids@0.3.0: {} - - srvx@0.10.1: {} + sse.js@2.5.0: {} - stack-trace@0.0.10: {} + standard-as-callback@2.1.0: {} - stats-gl@2.4.2(@types/three@0.182.0)(three@0.182.0): - dependencies: - '@types/three': 0.182.0 - three: 0.182.0 - - stats.js@0.17.0: {} + statuses@2.0.1: {} - statuses@2.0.2: {} + std-env@3.8.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: + streamx@2.20.1: dependencies: - events-universal: 1.0.1 fast-fifo: 1.3.2 - text-decoder: 1.2.3 - transitivePeerDependencies: - - react-native-b4a + queue-tick: 1.0.1 + text-decoder: 1.2.1 + optionalDependencies: + bare-events: 2.5.0 + + string-natural-compare@3.0.1: {} string-width@4.2.3: dependencies: @@ -16608,50 +14939,25 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.2 + strip-ansi: 7.1.0 - string.prototype.includes@2.0.1: - 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 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - 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 - side-channel: 1.1.0 - - string.prototype.padend@3.1.5: + string.prototype.matchall@4.0.10: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.22.5 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.1 + side-channel: 1.0.6 - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.trim@1.2.10: + string.prototype.padend@3.1.5: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 + es-abstract: 1.22.5 string.prototype.trim@1.2.8: dependencies: @@ -16665,25 +14971,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 @@ -16692,18 +14985,13 @@ 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 - strip-ansi@7.1.2: + strip-ansi@7.1.0: dependencies: - ansi-regex: 6.2.2 + ansi-regex: 6.1.0 strip-bom-string@1.0.0: {} @@ -16711,19 +14999,37 @@ 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: {} + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + style-to-js@1.1.12: 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 - stylis@4.3.6: {} + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 supports-color@5.5.0: dependencies: @@ -16733,30 +15039,14 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} - - suspend-react@0.1.3(react@19.2.3): + supports-color@8.1.1: dependencies: - react: 19.2.3 + has-flag: 4.0.0 + optional: true - svgo@4.0.0: - dependencies: - commander: 11.1.0 - css-select: 5.1.0 - css-tree: 3.1.0 - css-what: 6.1.0 - csso: 5.0.5 - picocolors: 1.1.1 - sax: 1.4.1 + supports-color@9.4.0: {} - svix@1.76.1: - 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 + supports-preserve-symlinks-flag@1.0.0: {} system-architecture@0.1.0: {} @@ -16764,168 +15054,164 @@ snapshots: tailwind-merge@1.14.0: {} - tailwindcss-animate@1.0.7(tailwindcss@4.1.11): + tailwindcss@3.4.1: dependencies: - tailwindcss: 4.1.11 - - tailwindcss@4.1.11: {} + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.1 + postcss-import: 15.1.0(postcss@8.5.1) + postcss-js: 4.0.1(postcss@8.5.1) + postcss-load-config: 4.0.2(postcss@8.5.1) + postcss-nested: 6.0.1(postcss@8.5.1) + postcss-selector-parser: 6.0.15 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node - tapable@2.2.2: {} + tapable@2.2.1: + optional: true tar-stream@3.1.7: dependencies: - b4a: 1.7.3 + b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.23.0 - transitivePeerDependencies: - - react-native-b4a + streamx: 2.20.1 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 tar@7.4.3: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 - minizlib: 3.0.2 + minizlib: 3.0.1 mkdirp: 3.0.1 yallist: 5.0.0 - temp@0.9.4: + terser-webpack-plugin@5.3.11(webpack@5.97.1): dependencies: - mkdirp: 0.5.6 - rimraf: 2.6.3 + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.37.0 + webpack: 5.97.1 + optional: true - terser@5.44.0: + terser@5.37.0: dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 - optional: true - - text-decoder@1.2.3: - dependencies: - b4a: 1.7.3 - transitivePeerDependencies: - - react-native-b4a - text-hex@1.0.0: {} + text-decoder@1.2.1: {} - thingies@2.5.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 + text-table@0.2.0: {} - three-mesh-bvh@0.8.3(three@0.182.0): + thenify-all@1.6.0: dependencies: - three: 0.182.0 + thenify: 3.3.1 - three-stdlib@2.36.1(three@0.182.0): + thenify@3.3.1: 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 + any-promise: 1.3.0 - three@0.182.0: {} + through@2.3.8: {} tiny-invariant@1.3.3: {} tiny-warning@1.0.3: {} - tinyexec@1.0.1: {} - - tinyglobby@0.2.14: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - - tinyglobby@0.2.15: + tinyglobby@0.2.13: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 - tmp-promise@3.0.3: + to-object-path@0.3.0: dependencies: - tmp: 0.2.5 - - tmp@0.2.5: {} + kind-of: 3.2.2 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} - - toml@3.0.0: {} + toad-cache@3.7.0: {} - tomlify-j0.4@3.0.0: {} + toidentifier@1.0.1: {} tr46@0.0.3: {} - tree-dump@1.1.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - trim-lines@3.0.1: {} + trough@1.0.5: {} - 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 - - troika-three-utils@0.52.4(three@0.182.0): + ts-api-utils@1.3.0(typescript@5.6.3): dependencies: - three: 0.182.0 + typescript: 5.6.3 - troika-worker-utils@0.52.0: {} + ts-interface-checker@0.1.13: {} - trough@2.2.0: {} + tsconfck@3.1.4(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 - ts-api-utils@2.1.0(typescript@5.9.2): + tsconfig-paths@3.15.0: dependencies: - typescript: 5.9.2 - - ts-dedent@2.2.0: {} + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 - tsconfck@3.1.4(typescript@5.9.2): - optionalDependencies: - typescript: 5.9.2 + tslib@1.14.1: {} tslib@2.8.1: {} - tsx@4.21.0: + tsutils@3.21.0(typescript@5.6.3): dependencies: - esbuild: 0.27.0 - get-tsconfig: 4.10.1 - optionalDependencies: - fsevents: 2.3.3 + tslib: 1.14.1 + typescript: 5.6.3 - tunnel-rat@0.1.2(@types/react@19.2.10)(react@19.2.3): + tsx@4.19.2: dependencies: - zustand: 4.5.2(@types/react@19.2.10)(react@19.2.3) - transitivePeerDependencies: - - '@types/react' - - immer - - react + esbuild: 0.23.1 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 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@2.19.0: {} + + type-fest@4.30.0: {} + + type-fest@4.40.0: {} typed-array-buffer@1.0.2: dependencies: @@ -16933,182 +15219,198 @@ 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 for-each: 0.3.3 - gopd: 1.2.0 + gopd: 1.0.1 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 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.2.0 + gopd: 1.0.1 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 for-each: 0.3.3 - gopd: 1.2.0 + gopd: 1.0.1 has-proto: 1.0.3 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.6.3: {} - typescript@5.9.2: {} + uc.micro@2.1.0: {} - ufo@1.6.1: {} - - ulid@3.0.1: {} + ufo@1.5.4: {} unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 - has-symbols: 1.1.0 + has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - unbox-primitive@1.1.0: + uncrypto@0.1.3: {} + + unctx@2.4.1: dependencies: - call-bound: 1.0.4 - has-bigints: 1.0.2 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 + acorn: 8.14.0 + estree-walker: 3.0.3 + magic-string: 0.30.17 + unplugin: 2.1.2 - uncrypto@0.1.3: {} + undici-types@5.28.4: {} - undici-types@6.21.0: {} + undici-types@6.20.0: {} - undici-types@7.10.0: {} + undici@6.21.0: {} - undici@7.14.0: {} + unenv@1.10.0: + dependencies: + consola: 3.4.0 + defu: 6.1.4 + mime: 3.0.0 + node-fetch-native: 1.6.6 + pathe: 1.1.2 - 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: + unimport@3.14.5(rollup@4.32.1): dependencies: - '@types/unist': 3.0.3 + '@rollup/pluginutils': 5.1.3(rollup@4.32.1) + acorn: 8.14.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + fast-glob: 3.3.3 + local-pkg: 0.5.1 + magic-string: 0.30.17 + mlly: 1.7.3 + pathe: 1.1.2 + picomatch: 4.0.2 + pkg-types: 1.2.1 + scule: 1.3.0 + strip-literal: 2.1.1 + unplugin: 1.16.1 + transitivePeerDependencies: + - rollup - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 + unist-builder@2.0.3: {} + + unist-util-generated@1.1.6: {} + + unist-util-is@4.1.0: {} + + unist-util-position@3.1.0: {} - unist-util-stringify-position@4.0.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.0: {} universal-user-agent@6.0.0: {} - unixify@1.0.0: - dependencies: - normalize-path: 2.1.1 + universal-user-agent@7.0.2: {} - unpipe@1.0.0: {} + universalify@2.0.1: {} unplugin@1.0.1: dependencies: - acorn: 8.15.0 + acorn: 8.14.0 chokidar: 3.6.0 - webpack-sources: 3.3.3 + webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 - unplugin@2.3.10: + unplugin@1.16.1: + dependencies: + acorn: 8.14.0 + webpack-virtual-modules: 0.6.2 + + unplugin@2.1.2: dependencies: - '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 - picomatch: 4.0.3 + acorn: 8.14.0 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.14.4(db0@0.2.1)(ioredis@5.4.1): dependencies: anymatch: 3.1.3 - chokidar: 4.0.3 - destr: 2.0.5 - h3: 1.15.4 + chokidar: 3.6.0 + destr: 2.0.3 + h3: 1.14.0 lru-cache: 10.4.3 - node-fetch-native: 1.6.7 + node-fetch-native: 1.6.6 ofetch: 1.4.1 - ufo: 1.6.1 + ufo: 1.5.4 optionalDependencies: - '@netlify/blobs': 10.0.11 - uploadthing: 7.7.4(express@5.2.1)(h3@1.15.4)(tailwindcss@4.1.11) + db0: 0.2.1 + ioredis: 5.4.1 untun@0.1.3: dependencies: citty: 0.1.6 - consola: 3.4.2 + consola: 3.4.0 + pathe: 1.1.2 + + untyped@1.5.1: + dependencies: + '@babel/core': 7.26.9 + '@babel/standalone': 7.26.4 + '@babel/types': 7.26.9 + defu: 6.1.4 + jiti: 2.4.2 + mri: 1.2.0 + scule: 1.3.0 + transitivePeerDependencies: + - supports-color + + unwasm@0.3.9: + dependencies: + knitwork: 1.1.0 + magic-string: 0.30.17 + mlly: 1.7.3 pathe: 1.1.2 + pkg-types: 1.2.1 + unplugin: 1.16.1 update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: @@ -17116,165 +15418,229 @@ 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-replace@1.0.1: {} + 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.4.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: {} - - uuid@11.1.0: {} - - valibot@1.2.0(typescript@5.9.2): - optionalDependencies: - typescript: 5.9.2 + 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 validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - 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 + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 2.0.3 + vfile-message: 2.0.4 - vfile@6.0.3: + vinxi@0.5.3(@types/node@22.12.0)(db0@0.2.1)(ioredis@5.4.1)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.7.1): dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.3 - - vite-bundle-analyzer@1.2.1: {} + '@babel/core': 7.26.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) + '@types/micromatch': 4.0.9 + '@vinxi/listhen': 1.5.6 + boxen: 7.1.1 + chokidar: 3.6.0 + citty: 0.1.6 + consola: 3.4.0 + crossws: 0.3.3 + dax-sh: 0.39.2 + defu: 6.1.4 + es-module-lexer: 1.6.0 + esbuild: 0.20.2 + fast-glob: 3.3.3 + get-port-please: 3.1.2 + h3: 1.13.0 + hookable: 5.5.3 + http-proxy: 1.18.1 + micromatch: 4.0.8 + nitropack: 2.10.4(typescript@5.6.3) + node-fetch-native: 1.6.6 + path-to-regexp: 6.3.0 + pathe: 1.1.2 + radix3: 1.1.2 + resolve: 1.22.10 + serve-placeholder: 2.0.2 + serve-static: 1.16.2 + ufo: 1.5.4 + unctx: 2.4.1 + unenv: 1.10.0 + unstorage: 1.14.4(db0@0.2.1)(ioredis@5.4.1) + vite: 6.0.11(@types/node@22.12.0)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.1) + zod: 3.24.1 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - db0 + - debug + - drizzle-orm + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - mysql2 + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - xml2js + - yaml - 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.6.3): dependencies: - debug: 4.4.3 + debug: 4.4.0(supports-color@9.4.0) 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) + tsconfck: 3.1.4(typescript@5.6.3) 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@6.0.11(@types/node@22.12.0)(jiti@2.4.2)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.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 - tinyglobby: 0.2.15 + esbuild: 0.24.2 + postcss: 8.5.1 + rollup: 4.32.1 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 22.12.0 fsevents: 2.3.3 - 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)): + jiti: 2.4.2 + terser: 5.37.0 + tsx: 4.19.2 + yaml: 2.7.1 + + vue@3.5.13(typescript@5.6.3): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.6.3)) + '@vue/shared': 3.5.13 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) - - vscode-jsonrpc@8.2.0: {} + typescript: 5.6.3 + optional: true - vscode-languageserver-protocol@3.17.5: + watchpack@2.4.2: dependencies: - vscode-jsonrpc: 8.2.0 - vscode-languageserver-types: 3.17.5 - - vscode-languageserver-textdocument@1.0.12: {} - - vscode-languageserver-types@3.17.5: {} + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + optional: true - vscode-languageserver@9.0.1: + web-encoding@1.1.5: dependencies: - vscode-languageserver-protocol: 3.17.5 - - vscode-uri@3.0.8: {} - - web-namespaces@2.0.1: {} + util: 0.12.5 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 web-streams-polyfill@3.3.3: {} - webgl-constants@1.1.1: {} - - webgl-sdf-generator@1.1.1: {} - webidl-conversions@3.0.1: {} - webpack-sources@3.3.3: {} + webpack-sources@3.2.3: {} webpack-virtual-modules@0.5.0: {} webpack-virtual-modules@0.6.2: {} + webpack@5.97.1: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.0 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.11(webpack@5.97.1) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + optional: true + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -17294,29 +15660,20 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 - which-boxed-primitive@1.1.1: - 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: + which-builtin-type@1.1.3: 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: @@ -17330,17 +15687,7 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - 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 + gopd: 1.0.1 has-tostringtag: 1.0.2 which@1.3.1: @@ -17351,25 +15698,13 @@ snapshots: dependencies: isexe: 2.0.0 - winston-transport@4.9.0: + which@4.0.0: dependencies: - logform: 2.7.0 - readable-stream: 3.6.2 - triple-beam: 1.4.1 + isexe: 3.1.1 - winston@3.18.3: + widest-line@4.0.1: dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.8 - async: 3.2.6 - is-stream: 2.0.1 - logform: 2.7.0 - one-time: 1.0.0 - readable-stream: 3.6.2 - safe-stable-stringify: 2.5.0 - stack-trace: 0.0.10 - triple-beam: 1.4.1 - winston-transport: 4.9.0 + string-width: 5.1.2 wrap-ansi@7.0.0: dependencies: @@ -17379,57 +15714,31 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.3 + ansi-styles: 6.2.1 string-width: 5.1.2 - strip-ansi: 7.1.2 + strip-ansi: 7.1.0 wrappy@1.0.2: {} - write-file-atomic@5.0.1: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.1.0 - - xmlbuilder2@4.0.3: - dependencies: - '@oozcitak/dom': 2.0.2 - '@oozcitak/infra': 2.0.2 - '@oozcitak/util': 10.0.0 - js-yaml: 3.14.2 - - 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: {} yallist@3.1.1: {} + yallist@4.0.0: {} + yallist@5.0.0: {} - yaml@1.10.2: - optional: true + yaml-ast-parser@0.0.43: {} - yaml@2.8.1: {} + yaml@1.10.2: {} - yargs-parser@20.2.9: {} + yaml@2.4.0: {} - yargs-parser@21.1.1: {} + yaml@2.7.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-parser@21.1.1: {} yargs@17.7.2: dependencies: @@ -17441,46 +15750,21 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yocto-queue@0.1.0: {} - yocto-queue@1.2.1: {} - - yoctocolors@2.1.2: {} + yocto-queue@1.1.1: {} zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 compress-commons: 6.0.2 - readable-stream: 4.7.0 + readable-stream: 4.5.2 - 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@3.24.1: {} - zod@4.3.5: {} - - zustand@4.5.2(@types/react@19.2.10)(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.2.3) - optionalDependencies: - '@types/react': 19.2.10 - 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)): + 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/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 000000000..8e638a6bc --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,7 @@ +module.exports = { + plugins: [ + require('tailwindcss/nesting'), + require('tailwindcss'), + require('autoprefixer'), + ], +} 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/ads.txt b/public/ads.txt index 29b08a1e0..dd3a34596 100644 --- a/public/ads.txt +++ b/public/ads.txt @@ -1,1086 +1 @@ -google.com, pub-9403278435468733, DIRECT, f08c47fec0942fa0 - -# Publift Fuse ads.txt # -# Updated: May 2025 # -# Contact: support@publift.com # - - -# Publift - -OWNERDOMAIN=tanstack.com -MANAGERDOMAIN=publift.com -publift.com, 01JWZKNBMKR1DGYV29FBB2260R, DIRECT - - -# Google - -google.com, pub-5884294479391638, RESELLER, f08c47fec0942fa0 - - -# Pubmatic - -pubmatic.com, 156230, RESELLER, 5d62403b186f2ace -pubmatic.com, 156762, RESELLER, 5d62403b186f2ace -pubmatic.com, 156974, RESELLER, 5d62403b186f2ace -pubmatic.com, 158221, RESELLER, 5d62403b186f2ace - -# AppNexus - -appnexus.com, 9623, DIRECT, f5ab79cb980f11d1 - -# Rubicon - -rubiconproject.com, 17348, RESELLER, 0bfd66d529a55807 -rubiconproject.com, 11504, RESELLER, 0bfd66d529a55807 -rubiconproject.com, 20884, DIRECT, 0bfd66d529a55807 - -# OpenX - -openx.com, 540717835, RESELLER, 6a698e2ec38604c6 -openx.com, 540938618, DIRECT, 6a698e2ec38604c6 - - -# Criteo - -criteo.com, B-056930, DIRECT, 9fac4a4a87c2a44f -themediagrid.com, U9IDX4, DIRECT, 35d5010d7789b49d - - -# Teads - -teads.tv, 19340, DIRECT, 15a9c44f6d26cbe1 - -# Index Exchange - -indexexchange.com, 186270, RESELLER -indexexchange.com, 186407, DIRECT - - - -# Unruly - -video.unrulymedia.com, UNRX-PUB-a34a2f68-d5c2-4289-a7e3-5414a99e7e7f, DIRECT -indexexchange.com, 182257, RESELLER -appnexus.com, 6849, RESELLER -rubiconproject.com, 15268, RESELLER -video.unrulymedia.com, 197409739, DIRECT -rhythmone.com, 197409739, DIRECT, a670c89d4a324e47 - - -# Sovrn - -sovrn.com, 267370, DIRECT, fafdf38b16bf6b2b -lijit.com, 267370, DIRECT, fafdf38b16bf6b2b #SOVRN -lijit.com, 267370-eb, DIRECT, fafdf38b16bf6b2b #SOVRN -openx.com, 538959099, RESELLER, 6a698e2ec38604c6 -pubmatic.com, 137711, RESELLER, 5d62403b186f2ace -pubmatic.com, 156212, RESELLER, 5d62403b186f2ace -rubiconproject.com, 17960, RESELLER, 0bfd66d529a55807 -appnexus.com, 1019, RESELLER, f5ab79cb980f11d1 -video.unrulymedia.com, 2444764291, RESELLER -contextweb.com, 558511, RESELLER, 89ff185a4c4e857c -krushmedia.com, AJxF6R572a9M6CaTvK, RESELLER, -inmobi.com, b01aa06531c543d8a5fb9982f60afb00, RESELLER, 83e75a7ae333ca9d -motorik.io, 100463, RESELLER -smaato.com, 1100056344, RESELLER, 07bcf65f187117b4 -smartadserver.com, 4926, RESELLER, 060d053dcf45cbf3 - - -# GumGum - -gumgum.com,13654,RESELLER,ffdef49475d318a9 -rubiconproject.com,23434,RESELLER,0bfd66d529a55807 -pubmatic.com,157897,RESELLER,5d62403b186f2ace -appnexus.com,2758,RESELLER,f5ab79cb980f11d1 -contextweb.com,558355,RESELLER,89ff185a4c4e857c -openx.com,537149485,RESELLER,6a698e2ec38604c6 -improvedigital.com,1884,RESELLER -admanmedia.com,799,RESELLER -admedia.com,AM1606,RESELLER - - -# TripleLift - -triplelift.com, 3084, DIRECT, 6c33edb13117fd86 -triplelift.com, 3084-EB, DIRECT, 6c33edb13117fd86 - - - -# Mobfox - -uis.mobfox.com, 82221, DIRECT, 5529a3d1f59865be - -xandr.com, 2850, RESELLER, f5ab79cb980f11d1 -openx.com, 539249210, RESELLER, 6a698e2ec38604c6 -pubmatic.com, 156451, RESELLER, 5d62403b186f2ace -rubiconproject.com, 17494, RESELLER, 0bfd66d529a55807 -xad.com,589, RESELLER, 81cbf0a75a5e0e9a -inmobi.com, a5e661acdc384e91a79a58eb3418e99f, RESELLER, 83e75a7ae333ca9d -sonobi.com, 71169bd4a5, RESELLER, d1a215d9eb5aee9e -loopme.com,11446,RESELLER,6c8d5f95897a5a3b -vidoomy.com, 6858194, RESELLER -adform.com, 2742, RESELLER - -# Amazon - -aps.amazon.com,8b48e249-e9e6-4a52-8b48-396ea93403e8,DIRECT -indexexchange.com,192410,RESELLER,50b1c356f2c5c8fc -pubmatic.com,160006,RESELLER,5d62403b186f2ace -pubmatic.com,160096,RESELLER,5d62403b186f2ace -rubiconproject.com,18020,RESELLER,0bfd66d529a55807 -pubmatic.com,157150,RESELLER,5d62403b186f2ace -openx.com,540191398,RESELLER,6a698e2ec38604c6 -appnexus.com,1908,RESELLER,f5ab79cb980f11d1 -smaato.com,1100044650,RESELLER,07bcf65f187117b4 -ad-generation.jp,12474,RESELLER,7f4ea9029ac04e53 -districtm.io,100962,RESELLER,3fd707be9c4527c3 -yieldmo.com,2719019867620450718,RESELLER -appnexus.com,3663,RESELLER,f5ab79cb980f11d1 -rhythmone.com,1654642120,RESELLER,a670c89d4a324e47 -yahoo.com,55029,RESELLER,e1a5b5b6e3255540 -gumgum.com,14141,RESELLER,ffdef49475d318a9 -admanmedia.com,726,RESELLER -sharethrough.com,7144eb80,RESELLER,d53b998a7bd4ecd2 -emxdgt.com,2009,RESELLER,1e1d41537f7cad7f -appnexus.com,1356,RESELLER,f5ab79cb980f11d1 -contextweb.com,562541,RESELLER,89ff185a4c4e857c -smartadserver.com,4125,RESELLER,060d053dcf45cbf3 -inmobi.com,4fcebe6f9a714a95b066cfdbd5d354d4,DIRECT,83e75a7ae333ca9d -themediagrid.com,JTQKMP,RESELLER,35d5010d7789b49d -sovrn.com,375328,RESELLER,fafdf38b16bf6b2b -lijit.com,375328,RESELLER,fafdf38b16bf6b2b -beachfront.com,14804,RESELLER,e2541279e8e2ca4d -improvedigital.com,2050,RESELLER -mintegral.com,10043,RESELLER,0aeed750c80d6423 -sonobi.com,7f5fa520f8,RESELLER,d1a215d9eb5aee9e -onetag.com,770a440e65869c2,RESELLER -appnexus.com,9623,DIRECT,f5ab79cb980f11d1 -triplelift.com,2985,DIRECT,6c33edb13117fd86 -xandr.com, 9623, RESELLER, f5ab79cb980f11d1 -pubmatic.com, 162256, RESELLER, 5d62403b186f2ace -media.net,8CUZ1MK22,RESELLER -openx.com, 557939709, RESELLER, 6a698e2ec38604c6 -openx.com,557939709,DIRECT,6a698e2ec38604c6 -triplelift.com, 12396, RESELLER, 6c33edb13117fd86 -risecodes.com,63832beef8189a00015cb6d3,RESELLER -inmobi.com,4fcebe6f9a714a95b066cfdbd5d354d4,DIRECT,83e75a7ae333ca9d -mediago.io,045ac24b888bcf59a09731e7f0f2084f,RESELLER -adyoulike.com,7463c359225e043c111036d7a29affa5,RESELLER -minutemedia.com,01gya4708ddm,RESELLER -smartadserver.com,4191,DIRECT,060d053dcf45cbf3 -visiblemeasures.com,1052,RESELLER -admedia.com,AM1601,RESELLER -undertone.com,4205,RESELLER,d954590d0cb265b9 -imds.tv,AM1601,RESELLER,ae6c32151e71f19d -nativo.com,5711,RESELLER,59521ca7cc5e9fee -kargo.com,8824,RESELLER -start.io,123111883,RESELLER -connectad.io,152,DIRECT,85ac85a30c93b3e5 -imds.tv,82606,RESELLER,ae6c32151e71f19d -onlinemediasolutions.com,21020,RESELLER,b3868b187e4b6402 -supply.colossusssp.com,836,RESELLER,6c5b49d96ec1b458 -opera.com,pub12058951686464,RESELLER,55a0c5fd61378de3 -uis.mobfox.com,93308,RESELLER,5529a3d1f59865be -opera.com,pub12058951686464,RESELLER,55a0c5fd61378de3 -yahoo.com, 55029, RESELLER, e1a5b5b6e3255540 -districtm.io, 100962, RESELLER, 3fd707be9c4527c3 - -# ConnectAd Core - -connectad.io, 152, RESELLER, 85ac85a30c93b3e5 -adform.com, 768, RESELLER, 9f5210a2f0999e32 -rubiconproject.com, 26800, RESELLER, 0bfd66d529a55807 - -# ConnectAd Extended -pubmatic.com, 156077, RESELLER, 5d62403b186f2ace -openx.com, 537145117, RESELLER, 6a698e2ec38604c6 -lijit.com, 244287, RESELLER, fafdf38b16bf6b2b -openx.com, 538959099, RESELLER, 6a698e2ec38604c6 -pubmatic.com, 137711, RESELLER, 5d62403b186f2ace -pubmatic.com, 156212, RESELLER, 5d62403b186f2ace -appnexus.com, 1019, RESELLER, f5ab79cb980f11d1 -video.unrulymedia.com, 736135793, RESELLER - - -# Improve Digital - -appnexus.com, 13231, RESELLER -improvedigital.com, 2030, DIRECT -inskinmedia.com, 126450, DIRECT, 7c0396763f74a3d5 -indexexchange.com, 184665, RESELLER, 50b1c356f2c5c8fc - - - -# AdaptMX - -appnexus.com, 12290, RESELLER, f5ab79cb980f11d1 -rubiconproject.com, 17960, RESELLER, 0bfd66d529a55807 -adform.com, 2865, RESELLER -appnexus.com, 9393, RESELLER, f5ab79cb980f11d1 -indexexchange.com, 191503, RESELLER, 50b1c356f2c5c8fc -openx.com, 559680764, RESELLER, 6a698e2ec38604c6 -rubiconproject.com, 23844, RESELLER, 0bfd66d529a55807 -smartadserver.com, 3056, RESELLER, 060d053dcf45cbf3 -yahoo.com, 49648, RESELLER -pubmatic.com, 161527, RESELLER, 5d62403b186f2ace -pubmatic.com, 158355, RESELLER, 5d62403b186f2ace -lijit.com, 260380, RESELLER, fafdf38b16bf6b2b -appnexus.com, 11924, RESELLER, f5ab79cb980f11d1 -amxrtb.com, 105199401, DIRECT -appnexus.com, 11786, RESELLER - - -# Kargo - -kargo.com, 8538, DIRECT -indexexchange.com, 184081, RESELLER - -# 33across - -33across.com, 0010b00002QKn54AAD, DIRECT, bbea06d9c4d2853c #33Across #hb #tag - -# 33Across - Rubicon -rubiconproject.com, 16414, RESELLER, 0bfd66d529a55807 #33Across #hb #tag -rubiconproject.com, 21642, RESELLER, 0bfd66d529a55807 #33Across #hb #tag #viewable -rubiconproject.com, 21434, RESELLER, 0bfd66d529a55807 #33Across #tag #ebda -rubiconproject.com, 21720, RESELLER, 0bfd66d529a55807 #33Across EU #hb #tag - -# 33Across - PubMatic -pubmatic.com, 156423, RESELLER, 5d62403b186f2ace #33Across #hb #tag #video -pubmatic.com, 158136, RESELLER, 5d62403b186f2ace #33Across EU #hb #tag -pubmatic.com, 158569, RESELLER, 5d62403b186f2ace #33Across #tag #ebda - -# 33Across - AppNexus -appnexus.com, 10239, RESELLER, f5ab79cb980f11d1 #33Across #hb #tag #viewable -appnexus.com, 1001, RESELLER, f5ab79cb980f11d1 #33Across #tag -appnexus.com, 3135, RESELLER, f5ab79cb980f11d1 #33Across #tag - -# 33Across - OpenX -openx.com, 537120563, RESELLER, 6a698e2ec38604c6 #33Across #hb #tag #video -openx.com, 539392223, RESELLER, 6a698e2ec38604c6 #33Across #tag #ebda - -# 33Across - Verizon Media -yahoo.com, 57289, RESELLER, e1a5b5b6e3255540 #33Across #hb #tag - -# 33Across - Index Exchange -indexexchange.com, 190966, RESELLER, 50b1c356f2c5c8fc #33Across #tag #ebda -indexexchange.com, 191973, RESELLER, 50b1c356f2c5c8fc #33Across #hb #tag #viewable #video - -# 33Across - Conversant Media -conversantmedia.com, 100141, RESELLER, 03113cd04947736d #hb #tag #video -appnexus.com, 4052, RESELLER #33Across #hb -contextweb.com, 561998, RESELLER, 89ff185a4c4e857c #33Across #hb -openx.com, 540031703, RESELLER, 6a698e2ec38604c6 #33Across #hb -pubmatic.com, 158100, RESELLER, 5d62403b186f2ace #33Across #hb -yahoo.com, 55771, RESELLER, e1a5b5b6e3255540 #33Across #hb -lijit.com, 411121, RESELLER, fafdf38b16bf6b2b #SOVRN #hb -admanmedia.com, 2050, RESELLER #hb -Appnerve.com, 187287, RESELLER #hb -rubiconproject.com, 23644, RESELLER, 0bfd66d529a55807 #hb -smartyads.com,300045, RESELLER, fd2bde0ff2e62c5d #hb -e-planning.net,1bf7b5d803f178c4,RESELLER,c1ba615865ed87b2 -video.unrulymedia.com, 645663965, RESELLER - -# 33Across - Google -google.com, pub-9557089510405422, RESELLER, f08c47fec0942fa0 #33Across #tag - -# 33Across - Sonobi -sonobi.com, a416546bb7, RESELLER, d1a215d9eb5aee9e #33Across #tag #ebda - -# 33Across - Amazon -aps.amazon.com, 2840f06c-5d89-4853-a03e-3bfa567dd33c, DIRECT #33Across #tag -pubmatic.com, 157150, RESELLER, 5d62403b186f2ace #33Across #tag -openx.com, 540191398, RESELLER, 6a698e2ec38604c6 #33Across #tag -rubiconproject.com, 18020, RESELLER, 0bfd66d529a55807 #33Across #tag -appnexus.com, 1908, RESELLER, f5ab79cb980f11d1 #33Across #tag -adtech.com, 12068, RESELLER, e1a5b5b6e3255540 #33Across #tag -appnexus.com, 3663, RESELLER, f5ab79cb980f11d1 #33Across #tag -yahoo.com, 55029, RESELLER, e1a5b5b6e3255540 #33Across #tag - -# 33Across - Pulsepoint -contextweb.com, 561516, RESELLER, 89ff185a4c4e857c #33Across #hb #tag - -# 33Across - TripleLift -triplelift.com, 12503, RESELLER, 6c33edb13117fd86 - -# 33Across - Acuity Ads -admanmedia.com, 1055, DIRECT -visiblemeasures.com, 1055, DIRECT -yahoo.com, 59674, RESELLER, e1a5b5b6e3255540 -openx.com, 540866936, RESELLER, 6a698e2ec38604c6 -rubiconproject.com, 14558, RESELLER, 0bfd66d529a55807 - -# 33Across - LoopMe -loopme.com,11575,RESELLER,6c8d5f95897a5a3b -xandr.com, 13799, RESELLER -sovrn.com, 400766, RESELLER, fafdf38b16bf6b2b -lijit.com, 400766, RESELLER, fafdf38b16bf6b2b -freewheel.tv, 1137745, RESELLER -freewheel.tv, 1138513, RESELLER -sharethrough.com, 6qlnf8SY, RESELLER, d53b998a7bd4ecd2 -triplelift.com, 12158, RESELLER, 6c33edb13117fd86 -rubiconproject.com, 20744, RESELLER, 0bfd66d529a55807 -pubmatic.com, 158154, RESELLER, 5d62403b186f2ace -sonobi.com, b43e9530e7, RESELLER, d1a215d9eb5aee9e - -# 33Across - Unruly -video.unrulymedia.com, 2439829435, DIRECT - -# 33Across - OpenWeb -adyoulike.com, 1f301d3bcd723f5c372070bdfd142940, RESELLER -loopme.com, 11480, RESELLER, 6c8d5f95897a5a3b -pubmatic.com, 160925, RESELLER, 5d62403b186f2ace -rubiconproject.com, 20736, RESELLER, 0bfd66d529a55807 -spotim.market, sp_AYL2022, RESELLER, 077e5f709d15bdbb -betweendigital.com, 44774, RESELLER -lijit.com, 408376, RESELLER, fafdf38b16bf6b2b #SOVRN -lijit.com, 408376-eb, RESELLER, fafdf38b16bf6b2b #SOVRN -smartadserver.com, 4144, RESELLER -onetag.com, 7a07370227fc000, RESELLER -admixer.net, 5e789729-1e92-41ca-8b4f-987c6edae9fe, RESELLER -nativo.com, 5848, RESELLER, 59521ca7cc5e9fee -33across.com, 0015a00003HljHyAAJ, RESELLER -video.unrulymedia.com, 297618916, RESELLER -risecodes.com, 64c7a4acd6298f0001a7d867, RESELLER - -# 33Across - IQZone -iqzone.com,IQ299,DIRECT -zetaglobal.net,998,DIRECT -lijit.com,456186,DIRECT,fafdf38b16bf6b2b -video.unrulymedia.com,5336134699710583737,RESELLER -freewheel.tv,1599302,RESELLER -freewheel.tv,1599303,RESELLER - -# 33Across - Krush Media -krushmedia.com, AJxF6R615a9M6CaTvK, RESELLER -google.com, pub-7734005103835923, DIRECT, f08c47fec0942fa0 -loopme.com,12858,RESELLER,6c8d5f95897a5a3b -onetag.com, 848879e82ca5940, DIRECT -freewheel.tv, 1522514, RESELLER -freewheel.tv, 1522338, RESELLER -Media.net, 8CUT87EOU, DIRECT - -# 33Across - BetweenX -betweendigital.com, 43962, DIRECT -lijit.com, 273644, RESELLER, fafdf38b16bf6b2b -contextweb.com, 562827, RESELLER, 89ff185a4c4e857c -pubmatic.com, 159668, RESELLER, 5d62403b186f2ace -onetag.com, 5d1628750185ace, RESELLER -smartadserver.com, 4467, RESELLER -richaudience.com, 4AoWPWXbVu, RESELLER - -# Inmobi - -inmobi.com, 4fcebe6f9a714a95b066cfdbd5d354d4, RESELLER, 83e75a7ae333ca9d -rubiconproject.com, 11726, RESELLER, 0bfd66d529a55807 -rubiconproject.com, 12266, RESELLER, 0bfd66d529a55807 -conversantmedia.com, 40881, RESELLER, 03113cd04947736d -loopme.com, 9724, RESELLER, 6c8d5f95897a5a3b -lijit.com, 502742, RESELLER, fafdf38b16bf6b2b -pubmatic.com, 156931, RESELLER, 5d62403b186f2ace -pubmatic.com, 157097, RESELLER, 5d62403b186f2ace -Blis.com, 33, RESELLER, 61453ae19a4b73f4 -verve.com, 5897, RESELLER, 0c8f5958fc2d6270 -blis.com, 33, RESELLER, 61453ae19a4b73f4 -mintegral.com, 10003, RESELLER -pubnative.net, 1006951, RESELLER, d641df8625486a7b -algorix.co, 54190, RESELLER, 5b394c12fea27a1d -pubmatic.com, 159035, RESELLER, 5d62403b186f2ace -yeahmobi.com, 5135082, RESELLER -outbrain.com, 00bba279fec6daa01a0cb6fdccb023f0d5, RESELLER -zmaticoo.com, 5135082, RESELLER -zmaticoo.com, 113149, RESELLER -rubiconproject.com, 20744, RESELLER, 0bfd66d529a55807 -openx.com, 540298543, RESELLER, 6a698e2ec38604c6 -contextweb.com, 562499, RESELLER, 89ff185a4c4e857c -thebrave.io, 1234568, RESELLER, c25b2154543746ac -iqzone.com, IQ87, RESELLER -opera.com, pub6871903319744, RESELLER, 55a0c5fd61378de3 -rhebus.works, 7597018658, RESELLER -mars.media, 1010450, RESELLER, 8624339f102fb076 -app-stock.com, 315417, RESELLER -criteo.com, B-057955, RESELLER, 9fac4a4a87c2a44f -loopme.com, 11414, RESELLER, 6c8d5f95897a5a3b -pubmatic.com, 163758, RESELLER, 5d62403b186f2ace -rubiconproject.com, 16928, RESELLER, 0bfd66d529a55807 -appnexus.com, 8178, RESELLER, f5ab79cb980f11d1 -advertising.com, 28246, RESELLER -onetag.com, 59aa7be4921bac8, RESELLER -gamaigroup.com, 320201, RESELLER -rubiconproject.com, 20050, RESELLER, 0bfd66d529a55807 -freewheel.tv, 1599106, RESELLER -freewheel.tv, 1599109, RESELLER -lunamedia.io, b82743ba2ddf4bcaab3d1d4f91b1330e, RESELLER, 524ecb396915caaf -growintech.co, 102275, RESELLER -prequel.tv, 518, RESELLER -voisetech.com, 1023, RESELLER -eskimi.com, 2020000030, RESELLER -9dotsmedia.com, 122262, RESELLER, 45ff185b4c4e857d -ssp.e-volution.ai, AJxF6R378a9M6CaTvK, RESELLER -programmaticx.ai, 6999766, RESELLER -jio.com, 1547219295, RESELLER -lemmatechnologies.com, 89, RESELLER, 7829010c5bebd1fb -peak226.com, 12904, RESELLER -markappmedia.site, 587286, RESELLER -smartadserver.com, 3232, RESELLER, 060d053dcf45cbf3 -onlinemediasolutions.com, 29556, RESELLER -castify.ai, 1279123, RESELLER -orangeclickmedia.com, C-1034, RESELLER -bematterfull.com, 111399861, RESELLER -fromthetop.io, 65529, RESELLER -dauup.com, 34103, RESELLER -sabio.us, 100071, RESELLER, 96ed93aaa9795702 -admanmedia.com, 2063, RESELLER -se7en.es, 212430, RESELLER, 064bc410192443d8 -algorix.co, 60367, RESELLER, 5b394c12fea27a1d -iion.io, 10171, RESELLER, 013a29748465dc57 -tredio.io, 357a6fdf7642bf815a88822c447d9dc432901, RESELLER -waardex.com, 99236, RESELLER -adtonos.com, PUB2356156682, RESELLER -theaudiencestreet.com, TAS-703, RESELLER -adingenious.com, 75036, RESELLER -carbonatix.com, 141073554, RESELLER -keenkale.com, 841, RESELLER -rubiconproject.com, 26064, RESELLER, 0bfd66d529a55807 -bold-win.com, 148, RESELLER, 71746737d0bab951 -lijit.com, 481366, RESELLER, fafdf38b16bf6b2b -videoheroes.tv, 212430, RESELLER, 064bc410192443d8 -video.unrulymedia.com, 188404962, RESELLER -mman.kr, 32102, RESELLER -rubiconproject.com, 26168, RESELLER, 0bfd66d529a55807 -rubiconproject.com, 26192, RESELLER, 0bfd66d529a55807 -pubmatic.com, 165116, RESELLER, 5d62403b186f2ace -rubiconproject.com, 25906, RESELLER, 0bfd66d529a55807 -smartyads.com, 478, RESELLER, fd2bde0ff2e62c5d -playwire.com, 1025119, RESELLER -contextweb.com, 558638, RESELLER, 89ff185a4c4e857c -video.unrulymedia.com, 764922532, RESELLER -acexchange.co.kr, 1562884725, RESELLER -rubiconproject.com, 24400, RESELLER, 0bfd66d529a55807 -video.unrulymedia.com, 322585001, RESELLER -e-planning.net, 608359bb987625b2, RESELLER, c1ba615865ed87b2 -pubmatic.com, 157559, RESELLER, 5d62403b186f2ace -sonobi.com, 45dd948092, RESELLER, d1a215d9eb5aee9e -thunder-monetize.com, 3905806597, RESELLER -eliteappgrade.com, 514554, RESELLER -Beapup.com, 522589, RESELLER -themediasense.com, 1147, RESELLER -mobismarter.com, 3294, RESELLER - - -#Inmobi M-Web - -inmobi.com,4fcebe6f9a714a95b066cfdbd5d354d4,RESELLER,83e75a7ae333ca9d -rubiconproject.com, 11726, RESELLER, 0bfd66d529a55807 -pubmatic.com, 157097, RESELLER, 5d62403b186f2ace -pubmatic.com, 159035,RESELLER,5d62403b186f2ace -loopme.com, 9724, RESELLER, 6c8d5f95897a5a3b -smartyads.com,100034, RESELLER, fd2bde0ff2e62c5d -engagebdr.com, 10181, RESELLER -eskimi.com, eas-2020000005, RESELLER -pubmatic.com, 158154, RESELLER, 5d62403b186f2ace -admanmedia.com, 594, RESELLER -admixer.net, eab09ea6-bcf7-4eff-965d-b4f43962c73c, RESELLER -conversantmedia.com,40881,RESELLER,03113cd04947736d -appnexus.com,4052,RESELLER -contextweb.com,561998,RESELLER,89ff185a4c4e857c -pubmatic.com,158100,RESELLER,5d62403b186f2ace -yahoo.com,55771,RESELLER,e1a5b5b6e3255540 -ogury.com,e91052177a44df900ef9977b4b8314fe,RESELLER -pubmatic.com, 157097, RESELLER, 5d62403b186f2ace -rhythmone.com,188404962,RESELLER,a670c89d4a324e47 -video.unrulymedia.com,2169000724,RESELLER -axonix.com,57716,RESELLER -telaria.com,r3222-wec7r,RESELLER,1a4e959a1b50034a -lemmatechnologies.com,89,RESELLER,7829010c5bebd1fb -smartadserver.com,3564,RESELLER -admanmedia.com,660,RESELLER -pubmatic.com,156494,RESELLER,5d62403b186f2ace -rubiconproject.com,20208,RESELLER,0bfd66d529a55807 -pubmatic.com,156931,RESELLER,5d62403b186f2ace -lkqd.net,626,RESELLER,59c49fa9598a0117 -pubnative.net,1006951,RESELLER,d641df8625486a7b -pubmatic.com,155975,RESELLER,5d62403b186f2ace -appnexus.com,8178,RESELLER,f5ab79cb980f11d1 -rubiconproject.com,17328,RESELLER,0bfd66d529a55807 -openx.com,537152826,RESELLER,6a698e2ec38604c6 -verve.com,5897,RESELLER,0c8f5958fc2d6270 -sonobi.com,eaec54c63f,RESELLER,d1a215d9eb5aee9e -onetag.com,59aa7be4921bac8,RESELLER -advertising.com,28246,RESELLER -rhythmone.com,4173858586,RESELLER,a670c89d4a324e47 -verve.com,15290,RESELLER,0c8f5958fc2d6270 -verve.com,5897,RESELLER,0c8f5958fc2d6270 -rubiconproject.com,15278,RESELLER,0bfd66d529a55807 -pubmatic.com,156517,RESELLER,5d62403b186f2ace - -# Nobid - -nobid.io, 22013853948, DIRECT -zetaglobal.net, 693, DIRECT -sharethrough.com, aRE1degH, RESELLER, d53b998a7bd4ecd2 -rubiconproject.com, 18694, RESELLER, 0bfd66d529a55807 -pubmatic.com, 156557, RESELLER -rubiconproject.com, 24434, RESELLER, 0bfd66d529a55807 -amxrtb.com, 105199579, RESELLER -appnexus.com, 12290, RESELLER -lijit.com, 260380, RESELLER -33across.com, 0010b00002Mq2FYAAZ, DIRECT, bbea06d9c4d2853c #33Across #hb #tag -appnexus.com, 10239, RESELLER, f5ab79cb980f11d1 #33Across #hb #tag #viewable -conversantmedia.com, 100141, RESELLER, 03113cd04947736d #hb #tag #video -lijit.com, 273657, RESELLER, fafdf38b16bf6b2b -video.unrulymedia.com, 347774562, RESELLER -rubiconproject.com, 15268, RESELLER, 0bfd66d529a55807 -pubmatic.com, 159277, RESELLER -inmobi.com,8f261ace12c3486ba2e0d2011cd97976,RESELLER,83e75a7ae333ca9d -onetag.com, 694e68b73971b58, RESELLER -sonobi.com, 7ad1b9f952, RESELLER, d1a215d9eb5aee9e -dxkulture.com, 9533, DIRECT, 259726033fc4df0c -xandr.com, 11429, RESELLER, f5ab79cb980f11d1 -audigentmedia.com, nobid1, DIRECT, ef36b9389dcaff12 -gumgum.com, 13926, RESELLER, ffdef49475d318a9 -mediafuse.com, 389, DIRECT -Media.net, 8CUV34PJ4, RESELLER - - -# TappX - -tappx.com, 36656, DIRECT, 9f375a07da0318ec -pubmatic.com, 92509, RESELLER, 5d62403b186f2ace -groundtruth.com, 107, RESELLER, 81cbf0a75a5e0e9a -smartadserver.com, 1692, RESELLER -rubiconproject.com, 13856, RESELLER, 0bfd66d529a55807 -adcolony.com, c490f6e7399a25d6, RESELLER, 1ad675c9de6b5176 -loopme.com, 11227, RESELLER, 6c8d5f95897a5a3b -appnexus.com, 9569, RESELLER, f5ab79cb980f11d1 -pubmatic.com, 158111, RESELLER, 5d62403b186f2ace -appnexus.com, 10824, RESELLER, f5ab79cb980f11d1 -chartboost.com, 5da62a1035b91e0aff190bf7, RESELLER - -# Smart - -smartadserver.com, 4191, RESELLER, 060d053dcf45cbf3 -smartadserver.com, 4191-OB, RESELLER, 060d053dcf45cbf3 -pubmatic.com, 156439, RESELLER, 5d62403b186f2ace -pubmatic.com, 154037, RESELLER, 5d62403b186f2ace -rubiconproject.com, 16114, RESELLER, 0bfd66d529a55807 -openx.com, 537149888, RESELLER, 6a698e2ec38604c6 -appnexus.com, 3703, RESELLER, f5ab79cb980f11d1 -loopme.com, 5679, RESELLER, 6c8d5f95897a5a3b -video.unrulymedia.com, 2564526802, RESELLER -smaato.com, 1100044045, RESELLER, 07bcf65f187117b4 -adyoulike.com, b4bf4fdd9b0b915f746f6747ff432bde, RESELLER -axonix.com, 57264, RESELLER -sharethrough.com, OAW69Fon, RESELLER, d53b998a7bd4ecd2 - -# Adagio - -adagio.io, 1140, DIRECT - -# Adagio - Magnite -rubiconproject.com, 19116, RESELLER, 0bfd66d529a55807 - -# Adagio - Pubmatic -pubmatic.com, 159110, RESELLER, 5d62403b186f2ace - -# Adagio - Improve Digital -improvedigital.com, 1790, RESELLER - -# Adagio - Onetag -onetag.com, 6b859b96c564fbe, RESELLER -appnexus.com, 13099, RESELLER -pubmatic.com, 161593, RESELLER, 5d62403b186f2ace -rubiconproject.com, 11006, RESELLER, 0bfd66d529a55807 - -# Adagio - Index Exchange -indexexchange.com, 194558, RESELLER - -# Adagio - 33Across -33across.com, 0015a00002oUk4aAAC, RESELLER, bbea06d9c4d2853c -yahoo.com, 57289, RESELLER, e1a5b5b6e3255540 -appnexus.com, 10239, RESELLER, f5ab79cb980f11d1 -rubiconproject.com, 16414, RESELLER, 0bfd66d529a55807 -pubmatic.com, 156423, RESELLER, 5d62403b186f2ace -rubiconproject.com, 21642, RESELLER, 0bfd66d529a55807 -conversantmedia.com, 100141, RESELLER -indexexchange.com, 191973, RESELLER, 50b1c356f2c5c8fc -triplelift.com, 12503, RESELLER, 6c33edb13117fd86 - -# Adagio - Equativ -smartadserver.com, 3554, RESELLER -pubmatic.com, 156439, RESELLER, 5d62403b186f2ace -pubmatic.com, 154037, RESELLER, 5d62403b186f2ace -rubiconproject.com, 16114, RESELLER, 0bfd66d529a55807 -openx.com, 537149888, RESELLER, 6a698e2ec38604c6 -appnexus.com, 3703, RESELLER, f5ab79cb980f11d1 -loopme.com, 5679, RESELLER, 6c8d5f95897a5a3b -video.unrulymedia.com, 2564526802, RESELLER -pubnative.net, 1006576, RESELLER, d641df8625486a7b -admanmedia.com, 43, RESELLER -sharethrough.com, OAW69Fon, RESELLER, d53b998a7bd4ecd2 - -# Adagio - Sovrn -lijit.com, 367236, RESELLER, fafdf38b16bf6b2b -openx.com, 538959099, RESELLER, 6a698e2ec38604c6 -pubmatic.com, 137711, RESELLER, 5d62403b186f2ace -pubmatic.com, 156212, RESELLER, 5d62403b186f2ace -rubiconproject.com, 17960, RESELLER, 0bfd66d529a55807 - -# Adagio - Freewheel -freewheel.tv, 1568036, RESELLER -freewheel.tv, 1568041, RESELLER - -# Adagio - OpenX -openx.com, 558899373, RESELLER, 6a698e2ec38604c6 - -# Adagio - Triplelift -triplelift.com, 13482, RESELLER, 6c33edb13117fd86 - -# Adagio - E-Planning -e-planning.net, 83c06e81531537f4, RESELLER, c1ba615865ed87b2 -pubmatic.com, 156631, RESELLER, 5d62403b186f2ace -openx.com, 541031350, RESELLER, 6a698e2ec38604c6 -rubiconproject.com, 12186, RESELLER, 0bfd66d529a55807 -zetaglobal.net, 891, RESELLER -appnexus.com, 15941, RESELLER - -# Adagio - Nexxen -video.unrulymedia.com, 5672421953199218469, RESELLER - -# Sharethrough - -sharethrough.com, EU8CIOkx, RESELLER, d53b998a7bd4ecd2 -sharethrough.com, a4f68c92, DIRECT, d53b998a7bd4ecd2 -indexexchange.com, 186046, RESELLER -pubmatic.com, 156557, RESELLER -pubmatic.com, 158723, RESELLER, 5d62403b186f2ace -rubiconproject.com, 18694, RESELLER, 0bfd66d529a55807 -openx.com, 540274407, RESELLER, 6a698e2ec38604c6 -33across.com, 0013300001kQj2HAAS, RESELLER, bbea06d9c4d2853c -smaato.com, 1100047713, RESELLER, 07bcf65f187117b4 - - - - -# Onetag - -onetag.com, 77253abd802c05e, DIRECT -onetag.com, 77253abd802c05e-OB, DIRECT -appnexus.com, 13099, RESELLER -pubmatic.com, 161593, RESELLER, 5d62403b186f2ace -rubiconproject.com, 11006, RESELLER, 0bfd66d529a55807 -freewheel.tv, 20393, RESELLER -freewheel.tv, 24377, RESELLER - - - -# Gourmet Ads - -gourmetads.com, 14306, RESELLER -appnexus.com, 1792, RESELLER, f5ab79cb980f11d1 -themediagrid.com, UPO4A3, RESELLER, 35d5010d7789b49d -openx.com, 537142979, RESELLER, 6a698e2ec38604c6 -yahoo.com, 57830, RESELLER, e1a5b5b6e3255540 -amxrtb.com, 105199507, RESELLER -rubiconproject.com, 10617, RESELLER, 0bfd66d529a55807 -indexexchange.com, 184268, RESELLER, 50b1c356f2c5c8fc -pubmatic.com, 99931, RESELLER, 5d62403b186f2ace -deepintent.com, 1252, RESELLER -sovrn.com, 227193, RESELLER, fafdf38b16bf6b2b -adform.com, 1655, RESELLER, 9f5210a2f0999e32 -criteo.com, B-060140, RESELLER, 9fac4a4a87c2a44f -beachfront.com, 12562, RESELLER, e2541279e8e2ca4d -contextweb.com, 561070, RESELLER, 89ff185a4c4e857c -conversantmedia.com, 41603, RESELLER, 03113cd04947736d -sharethrough.com, 1c3179bc, RESELLER, d53b998a7bd4ecd2 -emxdgt.com, 58, RESELLER, 1e1d41537f7cad7f -rhythmone.com, 2441264164, RESELLER, a670c89d4a324e47 -yieldmo.com, 2322780807812293024, RESELLER -synacor.com, 82386, RESELLER, e108f11b2cdf7d5b -admanmedia.com, 854, RESELLER -smaato.com, 1100010704, RESELLER, 07bcf65f187117b4 -smaato.com, 1100004890, RESELLER, 07bcf65f187117b4 -axonix.com, 59053, RESELLER -smartadserver.com, 4188, RESELLER -smartadserver.com, 4071, RESELLER -themediagrid.com, Q5R9XH, RESELLER, 35d5010d7789b49d -33across.com, 0015a00002vQAiXAAW, RESELLER, bbea06d9c4d2853c -rubiconproject.com, 16414, RESELLER, 0bfd66d529a55807 -yahoo.com, 57289, RESELLER, e1a5b5b6e3255540 -appnexus.com, 10239, RESELLER, f5ab79cb980f11d1 -improvedigital.com, 2058, RESELLER - - -# Ogury - -ogury.com, 5a93b205-d86c-4e96-a62e-01f593889ed0, DIRECT -appnexus.com, 11470, RESELLER -#pubmatic -pubmatic.com, 163238, RESELLER, 5d62403b186f2ace -#equativ -smartadserver.com, 4537, RESELLER, 060d053dcf45cbf3 -#magnite -rubiconproject.com, 25198, RESELLER, 0bfd66d529a55807 -thebrave.io, 1234746, RESELLER, c25b2154543746ac -toponad.com, 16719c20554a4f, RESELLER, 1d49fe424a1a456d -video.unrulymedia.com, 533898005, RESELLER #Nexxen -dauup.com, 34141, RESELLER #Edge226 -sharethrough.com, OAW69Fon, RESELLER, d53b998a7bd4ecd2 - - -# OMS - -onlinemediasolutions.com, 20605, DIRECT, b3868b187e4b6402 -amxrtb.com, 105199514, RESELLER -pubmatic.com, 161332, RESELLER, 5d62403b186f2ace -rubiconproject.com, 20416, RESELLER, 0bfd66d529a55807 -onomagic.com, 206051, DIRECT -onetag.com, 75753f1ebcc343c, RESELLER -lijit.com, 374814, RESELLER, fafdf38b16bf6b2b -openx.com, 537153209, RESELLER, 6a698e2ec38604c6 -Media.net, 8CUB46Z7R, RESELLER -onetag.com, 7b561459c997848, RESELLER -audienciad.com, 206052, DIRECT -video.unrulymedia.com, 6694405583287859332, RESELLER -aps.amazon.com, 48266a61-b3d9-4cb7-b172-553abc6a42a4, DIRECT -yieldmo.com, 2757543169808605705, RESELLER -rubiconproject.com, 24364, RESELLER, 0bfd66d529a55807 -getmediamx.com, 1220605, DIRECT -appnexus.com, 11801, RESELLER -appnexus.com, 15629, RESELLER, f5ab79cb980f11d1 -indexexchange.com, 197494, RESELLER, 50b1c356f2c5c8fc -appnexus.com, 15127, RESELLER -loopme.com, 12733, RESELLER, 6c8d5f95897a5a3b -themediagrid.com, IRK975, RESELLER, 35d5010d7789b49d -sonobi.com, 3aed893727, RESELLER, d1a215d9eb5aee9e -sharethrough.com, LxFeZvU4, RESELLER, d53b998a7bd4ecd2 -advibe.media, 820605, DIRECT -adyoulike.com, e9a771d72c076dbe3cafc2c6477f9238, RESELLER -33Across.com, 001Pg00000eHKL7IAO, RESELLER, bbea06d9c4d2853c - - - -# Sonobi - -sonobi.com, 54feb57a02, DIRECT, d1a215d9eb5aee9e -contextweb.com, 560606, RESELLER, 89ff185a4c4e857c - -# Primis - - -primis.tech, 30278, DIRECT, b6b21d256ef43532 -spotxchange.com, 84294, RESELLER, 7842df1d2fe2db34 -spotx.tv, 84294, RESELLER, 7842df1d2fe2db34 -yahoo.com, 59260, RESELLER, e1a5b5b6e3255540 -pubmatic.com, 156595, RESELLER, 5d62403b186f2ace -google.com, pub-1320774679920841, RESELLER, f08c47fec0942fa0 -openx.com, 540258065, RESELLER, 6a698e2ec38604c6 -rubiconproject.com, 20130, RESELLER, 0bfd66d529a55807 -freewheel.tv, 19133, RESELLER, 74e8e47458f74754 -smartadserver.com, 3436, RESELLER, 060d053dcf45cbf3 -indexexchange.com, 191923, RESELLER, 50b1c356f2c5c8fc -contextweb.com, 562350, RESELLER, 89ff185a4c4e857c -tremorhub.com, mb9eo-oqsbf, RESELLER, 1a4e959a1b50034a -telaria.com, mb9eo-oqsbf, RESELLER, 1a4e959a1b50034a -adform.com, 2078, RESELLER -supply.colossusssp.com, 290, RESELLER, 6c5b49d96ec1b458 -emxdgt.com, 1349, RESELLER, 1e1d41537f7cad7f -Media.net, 8CU695QH7, RESELLER -video.unrulymedia.com, 2338962694, RESELLER -sharethrough.com, flUyJowI, RESELLER, d53b998a7bd4ecd2 -triplelift.com, 8210, RESELLER, 6c33edb13117fd86 -appnexus.com, 16007, RESELLER, f5ab79cb980f11d1 -pmc.com, 1240739, DIRECT, 8dd52f825890bb44 -rubiconproject.com, 10278, RESELLER, 0bfd66d529a55807 -sharethrough.com, jbYv3ec8, RESELLER, d53b998a7bd4ecd2 -ottadvisors.com, 122034096467, RESELLER - -# Medianet - -Media.net, 8CU995W35, DIRECT -openx.com, 537100188, RESELLER, 6a698e2ec38604c6 -pubmatic.com, 159463, RESELLER, 5d62403b186f2ace -EMXDGT.com, 1759, Reseller, 1e1d41537f7cad7f -Appnexus.com, 1356, RESELLER, f5ab79cb980f11d1 -google.com, pub-7439041255533808, RESELLER, f08c47fec0942fa0 -rubiconproject.com, 19396, Reseller, 0bfd66d529a55807 -onetag.com, 5d49f482552c9b6, Reseller -sonobi.com, 83729e979b, RESELLER -rhythmone.com, 3611299104, RESELLER -lemmatechnologies.com, 399, RESELLER, 7829010c5bebd1fb #LEMMA -sharethrough.com, koRtppYA, RESELLER, d53b998a7bd4ecd2 - -# Yandex - -yandex.com, 97916741, RESELLER -improvedigital.com, 2031, RESELLER -betweendigital.com, 43554, RESELLER -uis.mobfox.com, 165, RESELLER -Contextweb.com, 562899,RESELLER,89ff185a4c4e857c -hyperad.tech, 150, RESELLER -hyperad.tech, 215, RESELLER -google.com, pub-5533854580432370, RESELLER, f08c47fec0942fa0 - -# Epsilon/Conversant Media - -conversantmedia.com, 41333, RESELLER, 03113cd04947736d -rubiconproject.com, 23644, RESELLER, 0bfd66d529a55807 -lijit.com, 411121, RESELLER, fafdf38b16bf6b2b #SOVRN -admanmedia.com, 2050, RESELLER - -# Blockthrough - -blockthrough.com, 5708166709903360, DIRECT -pubmatic.com, 160377, RESELLER, 5d62403b186f2ace -indexexchange.com, 194341, RESELLER, 50b1c356f2c5c8fc -rubiconproject.com, 23718, RESELLER, 0bfd66d529a55807 -appnexus.com, 6979, RESELLER -lijit.com, 251666, RESELLER, fafdf38b16bf6b2b -lijit.com, 251666-eb, RESELLER, fafdf38b16bf6b2b -openx.com, 538959099, RESELLER, 6a698e2ec38604c6 -pubmatic.com, 137711, RESELLER, 5d62403b186f2ace -pubmatic.com, 156212, RESELLER, 5d62403b186f2ace -rubiconproject.com, 17960, RESELLER, 0bfd66d529a55807 -appnexus.com, 1019, RESELLER, f5ab79cb980f11d1 -criteo.com, 8990, RESELLER -sharethrough.com, 9zUewtvl, RESELLER, d53b998a7bd4ecd2 -pubmatic.com, 156557, RESELLER -rubiconproject.com, 18694, RESELLER, 0bfd66d529a55807 -openx.com, 540274407, RESELLER, 6a698e2ec38604c6 -33across.com, 0013300001kQj2HAAS, RESELLER, bbea06d9c4d2853c -smaato.com, 1100047713, RESELLER, 07bcf65f187117b4 -yahoo.com, 59531, RESELLER, e1a5b5b6e3255540 -smartadserver.com, 4342, RESELLER -smartadserver.com, 4012, RESELLER -Contextweb.com, 562926, RESELLER, 89ff185a4c4e857c - -# Vidazoo - -vidazoo.com, 66bd9d72ba3d00c6d7fcf12d, DIRECT, b6ada874b4d7d0b2 -rubiconproject.com, 17130, RESELLER, 0bfd66d529a55807 -lijit.com, 222372, RESELLER, fafdf38b16bf6b2b -themediagrid.com, 3AW9JB, RESELLER, 35d5010d7789b49d -pubmatic.com, 159988, RESELLER, 5d62403b186f2ace -appnexus.com, 2794, RESELLER, f5ab79cb980f11d1 -openx.com, 541017750, RESELLER, 6a698e2ec38604c6 -video.unrulymedia.com, 2743945877, RESELLER -media.net, 8CUN4Y5Y3, RESELLER -sharethrough.com, S2rESyUH, RESELLER, d53b998a7bd4ecd2 -supply.colossusssp.com, 181, RESELLER, 6c5b49d96ec1b458 - -# Opti Engage - -optidigital.com,p321,RESELLER -pubmatic.com,158939,RESELLER,5d62403b186f2ace -rubiconproject.com,20336,RESELLER,0bfd66d529a55807 -smartadserver.com,3379,RESELLER,060d053dcf45cbf3 -criteo.com,B-060926,RESELLER,9fac4a4a87c2a44f -themediagrid.com,3ETIX5,RESELLER,35d5010d7789b49d -improvedigital.com,1469,RESELLER -onetag.com,806eabb849d0326,RESELLER -triplelift.com,8183,RESELLER,6c33edb13117fd86 -appnexus.com,12190,RESELLER,f5ab79cb980f11d1 -rtbhouse.com,mSu1piUSmB9TF4AQDGk4,RESELLER -sharethrough.com,OAW69Fon,RESELLER,d53b998a7bd4ecd2 -33across.com,001Pg00000HMy0YIAT,RESELLER,bbea06d9c4d2853c - -# Smile Wanted - -smilewanted.com, 5288, RESELLER -rubiconproject.com, 19814, RESELLER, 0bfd66d529a55807 -appnexus.com, 10040, RESELLER -smartadserver.com, 2491, RESELLER -pubmatic.com, 158810, RESELLER, 5d62403b186f2ace -openx.com, 557083110, RESELLER, 6a698e2ec38604c6 -adform.com, 3027, RESELLER -video.unrulymedia.com, 1767448067723954599, RESELLER -sharethrough.com, TZ1ahFV8, RESELLER, d53b998a7bd4ecd2 -onetag.com, 7f5d22b0006ab5a, RESELLER - - -# iion - -iion.io, 10184, RESELLER, 013a29748465dc57 -adsparc.com, 2056, RESELLER -sonobi.com, 22d19b6952, RESELLER, d1a215d9eb5aee9e -sonobi.com, 35f7241993, RESELLER, d1a215d9eb5aee9e -criteo.com, B-063681, RESELLER, 9fac4a4a87c2a44f -themediagrid.com, 25XPU9, RESELLER, 35d5010d7789b49d -sovrn.com, 270673, RESELLER, fafdf38b16bf6b2b -lijit.com, 270673, RESELLER, fafdf38b16bf6b2b -adyoulike.com, 39f06b755a61e5422e18e2bdbb1add4a, RESELLER -appnexus.com, 14538, RESELLER, f5ab79cb980f11d1 -adform.com, 2985, RESELLER, 9f5210a2f0999e32 -video.unrulymedia.com, 346830101, RESELLER, 29bc7d05d309e1bc -rhythmone.com, 346830101, RESELLER, a670c89d4a324e47 -loopme.com, 11594, RESELLER, 6c8d5f95897a5a3b -improvedigital.com, 2226, RESELLER -rubiconproject.com, 25322, RESELLER, 0bfd66d529a55807 -pubmatic.com, 163091, RESELLER, 5d62403b186f2ace -smartadserver.com, 4618, RESELLER, 060d053dcf45cbf3 -e-planning.net,363e54c31fcf223d,RESELLER,c1ba615865ed87b2 -admixer.net, b72d403d-e25e-4bc7-ad9c-6e929a66f502, RESELLER -admanmedia.com, 2160, RESELLER -uis.mobfox.com, 726, RESELLER, 5529a3d1f59865be -onetag.com, 89dd525077ba15e, RESELLER -taipeidigital.com, 1122, RESELLER -pubmatic.com, 164778, RESELLER, 5d62403b186f2ace -gamaigroup.com,423059,RESELLER -media.net, 8CU8564R6, RESELLER -sharethrough.com, 249198ac, RESELLER, d53b998a7bd4ecd2 -smilewanted.com, 5098, RESELLER -richaudience.com, 6InWSNO0Xo, RESELLER -152media.info,152M956,RESELLER -insticator.com,f01725e4-53f4-40e0-95bb-c4206ee0b577,RESELLER,b3511ffcafb23a32 -adyoulike.com, c614fe3fe0114cbf1f9d7d878e6e7ee7, RESELLER -pubmatic.com, 163945, RESELLER, 5d62403b186f2ace -thebrave.io, 1234647, RESELLER, c25b2154543746ac -minutemedia.com, 01j6arbm5tne, RESELLER -smaato.com, 1100057454, RESELLER, 07bcf65f187117b4 - - -# Kueez - -kueez.com, afdc2db641e0e1aaa6d4da5e9b438abf, DIRECT -appnexus.com, 8826,RESELLER, f5ab79cb980f11d1 -sharethrough.com, n98xDzeL, RESELLER, d53b998a7bd4ecd2 -Media.net,8CU4JTRF9, RESELLER -lijit.com, 407406, RESELLER, fafdf38b16bf6b2b #SOVRN -yieldmo.com, 3133660606033240149, RESELLER -Pubmatic.com, 162110, RESELLER, 5d62403b186f2ace -themediagrid.com, UOT45Z, RESELLER, 35d5010d7789b49d -openx.com, 557564833, RESELLER, 6a698e2ec38604c6 -rubiconproject.com, 16920, RESELLER, 0bfd66d529a55807 -sonobi.com, 4c4fba1717, RESELLER, d1a215d9eb5aee9e -smartadserver.com,4288,reseller,060d053dcf45cbf3 -onetag.com,6e053d779444c00, RESELLER -adform.com,2926,reseller -Disqus.com, 108, RESELLER -improvedigital.com,2106,reseller -33across.com, 0010b00002ODU4HAAX, RESELLER, bbea06d9c4d2853c -video.unrulymedia.com, 3486482593, RESELLER - -# Seedtag - -seedtag.com,67a4eeefe958720006afb8aa, DIRECT -xandr.com, 4009, RESELLER, f5ab79cb980f11d1 -beachfront.com, 15250, RESELLER, e2541279e8e2ca4d -smartadserver.com, 3050, RESELLER -rubiconproject.com, 17280, RESELLER, 0bfd66d529a55807 -pubmatic.com, 157743, RESELLER, 5d62403b186f2ace -openx.com, 558758631, RESELLER, 6a698e2ec38604c6 -lijit.com, 397546, RESELLER, fafdf38b16bf6b2b -onetag.com, 75601b04186d260, RESELLER -sharethrough.com, AXS5NfBr, RESELLER, d53b998a7bd4ecd2 -loopme.com, 11712, RESELLER, 6c8d5f95897a5a3b -video.unrulymedia.com, 724823153, RESELLER -adform.com, 1889, RESELLER -33across.com, 0010b00002MptHCAAZ, RESELLER, bbea06d9c4d2853c -adyoulike.com, 83d15ef72d387a1e60e5a1399a2b0c03, RESELLER -rubiconproject.com, 16114, RESELLER, 0bfd66d529a55807 -openx.com, 537149888, RESELLER, 6a698e2ec38604c6 -loopme.com, 5679, RESELLER, 6c8d5f95897a5a3b -pubmatic.com, 156212, RESELLER, 5d62403b186f2ace -rubiconproject.com, 17960, RESELLER, 0bfd66d529a55807 -improvedigital.com, 1680, RESELLER - - -# OptiDigital - -optidigital.com,p321,DIRECT -pubmatic.com,158939,RESELLER,5d62403b186f2ace -rubiconproject.com,20336,RESELLER,0bfd66d529a55807 -smartadserver.com,3379,RESELLER,060d053dcf45cbf3 -sharethrough.com,OAW69Fon,RESELLER,d53b998a7bd4ecd2 -criteo.com,B-060926,RESELLER,9fac4a4a87c2a44f -themediagrid.com,3ETIX5,RESELLER,35d5010d7789b49d -triplelift.com,8183,RESELLER,6c33edb13117fd86 -appnexus.com,12190,RESELLER,f5ab79cb980f11d1 -onetag.com,806eabb849d0326,RESELLER -rtbhouse.com,mSu1piUSmB9TF4AQDGk4,RESELLER -33across.com,001Pg00000HMy0YIAT,RESELLER,bbea06d9c4d2853c -e-planning.net,a76893b96338e7e9,RESELLER,c1ba615865ed87b2 -video.unrulymedia.com,731539260,RESELLER - - -# Datablocks - -datablocks.net, 2729574, DIRECT, a5dfa362888cedea -rubiconproject.com, 26288, RESELLER, 0bfd66d529a55807 -appnexus.com, 11794, RESELLER, f5ab79cb980f11d1 -openx.com, 541013810, RESELLER, 6a698e2ec38604c6 -pubmatic.com, 162168, RESELLER, 5d62403b186f2ace -sharethrough.com, a47bc2a5, RESELLER, d53b998a7bd4ecd2 -152media.info, 152M72, RESELLER -media.net, 8CUM6VBVM, RESELLER -onetag.com, 74c8f583aa2ba05, RESELLER -amxrtb.com, 105199438, RESELLER -gumgum.com,14204,RESELLER,ffdef49475d318a9 -sovrn.com, 273900, RESELLER, fafdf38b16bf6b2b -sonobi.com, 911eaf6707, RESELLER, d1a215d9eb5aee9e -zetaglobal.net, 505, RESELLER - - -# Insticator/Cool Media - -insticator.com,ea7873c5-662b-4e03-a3f3-cec1a01d8a95,DIRECT,b3511ffcafb23a32 -sharethrough.com,Q9IzHdvp,RESELLER,d53b998a7bd4ecd2 -rubiconproject.com,17062,RESELLER,0bfd66d529a55807 -risecodes.com,6124caed9c7adb0001c028d8,RESELLER -pubmatic.com,95054,RESELLER,5d62403b186f2ace -video.unrulymedia.com,136898039,RESELLER -openx.com,558230700,RESELLER,6a698e2ec38604c6 -lijit.com,257618,RESELLER,fafdf38b16bf6b2b -appnexus.com,3695,RESELLER,f5ab79cb980f11d1 -minutemedia.com,01garg96c88b,RESELLER - - -# Rich Audience - -richaudience.com, uUzZIc9lYN, DIRECT -appnexus.com, 8233, RESELLER -rubiconproject.com, 13510, RESELLER -pubmatic.com, 81564, RESELLER, 5d62403b186f2ace -pubmatic.com, 156538, RESELLER, 5d62403b186f2ace -adform.com, 1942, RESELLER -lijit.com, 249425, RESELLER -smartadserver.com, 2640, RESELLER -adyoulike.com, f1dfbb7f133fbdb25c96e7d85a5e628b, RESELLER -contextweb.com, 563371, RESELLER, 89ff185a4c4e857c -themediagrid.com, P19GFJ, RESELLER, 35d5010d7789b49d -onetag.com, 8d4b087143c49f0, RESELLER -amxrtb.com, 105199794, RESELLER -smartadserver.com, 1999, RESELLER, 060d053dcf45cbf3 -indexexchange.com, 201092, RESELLER, 50b1c356f2c5c8fc -indexexchange.com, 192450, RESELLER, 50b1c356f2c5c8fc -onetag.com, 7a4244b2979db22, RESELLER -onetag.com, 7a4244b2979db22-OB, RESELLER -openx.com, 539625136, RESELLER -google.com, pub-2128757167812663, RESELLER, f08c47fec0942fa0 -rubiconproject.com, 17210, RESELLER, 0bfd66d529a55807 -appnexus.com, 10264, RESELLER, f5ab79cb980f11d1 -pubmatic.com, 156383, RESELLER, 5d62403b186f2ace -themediagrid.com, VIY354, RESELLER, 35d5010d7789b49d -smartadserver.com, 1743, RESELLER, 060d053dcf45cbf3 -improvedigital.com, 2048, RESELLER -lijit.com, 257429, RESELLER, fafdf38b16bf6b2b -adform.com, 2474, RESELLER, 9f5210a2f0999e32 -triplelift.com, 12911, RESELLER, 6c33edb13117fd86 -aps.amazon.com, 93aec77c-f6d2-45bd-affc-a85ab5a72683, RESELLER - -# InfoLinks - -infolinks.com, 3434212, direct -pubmatic.com, 156872, reseller, 5d62403b186f2ace -xandr.com, 3251, reseller -indexexchange.com, 191306, reseller -lijit.com, 268479, reseller, fafdf38b16bf6b2b -media.net, 8CUY6IX4H, reseller -openx.com, 543174347, reseller, 6a698e2ec38604c6 -video.unrulymedia.com, 2221906906, reseller -improvedigital.com, 2016, reseller -onetag.com, 598ce3ddaee8c90, reseller - - -#Legacy or Unique -google.com, pub-9403278435468733, DIRECT, f08c47fec0942fa0 +google.com, pub-9403278435468733, DIRECT, f08c47fec0942fa0 \ No newline at end of file diff --git a/public/blog-assets/announcing-tanstack-start-v1/header.png b/public/blog-assets/announcing-tanstack-start-v1/header.png deleted file mode 100644 index cb8eec9f5..000000000 Binary files a/public/blog-assets/announcing-tanstack-start-v1/header.png and /dev/null differ 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/power-in-pragmatism/header.jpg b/public/blog-assets/power-in-pragmatism/header.jpg deleted file mode 100644 index 67c24801f..000000000 Binary files a/public/blog-assets/power-in-pragmatism/header.jpg and /dev/null differ diff --git a/public/blog-assets/search-params-are-state/search-params-are-state-header.jpg b/public/blog-assets/search-params-are-state/search-params-are-state-header.jpg deleted file mode 100644 index 4ec9a4c22..000000000 Binary files a/public/blog-assets/search-params-are-state/search-params-are-state-header.jpg 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-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.1/header.png b/public/blog-assets/tanstack-db-0.1/header.png deleted file mode 100644 index dacbb88c6..000000000 Binary files a/public/blog-assets/tanstack-db-0.1/header.png 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/images/logos/logo-black.svg b/public/images/logos/logo-black.svg deleted file mode 100644 index ae99f5fdf..000000000 --- a/public/images/logos/logo-black.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/logos/logo-color-100.png b/public/images/logos/logo-color-100.png deleted file mode 100644 index 41443b6c2..000000000 Binary files a/public/images/logos/logo-color-100.png and /dev/null differ diff --git a/public/images/logos/logo-color-600.png b/public/images/logos/logo-color-600.png deleted file mode 100644 index 9db3e67ba..000000000 Binary files a/public/images/logos/logo-color-600.png and /dev/null differ diff --git a/public/images/logos/logo-color-banner-100.png b/public/images/logos/logo-color-banner-100.png deleted file mode 100644 index 367cbcffc..000000000 Binary files a/public/images/logos/logo-color-banner-100.png and /dev/null differ diff --git a/public/images/logos/logo-color-banner-600.png b/public/images/logos/logo-color-banner-600.png deleted file mode 100644 index 568c2e8df..000000000 Binary files a/public/images/logos/logo-color-banner-600.png and /dev/null differ diff --git a/public/images/logos/logo-white.svg b/public/images/logos/logo-white.svg deleted file mode 100644 index 5e12bb860..000000000 --- a/public/images/logos/logo-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/logos/logo-word-black.svg b/public/images/logos/logo-word-black.svg deleted file mode 100644 index 2789c63d5..000000000 --- a/public/images/logos/logo-word-black.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/logos/logo-word-white.svg b/public/images/logos/logo-word-white.svg deleted file mode 100644 index b6ec5086c..000000000 --- a/public/images/logos/logo-word-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/images/logos/splash-dark.png b/public/images/logos/splash-dark.png deleted file mode 100644 index 3f43c689e..000000000 Binary files a/public/images/logos/splash-dark.png and /dev/null differ diff --git a/public/images/logos/splash-light.png b/public/images/logos/splash-light.png deleted file mode 100644 index 4e262a5eb..000000000 Binary files a/public/images/logos/splash-light.png and /dev/null 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/public/robots.txt b/public/robots.txt deleted file mode 100644 index 8880c3462..000000000 --- a/public/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -User-agent: * -Allow: / - -Sitemap: https://tanstack.com/sitemap.xml \ No newline at end of file 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/client.ts b/src/auth/client.ts deleted file mode 100644 index 9b79ed9e0..000000000 --- a/src/auth/client.ts +++ /dev/null @@ -1,86 +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 }: { provider: OAuthProvider }) => { - window.location.href = `/auth/${provider}/start` - }, - - /** - * 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-start-v1.md b/src/blog/announcing-tanstack-start-v1.md deleted file mode 100644 index a9adb7d9c..000000000 --- a/src/blog/announcing-tanstack-start-v1.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: TanStack Start v1 Release Candidate -published: 2025-09-23 -authors: - - Tanner Linsley ---- - -![TanStack Start v1 Release Candidate](/blog-assets/announcing-tanstack-start-v1/header.png) - -TanStack Start has officially reached a **v1.0 Release Candidate**. This is the build we expect to ship as 1.0, pending your final feedback, docs polish, and a few last-mile fixes. Now’s the perfect time to kick the tires and help us validate the final stretch. When 1.0 ships, we’ll update this post (same URL) with any final notes. - -## Why this matters - -TanStack Start isn’t just another framework, it’s the next chapter in building type-safe, high-performance React apps without the heavy abstractions. Whether you’re coming from classic SPAs or dipping into SSR, Start gives you the flexibility to scale in the direction that fits your team. - -## What’s in v1 - -- **Type-safe, file-based routing** powered by TanStack Router -- **Server-first ergonomics** with isomorphic server functions -- **Built-in streaming**; **React Server Components** support is on the way -- **URL-as-state primitives** with runtime validation and full type-safety -- **Great SPA and SSR DX** with no lock-in or opaque magic -- **Deep Query integration** for prefetching, caching, and hydration - -Want the full backstory? Check out: - -- [Why choose TanStack Start and Router?](/blog/why-tanstack-start-and-router) -- [Why TanStack Start is ditching adapters](/blog/why-tanstack-start-is-ditching-adapters) - -## Get started or upgrade - -Follow the Getting Started guide to spin up a fresh app or upgrade an existing one: - -- [TanStack Start Docs](/start) - -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. - -> **Note:** React Server Components support is in active development and will land as a non-breaking v1.x addition. - -## Powered by partners - -We’re fortunate to build alongside an incredible lineup of partners whose support keeps TanStack open and moving fast: - -- [Code Rabbit](https://coderabbit.link/tanstack?utm_source=tanstack&via=tanstack) -- [Cloudflare](https://www.cloudflare.com?utm_source=tanstack) -- [AG Grid](https://ag-grid.com/react-data-grid/?utm_source=reacttable&utm_campaign=githubreacttable) -- [Netlify](https://netlify.com?utm_source=tanstack) -- [Neon](https://neon.tech?utm_source=tanstack) -- [Clerk](https://go.clerk.com/wOwHtuJ) -- [Convex](https://convex.dev?utm_source=tanstack) -- [Electric](https://electric-sql.com) -- [Sentry](https://sentry.io?utm_source=tanstack) -- [Prisma](https://www.prisma.io/?utm_source=tanstack&via=tanstack) -- [Strapi](https://strapi.link/tanstack-start) -- [Unkey](https://www.unkey.com/?utm_source=tanstack) -- [UI.dev / Bytes.dev](https://bytes.dev?utm_source-tanstack&utm_campaign=tanstack) -- [Nozzle](https://nozzle.io/?utm_source=tanstack&utm_campaign=tanstack) -- ...[Previous Partners](https://tanstack.com/partners?status=inactive) - -### Special thanks to Cloudflare and Netlify - -Their collaboration is a pivotal force driving the open web forward. Explore their announcements to see how we’re building the modern web together: [Cloudflare, Astro, and TanStack: building the modern web together](https://blog.cloudflare.com/cloudflare-astro-tanstack) and [Supporting an Open Web with Netlify + Cloudflare](https://www.netlify.com/blog/supporting-an-open-web-with-netlify-cloudflare/). - -## 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. - -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/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/power-in-pragmatism.md b/src/blog/power-in-pragmatism.md deleted file mode 100644 index 5a9aeb44f..000000000 --- a/src/blog/power-in-pragmatism.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: The Power in Pragmatism -published: 2025-05-22 -authors: - - Tanner Linsley ---- - -![The Power in Pragmatism](/blog-assets/power-in-pragmatism/header.jpg) - -The web ecosystem moves fast. Frameworks evolve, paradigms shift, and tools get rewritten in pursuit of better ideas, or sometimes just cleaner abstractions. That kind of exploration can be valuable, but it can also come at the cost of leaving developers behind. - -I've chased purity before. Type-safety, for example, is a hill I've been more than willing to climb. And I still believe some of those pursuits are worth it. But I've also learned that pragmatism usually wins in the long run, especially when you're trying to build tools that developers can trust, adopt incrementally, and grow with. - -## Foundations That Don't Move - -One of the most exciting parts of building [**TanStack Start**](https://tanstack.com/start) and [**TanStack Router**](https://tanstack.com/router) is that they aren't tied to any one framework. They're framework-agnostic by design, built on the belief that UI frameworks are just rendering tools, not foundations your entire app should depend on. - -That decision wasn't made to hedge against future shifts. It was made to keep the core ideas of routing and app composition flexible, testable, and broadly useful, regardless of whether you're building with React, Solid, Vue, or whatever's next. - -Because of that, TanStack tools aren't in need of a pivot. They're already designed to adapt to where frameworks go. - -## The Spirit of TanStack Query - -This philosophy isn't new to us. [**TanStack Query**](https://tanstack.com/query) became what it is by solving real-world problems with data-fetching, caching, and invalidation, without trying to own your app architecture. It made working with async state better, no matter your stack. - -TanStack Start and Router carry that same spirit forward: composable, type-safe primitives that solve specific problems really well, while giving you complete control over how deep you go. - -## Composability Is the Strategy - -Some tools aim to provide the entire full-stack experience out of the box. That works for many developers, and there's nothing wrong with it. But TanStack Start is built differently: it's designed to scale _with_ your needs, not ahead of them. - -You can use just the router. Or add server functions. Or bring in the mini query cache. You can even replace pieces with your own. That's not just flexibility, it's composability by design. - -We believe abstractions should be optional and interchangeable. That's how you future-proof a toolset. - -## What Comes Next - -The ecosystem is shifting again, and that's okay. Some are exploring new rendering models. Some are doubling down on server-first patterns. Others are rethinking what a framework even is. - -We welcome that. In fact, we've already built for it. - -By focusing on primitives instead of platforms, TanStack tools grow with the web, not away from it. We're not chasing clean slates. We're building on what works, refining what doesn't, and staying focused on helping developers build great apps today and tomorrow. - -We're not here to convert you. We're here to support you, wherever you are, and wherever you're headed. 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 deleted file mode 100644 index 751147bf4..000000000 --- a/src/blog/search-params-are-state.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Search Params Are State -published: 2025-06-03 -authors: - - Tanner Linsley ---- - -![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 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: - -```ts -const schema = z.object({ - sort: z.enum(['asc', 'desc']), -}) - -const raw = Object.fromEntries(new URLSearchParams(location.href)) -const result = schema.safeParse(raw) - -if (!result.success) { - // fallback, redirect, or show error -} -``` - -This works, but it’s manual and repetitive. There’s no inference, no connection to the route itself, and it falls apart the moment you want to add more types, defaults, transformations, or structure. - -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. - -But almost none of them solve the deeper, harder problem: **writing** search params, safely and atomically, with full awareness of routing context. - ---- - -### Writing Search Params Is Where It Falls Apart - -It’s one thing to read from the URL. It’s another to construct a valid, intentional URL from code. - -The moment you try to do this: - -```tsx - -``` - -You realize you have no idea what search params are valid for this route, or if you’re formatting them correctly. Even with a helper to stringify them, nothing is enforcing contracts between the caller and the route. There’s no type inference, no validation, and no guardrails. - -This is where **constraint becomes a feature**. - -Without explicitly declaring search param schemas in the route itself, you’re stuck guessing. You might validate in one place, but there’s nothing stopping another component from navigating with invalid, partial, or conflicting state. - -Constraint is what makes coordination possible. It’s what allows **non-local callers** to participate safely. - ---- - -### 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. - -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. - ---- - -### How TanStack Router Solves It - -TanStack Router solves this holistically. - -Instead of spreading schema logic across your app, you define it **inside the route itself**: - -```ts -export const Route = createFileRoute('/dashboards/overview')({ - validateSearch: z.object({ - sort: z.enum(['asc', 'desc']), - filter: z.string().optional(), - }), -}) -``` - -This schema becomes the single source of truth. You get full inference, validation, and autocomplete everywhere: - -```tsx - -``` - -Want to update just part of the search state? No problem: - -```ts -navigate({ - search: (prev) => ({ ...prev, page: prev.page + 1 }), -}) -``` - -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**. - -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. - -This leads to: - -- Inconsistent defaults -- Colliding formats -- 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**. - -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. - ---- - -### Example: Safe Hierarchical Search Param Validation - -Here’s how this works in practice: - -```ts -// routes/dashboard.tsx -export const Route = createFileRoute('/dashboard')({ - validateSearch: z.object({ - sort: z.enum(['asc', 'desc']).default('asc'), - }), -}) -``` - -Then a child route can extend the schema safely: - -```ts -// routes/dashboard/$dashboardId.tsx -export const Route = createFileRoute('/dashboard/$dashboardId')({ - validateSearch: z.object({ - filter: z.string().optional(), - // ✅ \`sort\` is inherited automatically from the parent - }), -}) -``` - -When you match \`/dashboard/123?sort=desc&filter=active\`, the parent validates \`sort\`, the child validates \`filter\`, and everything works together seamlessly. - -Try to redefine the required parent param in the child route to something entirely different? Type error. - -```ts -validateSearch: z.object({ - // ❌ Type error: boolean does not extend 'asc' | 'desc' from parent - sort: z.boolean(), - filter: z.string().optional(), -}) -``` - -This kind of enforcement makes nested routes composable _and_ safe . a rare combo. - ---- - -### Built-In Discipline - -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. - ---- - -### Search Params Are State - -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. - -Because if you’re not treating search params like state, you’re going to keep leaking it, breaking it, and working around it. - -Better to treat it right from the start. - -If you're intrigued by the possibilities of treating search params as first-class state, we invite you to try out [TanStack Router](https://tanstack.com/router). Experience the power of validated, inferable, and reactive search params in your routing logic. 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-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 deleted file mode 100644 index 960399080..000000000 --- a/src/blog/tanstack-db-0.1-the-embedded-client-database-for-tanstack-query.md +++ /dev/null @@ -1,381 +0,0 @@ ---- -title: Stop Re-Rendering. TanStack DB, the Embedded Client Database for TanStack Query -published: 2025-07-30 -authors: - - Kyle Mathews - - Sam Willis ---- - -![Stop rerendering](/blog-assets/tanstack-db-0.1/header.png) - -**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. - -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)) - -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.” - -### Why it matters - - - -Today most teams face an ugly fork in the road: - -**Option A. View-specific APIs** (fast render, slow network, endless endpoint sprawl) or - -**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. - -**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. - -- **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. - -Put differently: **TanStack Query still owns “how do I fetch?”**; **TanStack DB owns “how do I keep everything coherent and lightning-fast once it’s here?”** - -And because it’s just another layer on top of `queryClient`, you can adopt it one collection at a time. - -## TanStack Query → TanStack DB - -Imagine we already have a backend with a REST API that exposes the `/api/todos` endpoint to fetch a list of todos and mutate them. - -
    -
    - -### Before: TanStack Query - -```typescript -import { - useQuery, - useMutation, - useQueryClient, // ❌ Not needed with DB -} from '@tanstack/react-query' - -const Todos = () => { - const queryClient = useQueryClient() // ❌ - - // Fetch todos - const { data: allTodos = [] } = useQuery({ - queryKey: ['todos'], - queryFn: async () => - api.todos.getAll('/api/todos'), - }) - - // Filter incomplete todos - // ❌ Runs every render unless memoized - const todos = allTodos.filter( - (todo) => !todo.completed - ) - - // ❌ Manual optimistic update boilerplate - const addTodoMutation = useMutation({ - mutationFn: async (newTodo) => - api.todos.create(newTodo), - onMutate: async (newTodo) => { - await queryClient.cancelQueries({ - queryKey: ['todos'], - }) - const previousTodos = - queryClient.getQueryData(['todos']) - queryClient.setQueryData( - ['todos'], - (old) => [...(old || []), newTodo] - ) - - return { previousTodos } - }, - onError: (err, newTodo, context) => { - queryClient.setQueryData( - ['todos'], - context.previousTodos - ) - }, - onSettled: () => { - queryClient.invalidateQueries({ - queryKey: ['todos'], - }) - }, - }) - - return ( -
    - -
    - ) -} -``` - -
    -
    - -### After: TanStack DB - -```typescript -// ✅ Define a Query Collection -import { createCollection } from '@tanstack/react-db' -import { queryCollectionOptions } from '@tanstack/query-db-collection' - -const todoCollection = createCollection( - queryCollectionOptions({ - queryKey: ['todos'], - queryFn: async () => - api.todos.getAll('/api/todos'), - getKey: (item) => item.id, // ✅ New - schema: todoSchema, // ✅ New - onInsert: async ({ transaction }) => { - // ✅ New - await Promise.all( - transaction.mutations.map((mutation) => - api.todos.create(mutation.modified) - ) - ) - }, - }) -) - -// ✅ Use live queries in components -import { useLiveQuery } from '@tanstack/react-db' -import { eq } from '@tanstack/db' - -const Todos = () => { - // ✅ Live query with automatic updates - const { data: todos } = useLiveQuery((query) => - query - .from({ todos: todoCollection }) - // ✅ Type-safe query builder - // ✅ Incremental computation - .where(({ todos }) => - eq(todos.completed, false) - ) - ) - - return ( -
    - -
    - ) -} -``` - -
    -
    - -## Why a new client store? - -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. - -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. - -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. - -## 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 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. - -**TanStack DB enables Option C – Normalized Collections + Incremental Joins:** Load normalized collections through fewer API calls, then perform lightning-fast incremental joins in the client. You get the network efficiency of broad data loading with sub-millisecond query performance that makes Option A unnecessary. - -Instead of this: - -```typescript -// View-specific API call every time you navigate -const { data: projectTodos } = useQuery({ - queryKey: ['project-todos', projectId], - queryFn: () => fetchProjectTodosWithUsers(projectId) -}) -``` - -You can do this: - -```typescript -// Load normalized collections upfront (3 broader calls) -const todoCollection = createQueryCollection({ - queryKey: ['todos'], - queryFn: fetchAllTodos, -}) -const userCollection = createQueryCollection({ - queryKey: ['users'], - queryFn: fetchAllUsers, -}) -const projectCollection = createQueryCollection({ - queryKey: ['projects'], - queryFn: fetchAllProjects, -}) - -// Navigation is instant, no new API calls needed -const { data: activeProjectTodos } = useLiveQuery( - (q) => - q - .from({ t: todoCollection }) - .innerJoin( - { u: userCollection }, - ({ t, u }) => eq(t.userId, u.id) - ) - .innerJoin( - { p: projectCollection }, - ({ u, p }) => eq(u.projectId, p.id) - ) - .where(({ t }) => eq(t.active, true)) - .where(({ p }) => - eq(p.id, currentProject.id) - ) -) -``` - -Now, clicking between projects, users, or views requires **zero API calls**. All the data is already loaded. New features like **"show user workload across all projects"** work instantly without touching your backend. - -Your API becomes simpler. Your network calls drop dramatically. Your frontend gets faster as your dataset grows. - -## The 20MB Question - -**Your app would be dramatically faster if you just loaded 20MB of normalized data upfront** instead of making hundreds of small API calls. - -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. - -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. - -**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. - -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. - -## Our Goals for TanStack DB - -We're building TanStack DB to address the client-side data bottlenecks that every team eventually hits. Here's what we're aiming for: - -- **True backend flexibility**: Work with any data source through pluggable collection creators. Whether you're using REST APIs, GraphQL, Electric, Firebase, or building something custom, TanStack DB adapts to your stack. Start with what you have, upgrade if needed, mix different approaches in the same app. -- **Incremental adoption that actually works**: Start with one collection, add more as you build new features. No big-bang migrations or development pauses. -- **Query performance at scale**: Sub-millisecond queries across large datasets through differential dataflow, even when your app has thousands of items. -- **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. - -## What's Next - -TanStack DB 0.1 (first beta) is available now. We're specifically looking for teams who: - -- Already use TanStack Query and hit performance/code complexity walls with complex state -- Build collaborative features but struggle with slow optimistic updates -- Have 1000+ item datasets causing rendering performance issues -- Want real-time functionality without rewriting their entire data layer -- First 20 teams get migration office hours - -If your team spends more time optimizing React re-renders than building features, or if your collaborative features feel sluggish compared to Linear and Figma, TanStack DB is designed for exactly your situation. - -**Get started today:** - -- [Documentation & Quick Start](https://tanstack.com/db/latest) -- [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! 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/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