From 564ec93121b4deb8c3b0a3bcb805caf8648abd19 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Tue, 9 Dec 2025 23:24:18 -0500 Subject: [PATCH 01/48] fix: add keys to deployment --- .github/workflows/deploy-preview.yaml | 6 ++++++ .github/workflows/deploy-production.yaml | 6 ++++++ .github/workflows/deploy-staging.yaml | 6 ++++++ app/api/auth/discogs/request-token.ts | 5 ++--- app/api/external/discogs/search.ts | 5 ++--- lib/api-clients/discogs/index.ts | 4 ++-- 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy-preview.yaml b/.github/workflows/deploy-preview.yaml index a7b1e94..be223aa 100644 --- a/.github/workflows/deploy-preview.yaml +++ b/.github/workflows/deploy-preview.yaml @@ -49,6 +49,12 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy --name crate-app-pr-${{ github.event.pull_request.number }} + secrets: | + DISCOGS_CONSUMER_KEY + DISCOGS_CONSUMER_SECRET + env: + DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} + DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} - name: Comment PR with Preview URL uses: actions/github-script@v7 diff --git a/.github/workflows/deploy-production.yaml b/.github/workflows/deploy-production.yaml index 095d13e..529115e 100644 --- a/.github/workflows/deploy-production.yaml +++ b/.github/workflows/deploy-production.yaml @@ -53,4 +53,10 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy + secrets: | + DISCOGS_CONSUMER_KEY + DISCOGS_CONSUMER_SECRET + env: + DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} + DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} diff --git a/.github/workflows/deploy-staging.yaml b/.github/workflows/deploy-staging.yaml index 509e865..8fa50ef 100644 --- a/.github/workflows/deploy-staging.yaml +++ b/.github/workflows/deploy-staging.yaml @@ -53,4 +53,10 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy + secrets: | + DISCOGS_CONSUMER_KEY + DISCOGS_CONSUMER_SECRET + env: + DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} + DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 3c583df..f7bea8d 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -25,9 +25,8 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const baseUrl = getValidatedOrigin(request.url); const sdk = new DiscogsSDK({ - DiscogsConsumerKey: import.meta.env.VITE_DISCOGS_CONSUMER_KEY || '', - DiscogsConsumerSecret: - import.meta.env.VITE_DISCOGS_CONSUMER_SECRET || '', + DiscogsConsumerKey: process.env.DISCOGS_CONSUMER_KEY || '', + DiscogsConsumerSecret: process.env.DISCOGS_CONSUMER_SECRET || '', callbackUrl: `${baseUrl}/api/auth/discogs/callback`, userAgent: 'CrateApp/1.0 +https://crate.ai', debug: false, diff --git a/app/api/external/discogs/search.ts b/app/api/external/discogs/search.ts index 4dd01cc..485fba9 100644 --- a/app/api/external/discogs/search.ts +++ b/app/api/external/discogs/search.ts @@ -57,9 +57,8 @@ export const Route = createFileRoute('/api/external/discogs/search')({ } const sdk = new DiscogsSDK({ - DiscogsConsumerKey: import.meta.env.VITE_DISCOGS_CONSUMER_KEY || '', - DiscogsConsumerSecret: - import.meta.env.VITE_DISCOGS_CONSUMER_SECRET || '', + DiscogsConsumerKey: process.env.DISCOGS_CONSUMER_KEY || '', + DiscogsConsumerSecret: process.env.DISCOGS_CONSUMER_SECRET || '', userAgent: 'CrateApp/1.0 +https://crate.ai', }); diff --git a/lib/api-clients/discogs/index.ts b/lib/api-clients/discogs/index.ts index 24fa8bd..f21873e 100644 --- a/lib/api-clients/discogs/index.ts +++ b/lib/api-clients/discogs/index.ts @@ -3,8 +3,8 @@ import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { rateLimiter } from '@/lib/utils/rateLimiter'; const discogs = new DiscogsSDK({ - DiscogsConsumerKey: import.meta.env.VITE_DISCOGS_CONSUMER_KEY || '', - DiscogsConsumerSecret: import.meta.env.VITE_DISCOGS_CONSUMER_SECRET || '', + DiscogsConsumerKey: process.env.DISCOGS_CONSUMER_KEY || '', + DiscogsConsumerSecret: process.env.DISCOGS_CONSUMER_SECRET || '', }); export const fetchUserDetails = async (username: string) => { From 71182ed5a760c93a062ed38c0215077b4ce7f3d4 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Tue, 9 Dec 2025 23:32:42 -0500 Subject: [PATCH 02/48] fix: use process.env for Discogs secrets in deployed Workers - Update server-side Discogs routes to use process.env instead of import.meta.env - Add fallback to VITE_DISCOGS_* for local development compatibility - Use explicit wrangler secret put commands in all deployment workflows - This fixes 401/500 errors on preview, staging, and production deployments --- .github/workflows/deploy-preview.yaml | 12 +++++++----- .github/workflows/deploy-production.yaml | 12 +++++++----- .github/workflows/deploy-staging.yaml | 12 +++++++----- app/api/auth/discogs/request-token.ts | 10 ++++++++-- app/api/external/discogs/search.ts | 10 ++++++++-- lib/api-clients/discogs/index.ts | 10 ++++++++-- 6 files changed, 45 insertions(+), 21 deletions(-) diff --git a/.github/workflows/deploy-preview.yaml b/.github/workflows/deploy-preview.yaml index be223aa..43710d5 100644 --- a/.github/workflows/deploy-preview.yaml +++ b/.github/workflows/deploy-preview.yaml @@ -49,12 +49,14 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy --name crate-app-pr-${{ github.event.pull_request.number }} - secrets: | - DISCOGS_CONSUMER_KEY - DISCOGS_CONSUMER_SECRET + + - name: Set Worker Secrets env: - DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} - DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: | + echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | npx wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app-pr-${{ github.event.pull_request.number }} + echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | npx wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app-pr-${{ github.event.pull_request.number }} - name: Comment PR with Preview URL uses: actions/github-script@v7 diff --git a/.github/workflows/deploy-production.yaml b/.github/workflows/deploy-production.yaml index 529115e..b1b9845 100644 --- a/.github/workflows/deploy-production.yaml +++ b/.github/workflows/deploy-production.yaml @@ -53,10 +53,12 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy - secrets: | - DISCOGS_CONSUMER_KEY - DISCOGS_CONSUMER_SECRET + + - name: Set Worker Secrets (Production) env: - DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} - DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: | + echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | npx wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app + echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | npx wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app diff --git a/.github/workflows/deploy-staging.yaml b/.github/workflows/deploy-staging.yaml index 8fa50ef..ac663ef 100644 --- a/.github/workflows/deploy-staging.yaml +++ b/.github/workflows/deploy-staging.yaml @@ -53,10 +53,12 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy - secrets: | - DISCOGS_CONSUMER_KEY - DISCOGS_CONSUMER_SECRET + + - name: Set Worker Secrets (Staging) env: - DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} - DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: | + echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | npx wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app + echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | npx wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index f7bea8d..fe31b76 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -25,8 +25,14 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const baseUrl = getValidatedOrigin(request.url); const sdk = new DiscogsSDK({ - DiscogsConsumerKey: process.env.DISCOGS_CONSUMER_KEY || '', - DiscogsConsumerSecret: process.env.DISCOGS_CONSUMER_SECRET || '', + DiscogsConsumerKey: + process.env.DISCOGS_CONSUMER_KEY || + process.env.VITE_DISCOGS_CONSUMER_KEY || + '', + DiscogsConsumerSecret: + process.env.DISCOGS_CONSUMER_SECRET || + process.env.VITE_DISCOGS_CONSUMER_SECRET || + '', callbackUrl: `${baseUrl}/api/auth/discogs/callback`, userAgent: 'CrateApp/1.0 +https://crate.ai', debug: false, diff --git a/app/api/external/discogs/search.ts b/app/api/external/discogs/search.ts index 485fba9..6020863 100644 --- a/app/api/external/discogs/search.ts +++ b/app/api/external/discogs/search.ts @@ -57,8 +57,14 @@ export const Route = createFileRoute('/api/external/discogs/search')({ } const sdk = new DiscogsSDK({ - DiscogsConsumerKey: process.env.DISCOGS_CONSUMER_KEY || '', - DiscogsConsumerSecret: process.env.DISCOGS_CONSUMER_SECRET || '', + DiscogsConsumerKey: + process.env.DISCOGS_CONSUMER_KEY || + process.env.VITE_DISCOGS_CONSUMER_KEY || + '', + DiscogsConsumerSecret: + process.env.DISCOGS_CONSUMER_SECRET || + process.env.VITE_DISCOGS_CONSUMER_SECRET || + '', userAgent: 'CrateApp/1.0 +https://crate.ai', }); diff --git a/lib/api-clients/discogs/index.ts b/lib/api-clients/discogs/index.ts index f21873e..bffb97e 100644 --- a/lib/api-clients/discogs/index.ts +++ b/lib/api-clients/discogs/index.ts @@ -3,8 +3,14 @@ import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { rateLimiter } from '@/lib/utils/rateLimiter'; const discogs = new DiscogsSDK({ - DiscogsConsumerKey: process.env.DISCOGS_CONSUMER_KEY || '', - DiscogsConsumerSecret: process.env.DISCOGS_CONSUMER_SECRET || '', + DiscogsConsumerKey: + process.env.DISCOGS_CONSUMER_KEY || + process.env.VITE_DISCOGS_CONSUMER_KEY || + '', + DiscogsConsumerSecret: + process.env.DISCOGS_CONSUMER_SECRET || + process.env.VITE_DISCOGS_CONSUMER_SECRET || + '', }); export const fetchUserDetails = async (username: string) => { From f9a423e69aa1e7823e2cb1f3a8bd6fe7b5a7b04c Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Tue, 9 Dec 2025 23:41:23 -0500 Subject: [PATCH 03/48] fix: use cloudflare:workers env for accessing Worker secrets The correct way to access Cloudflare Worker secrets/bindings is via the `env` object from `cloudflare:workers` module, not `process.env`. --- app/api/auth/discogs/request-token.ts | 9 +++++---- app/api/external/discogs/search.ts | 9 +++++---- lib/api-clients/discogs/index.ts | 9 +++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index fe31b76..57dafc8 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -1,6 +1,7 @@ import { createFileRoute } from '@tanstack/react-router'; import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { serialize } from 'cookie'; +import { env } from 'cloudflare:workers'; // Allowed origins for OAuth redirects (security allowlist) const ALLOWED_ORIGINS = [ @@ -26,12 +27,12 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const sdk = new DiscogsSDK({ DiscogsConsumerKey: - process.env.DISCOGS_CONSUMER_KEY || - process.env.VITE_DISCOGS_CONSUMER_KEY || + (env as Record).DISCOGS_CONSUMER_KEY || + (env as Record).VITE_DISCOGS_CONSUMER_KEY || '', DiscogsConsumerSecret: - process.env.DISCOGS_CONSUMER_SECRET || - process.env.VITE_DISCOGS_CONSUMER_SECRET || + (env as Record).DISCOGS_CONSUMER_SECRET || + (env as Record).VITE_DISCOGS_CONSUMER_SECRET || '', callbackUrl: `${baseUrl}/api/auth/discogs/callback`, userAgent: 'CrateApp/1.0 +https://crate.ai', diff --git a/app/api/external/discogs/search.ts b/app/api/external/discogs/search.ts index 6020863..4002161 100644 --- a/app/api/external/discogs/search.ts +++ b/app/api/external/discogs/search.ts @@ -2,6 +2,7 @@ import { createFileRoute } from '@tanstack/react-router'; import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { parse } from 'cookie'; import type { SearchParams, SearchResult, SearchResponse } from '@/lib/types'; +import { env } from 'cloudflare:workers'; function buildSearchParams(originalQuery: string): SearchParams { const terms = originalQuery.trim().split(/\s+/); @@ -58,12 +59,12 @@ export const Route = createFileRoute('/api/external/discogs/search')({ const sdk = new DiscogsSDK({ DiscogsConsumerKey: - process.env.DISCOGS_CONSUMER_KEY || - process.env.VITE_DISCOGS_CONSUMER_KEY || + (env as Record).DISCOGS_CONSUMER_KEY || + (env as Record).VITE_DISCOGS_CONSUMER_KEY || '', DiscogsConsumerSecret: - process.env.DISCOGS_CONSUMER_SECRET || - process.env.VITE_DISCOGS_CONSUMER_SECRET || + (env as Record).DISCOGS_CONSUMER_SECRET || + (env as Record).VITE_DISCOGS_CONSUMER_SECRET || '', userAgent: 'CrateApp/1.0 +https://crate.ai', }); diff --git a/lib/api-clients/discogs/index.ts b/lib/api-clients/discogs/index.ts index bffb97e..901b003 100644 --- a/lib/api-clients/discogs/index.ts +++ b/lib/api-clients/discogs/index.ts @@ -1,15 +1,16 @@ import { Release } from '@/lib/types'; import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { rateLimiter } from '@/lib/utils/rateLimiter'; +import { env } from 'cloudflare:workers'; const discogs = new DiscogsSDK({ DiscogsConsumerKey: - process.env.DISCOGS_CONSUMER_KEY || - process.env.VITE_DISCOGS_CONSUMER_KEY || + (env as Record).DISCOGS_CONSUMER_KEY || + (env as Record).VITE_DISCOGS_CONSUMER_KEY || '', DiscogsConsumerSecret: - process.env.DISCOGS_CONSUMER_SECRET || - process.env.VITE_DISCOGS_CONSUMER_SECRET || + (env as Record).DISCOGS_CONSUMER_SECRET || + (env as Record).VITE_DISCOGS_CONSUMER_SECRET || '', }); From 4f64b77f90b2521c21f94681a87e919a381e516b Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Tue, 9 Dec 2025 23:44:14 -0500 Subject: [PATCH 04/48] fix: add @cloudflare/workers-types for cloudflare:workers module Adds TypeScript type declarations for the cloudflare:workers module which provides access to Worker bindings (secrets, vars, etc.) --- package.json | 1 + pnpm-lock.yaml | 19 ++++++++++++++----- tsconfig.json | 1 + 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 70f89e4..cd5d467 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "devDependencies": { "@antfu/ni": "^27.0.1", "@cloudflare/vite-plugin": "^1.17.0", + "@cloudflare/workers-types": "^4.20251209.0", "@tailwindcss/vite": "^4.1.17", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0fd8849..956598d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -161,7 +161,10 @@ importers: version: 27.0.1 '@cloudflare/vite-plugin': specifier: ^1.17.0 - version: 1.17.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))(workerd@1.20251202.0)(wrangler@4.53.0) + version: 1.17.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))(workerd@1.20251202.0)(wrangler@4.53.0(@cloudflare/workers-types@4.20251209.0)) + '@cloudflare/workers-types': + specifier: ^4.20251209.0 + version: 4.20251209.0 '@tailwindcss/vite': specifier: ^4.1.17 version: 4.1.17(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) @@ -236,7 +239,7 @@ importers: version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jiti@2.6.1)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) wrangler: specifier: ^4.53.0 - version: 4.53.0 + version: 4.53.0(@cloudflare/workers-types@4.20251209.0) packages: @@ -507,6 +510,9 @@ packages: cpu: [x64] os: [win32] + '@cloudflare/workers-types@4.20251209.0': + resolution: {integrity: sha512-O+cbUVwgb4NgUB39R1cITbRshlAAPy1UQV0l8xEy2xcZ3wTh3fMl9f5oBwLsVmE9JRhIZx6llCLOBVf53eI5xA==} + '@convex-dev/auth@0.0.90': resolution: {integrity: sha512-aqw88EB042HvnaF4wcf/f/wTocmT2Bus2VDQRuV79cM0+8kORM0ICK/ByZ6XsHgQ9qr6TmidNbXm6QAgndrdpQ==} hasBin: true @@ -6192,7 +6198,7 @@ snapshots: optionalDependencies: workerd: 1.20251202.0 - '@cloudflare/vite-plugin@1.17.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))(workerd@1.20251202.0)(wrangler@4.53.0)': + '@cloudflare/vite-plugin@1.17.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))(workerd@1.20251202.0)(wrangler@4.53.0(@cloudflare/workers-types@4.20251209.0))': dependencies: '@cloudflare/unenv-preset': 2.7.13(unenv@2.0.0-rc.24)(workerd@1.20251202.0) '@remix-run/node-fetch-server': 0.8.1 @@ -6203,7 +6209,7 @@ snapshots: tinyglobby: 0.2.15 unenv: 2.0.0-rc.24 vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) - wrangler: 4.53.0 + wrangler: 4.53.0(@cloudflare/workers-types@4.20251209.0) ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -6225,6 +6231,8 @@ snapshots: '@cloudflare/workerd-windows-64@1.20251202.0': optional: true + '@cloudflare/workers-types@4.20251209.0': {} + '@convex-dev/auth@0.0.90(@auth/core@0.37.0)(convex@1.29.3(react@18.3.1))(react@18.3.1)': dependencies: '@auth/core': 0.37.0 @@ -11578,7 +11586,7 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20251202.0 '@cloudflare/workerd-windows-64': 1.20251202.0 - wrangler@4.53.0: + wrangler@4.53.0(@cloudflare/workers-types@4.20251209.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.1 '@cloudflare/unenv-preset': 2.7.13(unenv@2.0.0-rc.24)(workerd@1.20251202.0) @@ -11589,6 +11597,7 @@ snapshots: unenv: 2.0.0-rc.24 workerd: 1.20251202.0 optionalDependencies: + '@cloudflare/workers-types': 4.20251209.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil diff --git a/tsconfig.json b/tsconfig.json index 7eda2cc..7d3066a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "types": ["@cloudflare/workers-types"], "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, From 14f42611079b3df767f6b75a66381483c8dd052d Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:03:28 -0500 Subject: [PATCH 05/48] fix: allow preview URLs and use process.env for Discogs secrets - Add preview URL pattern (XXX-pr.crate.audio) to ALLOWED_ORIGINS - Revert from cloudflare:workers env to process.env (works with nodejs_compat) - Remove cloudflare:workers import from all Discogs API files The 500 error was caused by preview URLs not being in the allowed origins list. --- app/api/auth/discogs/request-token.ts | 14 ++++++++------ app/api/external/discogs/search.ts | 8 ++++---- lib/api-clients/discogs/index.ts | 9 ++++----- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 57dafc8..fb7bc5f 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -1,7 +1,6 @@ import { createFileRoute } from '@tanstack/react-router'; import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { serialize } from 'cookie'; -import { env } from 'cloudflare:workers'; // Allowed origins for OAuth redirects (security allowlist) const ALLOWED_ORIGINS = [ @@ -12,7 +11,10 @@ const ALLOWED_ORIGINS = [ function getValidatedOrigin(requestUrl: string): string { const origin = new URL(requestUrl).origin; - if (!ALLOWED_ORIGINS.includes(origin)) { + // Allow preview deployments (e.g., https://131-pr.crate.audio) + const isPreviewOrigin = /^https:\/\/\d+-pr\.crate\.audio$/.test(origin); + + if (!ALLOWED_ORIGINS.includes(origin) && !isPreviewOrigin) { throw new Error(`Invalid origin: ${origin}`); } return origin; @@ -27,12 +29,12 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const sdk = new DiscogsSDK({ DiscogsConsumerKey: - (env as Record).DISCOGS_CONSUMER_KEY || - (env as Record).VITE_DISCOGS_CONSUMER_KEY || + process.env.DISCOGS_CONSUMER_KEY || + process.env.VITE_DISCOGS_CONSUMER_KEY || '', DiscogsConsumerSecret: - (env as Record).DISCOGS_CONSUMER_SECRET || - (env as Record).VITE_DISCOGS_CONSUMER_SECRET || + process.env.DISCOGS_CONSUMER_SECRET || + process.env.VITE_DISCOGS_CONSUMER_SECRET || '', callbackUrl: `${baseUrl}/api/auth/discogs/callback`, userAgent: 'CrateApp/1.0 +https://crate.ai', diff --git a/app/api/external/discogs/search.ts b/app/api/external/discogs/search.ts index 4002161..aaddfc5 100644 --- a/app/api/external/discogs/search.ts +++ b/app/api/external/discogs/search.ts @@ -59,12 +59,12 @@ export const Route = createFileRoute('/api/external/discogs/search')({ const sdk = new DiscogsSDK({ DiscogsConsumerKey: - (env as Record).DISCOGS_CONSUMER_KEY || - (env as Record).VITE_DISCOGS_CONSUMER_KEY || + process.env.DISCOGS_CONSUMER_KEY || + process.env.VITE_DISCOGS_CONSUMER_KEY || '', DiscogsConsumerSecret: - (env as Record).DISCOGS_CONSUMER_SECRET || - (env as Record).VITE_DISCOGS_CONSUMER_SECRET || + process.env.DISCOGS_CONSUMER_SECRET || + process.env.VITE_DISCOGS_CONSUMER_SECRET || '', userAgent: 'CrateApp/1.0 +https://crate.ai', }); diff --git a/lib/api-clients/discogs/index.ts b/lib/api-clients/discogs/index.ts index 901b003..bffb97e 100644 --- a/lib/api-clients/discogs/index.ts +++ b/lib/api-clients/discogs/index.ts @@ -1,16 +1,15 @@ import { Release } from '@/lib/types'; import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { rateLimiter } from '@/lib/utils/rateLimiter'; -import { env } from 'cloudflare:workers'; const discogs = new DiscogsSDK({ DiscogsConsumerKey: - (env as Record).DISCOGS_CONSUMER_KEY || - (env as Record).VITE_DISCOGS_CONSUMER_KEY || + process.env.DISCOGS_CONSUMER_KEY || + process.env.VITE_DISCOGS_CONSUMER_KEY || '', DiscogsConsumerSecret: - (env as Record).DISCOGS_CONSUMER_SECRET || - (env as Record).VITE_DISCOGS_CONSUMER_SECRET || + process.env.DISCOGS_CONSUMER_SECRET || + process.env.VITE_DISCOGS_CONSUMER_SECRET || '', }); From 804fd3e45b417d60767e49eafa2df5340a0f9fcb Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:14:56 -0500 Subject: [PATCH 06/48] debug: add endpoint to check env vars --- app/api/auth/discogs/debug.ts | 33 +++++++++++++++++++++++++++++++++ routeTree.gen.ts | 21 +++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 app/api/auth/discogs/debug.ts diff --git a/app/api/auth/discogs/debug.ts b/app/api/auth/discogs/debug.ts new file mode 100644 index 0000000..aa36969 --- /dev/null +++ b/app/api/auth/discogs/debug.ts @@ -0,0 +1,33 @@ +import { createFileRoute } from '@tanstack/react-router'; + +export const Route = createFileRoute('/api/auth/discogs/debug')({ + server: { + handlers: { + GET: async ({ request }) => { + const origin = new URL(request.url).origin; + + // Check what environment variables are available + const debugInfo = { + origin, + hasDiscogsKey: !!process.env.DISCOGS_CONSUMER_KEY, + discogsKeyLength: process.env.DISCOGS_CONSUMER_KEY?.length || 0, + hasDiscogsSecret: !!process.env.DISCOGS_CONSUMER_SECRET, + discogsSecretLength: process.env.DISCOGS_CONSUMER_SECRET?.length || 0, + hasViteDiscogsKey: !!process.env.VITE_DISCOGS_CONSUMER_KEY, + viteDiscogsKeyLength: + process.env.VITE_DISCOGS_CONSUMER_KEY?.length || 0, + hasViteDiscogsSecret: !!process.env.VITE_DISCOGS_CONSUMER_SECRET, + viteDiscogsSecretLength: + process.env.VITE_DISCOGS_CONSUMER_SECRET?.length || 0, + nodeEnv: process.env.NODE_ENV, + // Check first 4 chars of key to verify it's correct (safe to expose partial) + keyPrefix: process.env.DISCOGS_CONSUMER_KEY?.substring(0, 4) || 'N/A', + viteKeyPrefix: + process.env.VITE_DISCOGS_CONSUMER_KEY?.substring(0, 4) || 'N/A', + }; + + return Response.json(debugInfo); + }, + }, + }, +}); diff --git a/routeTree.gen.ts b/routeTree.gen.ts index 6287e91..26b76f1 100644 --- a/routeTree.gen.ts +++ b/routeTree.gen.ts @@ -29,6 +29,7 @@ import { Route as ApiExternalDiscogsSearchRouteImport } from './app/api/external import { Route as ApiAuthDiscogsStatusRouteImport } from './app/api/auth/discogs/status' import { Route as ApiAuthDiscogsRequestTokenRouteImport } from './app/api/auth/discogs/request-token' import { Route as ApiAuthDiscogsDisconnectRouteImport } from './app/api/auth/discogs/disconnect' +import { Route as ApiAuthDiscogsDebugRouteImport } from './app/api/auth/discogs/debug' import { Route as ApiExternalDiscogsReleaseIdRouteImport } from './app/api/external/discogs/release/$id' const WaitlistRoute = WaitlistRouteImport.update({ @@ -137,6 +138,11 @@ const ApiAuthDiscogsDisconnectRoute = path: '/api/auth/discogs/disconnect', getParentRoute: () => rootRouteImport, } as any) +const ApiAuthDiscogsDebugRoute = ApiAuthDiscogsDebugRouteImport.update({ + id: '/api/auth/discogs/debug', + path: '/api/auth/discogs/debug', + getParentRoute: () => rootRouteImport, +} as any) const ApiExternalDiscogsReleaseIdRoute = ApiExternalDiscogsReleaseIdRouteImport.update({ id: '/api/external/discogs/release/$id', @@ -159,6 +165,7 @@ export interface FileRoutesByFullPath { '/$username/settings/connections': typeof UsernameSettingsConnectionsRoute '/api/ai/chat': typeof ApiAiChatRoute '/$username/settings': typeof UsernameSettingsIndexRoute + '/api/auth/discogs/debug': typeof ApiAuthDiscogsDebugRoute '/api/auth/discogs/disconnect': typeof ApiAuthDiscogsDisconnectRoute '/api/auth/discogs/request-token': typeof ApiAuthDiscogsRequestTokenRoute '/api/auth/discogs/status': typeof ApiAuthDiscogsStatusRoute @@ -182,6 +189,7 @@ export interface FileRoutesByTo { '/$username/settings/connections': typeof UsernameSettingsConnectionsRoute '/api/ai/chat': typeof ApiAiChatRoute '/$username/settings': typeof UsernameSettingsIndexRoute + '/api/auth/discogs/debug': typeof ApiAuthDiscogsDebugRoute '/api/auth/discogs/disconnect': typeof ApiAuthDiscogsDisconnectRoute '/api/auth/discogs/request-token': typeof ApiAuthDiscogsRequestTokenRoute '/api/auth/discogs/status': typeof ApiAuthDiscogsStatusRoute @@ -206,6 +214,7 @@ export interface FileRoutesById { '/$username/settings/connections': typeof UsernameSettingsConnectionsRoute '/api/ai/chat': typeof ApiAiChatRoute '/$username/settings/': typeof UsernameSettingsIndexRoute + '/api/auth/discogs/debug': typeof ApiAuthDiscogsDebugRoute '/api/auth/discogs/disconnect': typeof ApiAuthDiscogsDisconnectRoute '/api/auth/discogs/request-token': typeof ApiAuthDiscogsRequestTokenRoute '/api/auth/discogs/status': typeof ApiAuthDiscogsStatusRoute @@ -231,6 +240,7 @@ export interface FileRouteTypes { | '/$username/settings/connections' | '/api/ai/chat' | '/$username/settings' + | '/api/auth/discogs/debug' | '/api/auth/discogs/disconnect' | '/api/auth/discogs/request-token' | '/api/auth/discogs/status' @@ -254,6 +264,7 @@ export interface FileRouteTypes { | '/$username/settings/connections' | '/api/ai/chat' | '/$username/settings' + | '/api/auth/discogs/debug' | '/api/auth/discogs/disconnect' | '/api/auth/discogs/request-token' | '/api/auth/discogs/status' @@ -277,6 +288,7 @@ export interface FileRouteTypes { | '/$username/settings/connections' | '/api/ai/chat' | '/$username/settings/' + | '/api/auth/discogs/debug' | '/api/auth/discogs/disconnect' | '/api/auth/discogs/request-token' | '/api/auth/discogs/status' @@ -300,6 +312,7 @@ export interface RootRouteChildren { UsernameSettingsConnectionsRoute: typeof UsernameSettingsConnectionsRoute ApiAiChatRoute: typeof ApiAiChatRoute UsernameSettingsIndexRoute: typeof UsernameSettingsIndexRoute + ApiAuthDiscogsDebugRoute: typeof ApiAuthDiscogsDebugRoute ApiAuthDiscogsDisconnectRoute: typeof ApiAuthDiscogsDisconnectRoute ApiAuthDiscogsRequestTokenRoute: typeof ApiAuthDiscogsRequestTokenRoute ApiAuthDiscogsStatusRoute: typeof ApiAuthDiscogsStatusRoute @@ -451,6 +464,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ApiAuthDiscogsDisconnectRouteImport parentRoute: typeof rootRouteImport } + '/api/auth/discogs/debug': { + id: '/api/auth/discogs/debug' + path: '/api/auth/discogs/debug' + fullPath: '/api/auth/discogs/debug' + preLoaderRoute: typeof ApiAuthDiscogsDebugRouteImport + parentRoute: typeof rootRouteImport + } '/api/external/discogs/release/$id': { id: '/api/external/discogs/release/$id' path: '/api/external/discogs/release/$id' @@ -486,6 +506,7 @@ const rootRouteChildren: RootRouteChildren = { UsernameSettingsConnectionsRoute: UsernameSettingsConnectionsRoute, ApiAiChatRoute: ApiAiChatRoute, UsernameSettingsIndexRoute: UsernameSettingsIndexRoute, + ApiAuthDiscogsDebugRoute: ApiAuthDiscogsDebugRoute, ApiAuthDiscogsDisconnectRoute: ApiAuthDiscogsDisconnectRoute, ApiAuthDiscogsRequestTokenRoute: ApiAuthDiscogsRequestTokenRoute, ApiAuthDiscogsStatusRoute: ApiAuthDiscogsStatusRoute, From f2196f845a316b7bb143f01c7ca477c8742ec8dd Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:29:38 -0500 Subject: [PATCH 07/48] fix: use wrangler-action secrets param for Worker secrets The separate "Set Worker Secrets" steps were not working - secrets were not being set on the Workers. Using the built-in secrets parameter in wrangler-action which handles this properly. Maps GitHub secrets VITE_DISCOGS_CONSUMER_KEY and VITE_DISCOGS_CONSUMER_SECRET to DISCOGS_CONSUMER_KEY and DISCOGS_CONSUMER_SECRET for the Worker. --- .github/workflows/deploy-preview.yaml | 12 +++++------- .github/workflows/deploy-production.yaml | 12 +++++------- .github/workflows/deploy-staging.yaml | 12 +++++------- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/.github/workflows/deploy-preview.yaml b/.github/workflows/deploy-preview.yaml index 43710d5..be223aa 100644 --- a/.github/workflows/deploy-preview.yaml +++ b/.github/workflows/deploy-preview.yaml @@ -49,14 +49,12 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy --name crate-app-pr-${{ github.event.pull_request.number }} - - - name: Set Worker Secrets + secrets: | + DISCOGS_CONSUMER_KEY + DISCOGS_CONSUMER_SECRET env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - run: | - echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | npx wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app-pr-${{ github.event.pull_request.number }} - echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | npx wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app-pr-${{ github.event.pull_request.number }} + DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} + DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} - name: Comment PR with Preview URL uses: actions/github-script@v7 diff --git a/.github/workflows/deploy-production.yaml b/.github/workflows/deploy-production.yaml index b1b9845..529115e 100644 --- a/.github/workflows/deploy-production.yaml +++ b/.github/workflows/deploy-production.yaml @@ -53,12 +53,10 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy - - - name: Set Worker Secrets (Production) + secrets: | + DISCOGS_CONSUMER_KEY + DISCOGS_CONSUMER_SECRET env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - run: | - echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | npx wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app - echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | npx wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app + DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} + DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} diff --git a/.github/workflows/deploy-staging.yaml b/.github/workflows/deploy-staging.yaml index ac663ef..8fa50ef 100644 --- a/.github/workflows/deploy-staging.yaml +++ b/.github/workflows/deploy-staging.yaml @@ -53,12 +53,10 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy - - - name: Set Worker Secrets (Staging) + secrets: | + DISCOGS_CONSUMER_KEY + DISCOGS_CONSUMER_SECRET env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - run: | - echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | npx wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app - echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | npx wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app + DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} + DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} From 18b5510b6843ec42d14972a4d0be3f9da024f774 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:35:30 -0500 Subject: [PATCH 08/48] fix: use postCommands to set secrets with correct worker name The wrangler-action secrets parameter doesn't pass the --name flag, so secrets were being set on the default worker instead of the PR-specific worker. Using postCommands to explicitly run wrangler secret put with the correct --name flag. --- .github/workflows/deploy-preview.yaml | 6 +++--- .github/workflows/deploy-production.yaml | 6 +++--- .github/workflows/deploy-staging.yaml | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/deploy-preview.yaml b/.github/workflows/deploy-preview.yaml index be223aa..4c92135 100644 --- a/.github/workflows/deploy-preview.yaml +++ b/.github/workflows/deploy-preview.yaml @@ -49,9 +49,9 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy --name crate-app-pr-${{ github.event.pull_request.number }} - secrets: | - DISCOGS_CONSUMER_KEY - DISCOGS_CONSUMER_SECRET + postCommands: | + echo "$DISCOGS_CONSUMER_KEY" | wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app-pr-${{ github.event.pull_request.number }} + echo "$DISCOGS_CONSUMER_SECRET" | wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app-pr-${{ github.event.pull_request.number }} env: DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} diff --git a/.github/workflows/deploy-production.yaml b/.github/workflows/deploy-production.yaml index 529115e..cd75dcb 100644 --- a/.github/workflows/deploy-production.yaml +++ b/.github/workflows/deploy-production.yaml @@ -53,9 +53,9 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy - secrets: | - DISCOGS_CONSUMER_KEY - DISCOGS_CONSUMER_SECRET + postCommands: | + echo "$DISCOGS_CONSUMER_KEY" | wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app + echo "$DISCOGS_CONSUMER_SECRET" | wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app env: DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} diff --git a/.github/workflows/deploy-staging.yaml b/.github/workflows/deploy-staging.yaml index 8fa50ef..98ad420 100644 --- a/.github/workflows/deploy-staging.yaml +++ b/.github/workflows/deploy-staging.yaml @@ -53,9 +53,9 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy - secrets: | - DISCOGS_CONSUMER_KEY - DISCOGS_CONSUMER_SECRET + postCommands: | + echo "$DISCOGS_CONSUMER_KEY" | wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app + echo "$DISCOGS_CONSUMER_SECRET" | wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app env: DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} From 0595c81ba0af60e61ac60cf2c889d87f2cfd99a8 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:38:43 -0500 Subject: [PATCH 09/48] fix: install wrangler globally for postCommands --- .github/workflows/deploy-preview.yaml | 3 +++ .github/workflows/deploy-production.yaml | 3 +++ .github/workflows/deploy-staging.yaml | 3 +++ 3 files changed, 9 insertions(+) diff --git a/.github/workflows/deploy-preview.yaml b/.github/workflows/deploy-preview.yaml index 4c92135..4c711a5 100644 --- a/.github/workflows/deploy-preview.yaml +++ b/.github/workflows/deploy-preview.yaml @@ -41,6 +41,9 @@ jobs: - name: Clean wrangler cache run: rm -rf .wrangler + - name: Install Wrangler CLI + run: npm install -g wrangler + - name: Deploy Preview to Cloudflare Workers id: deploy uses: cloudflare/wrangler-action@v3 diff --git a/.github/workflows/deploy-production.yaml b/.github/workflows/deploy-production.yaml index cd75dcb..15d3c67 100644 --- a/.github/workflows/deploy-production.yaml +++ b/.github/workflows/deploy-production.yaml @@ -46,6 +46,9 @@ jobs: - name: Clean wrangler cache run: rm -rf .wrangler + - name: Install Wrangler CLI + run: npm install -g wrangler + - name: Deploy to Cloudflare Workers (Production) uses: cloudflare/wrangler-action@v3 with: diff --git a/.github/workflows/deploy-staging.yaml b/.github/workflows/deploy-staging.yaml index 98ad420..2fb1981 100644 --- a/.github/workflows/deploy-staging.yaml +++ b/.github/workflows/deploy-staging.yaml @@ -46,6 +46,9 @@ jobs: - name: Clean wrangler cache run: rm -rf .wrangler + - name: Install Wrangler CLI + run: npm install -g wrangler + - name: Deploy to Cloudflare Workers (Staging) uses: cloudflare/wrangler-action@v3 with: From 40e9fd1711bbab0331e1ea28e03166e35fddebec Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:46:30 -0500 Subject: [PATCH 10/48] fix: use separate step for setting worker secrets --- .github/workflows/deploy-preview.yaml | 12 +++++++----- .github/workflows/deploy-production.yaml | 12 +++++++----- .github/workflows/deploy-staging.yaml | 12 +++++++----- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/.github/workflows/deploy-preview.yaml b/.github/workflows/deploy-preview.yaml index 4c711a5..d9e2394 100644 --- a/.github/workflows/deploy-preview.yaml +++ b/.github/workflows/deploy-preview.yaml @@ -52,12 +52,14 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy --name crate-app-pr-${{ github.event.pull_request.number }} - postCommands: | - echo "$DISCOGS_CONSUMER_KEY" | wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app-pr-${{ github.event.pull_request.number }} - echo "$DISCOGS_CONSUMER_SECRET" | wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app-pr-${{ github.event.pull_request.number }} + + - name: Set Worker Secrets env: - DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} - DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: | + echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app-pr-${{ github.event.pull_request.number }} + echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app-pr-${{ github.event.pull_request.number }} - name: Comment PR with Preview URL uses: actions/github-script@v7 diff --git a/.github/workflows/deploy-production.yaml b/.github/workflows/deploy-production.yaml index 15d3c67..cb20ccf 100644 --- a/.github/workflows/deploy-production.yaml +++ b/.github/workflows/deploy-production.yaml @@ -56,10 +56,12 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy - postCommands: | - echo "$DISCOGS_CONSUMER_KEY" | wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app - echo "$DISCOGS_CONSUMER_SECRET" | wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app + + - name: Set Worker Secrets env: - DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} - DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: | + echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app + echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app diff --git a/.github/workflows/deploy-staging.yaml b/.github/workflows/deploy-staging.yaml index 2fb1981..ae3beb4 100644 --- a/.github/workflows/deploy-staging.yaml +++ b/.github/workflows/deploy-staging.yaml @@ -56,10 +56,12 @@ jobs: accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server command: deploy - postCommands: | - echo "$DISCOGS_CONSUMER_KEY" | wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app - echo "$DISCOGS_CONSUMER_SECRET" | wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app + + - name: Set Worker Secrets env: - DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} - DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + run: | + echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app + echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app From 6f0077498a4b9568c984725474bbcfb6574bf19f Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:56:00 -0500 Subject: [PATCH 11/48] debug: check cloudflare env bindings for secrets --- app/api/auth/discogs/debug.ts | 56 ++++++++++++++++++++++-------- lib/api-clients/youtube/service.ts | 2 +- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/app/api/auth/discogs/debug.ts b/app/api/auth/discogs/debug.ts index aa36969..47bf4a6 100644 --- a/app/api/auth/discogs/debug.ts +++ b/app/api/auth/discogs/debug.ts @@ -1,4 +1,5 @@ import { createFileRoute } from '@tanstack/react-router'; +import { getEvent } from 'vinxi/http'; export const Route = createFileRoute('/api/auth/discogs/debug')({ server: { @@ -6,24 +7,49 @@ export const Route = createFileRoute('/api/auth/discogs/debug')({ GET: async ({ request }) => { const origin = new URL(request.url).origin; + // Try to get Cloudflare env from the event context + let cloudflareEnv: Record | null = null; + try { + const event = getEvent(); + // Cloudflare Workers adapter puts env in context.cloudflare.env + cloudflareEnv = (event?.context as any)?.cloudflare?.env || null; + } catch (e) { + // getEvent might not be available + } + // Check what environment variables are available const debugInfo = { origin, - hasDiscogsKey: !!process.env.DISCOGS_CONSUMER_KEY, - discogsKeyLength: process.env.DISCOGS_CONSUMER_KEY?.length || 0, - hasDiscogsSecret: !!process.env.DISCOGS_CONSUMER_SECRET, - discogsSecretLength: process.env.DISCOGS_CONSUMER_SECRET?.length || 0, - hasViteDiscogsKey: !!process.env.VITE_DISCOGS_CONSUMER_KEY, - viteDiscogsKeyLength: - process.env.VITE_DISCOGS_CONSUMER_KEY?.length || 0, - hasViteDiscogsSecret: !!process.env.VITE_DISCOGS_CONSUMER_SECRET, - viteDiscogsSecretLength: - process.env.VITE_DISCOGS_CONSUMER_SECRET?.length || 0, - nodeEnv: process.env.NODE_ENV, - // Check first 4 chars of key to verify it's correct (safe to expose partial) - keyPrefix: process.env.DISCOGS_CONSUMER_KEY?.substring(0, 4) || 'N/A', - viteKeyPrefix: - process.env.VITE_DISCOGS_CONSUMER_KEY?.substring(0, 4) || 'N/A', + // process.env (build-time only in Workers) + processEnv: { + hasDiscogsKey: !!process.env.DISCOGS_CONSUMER_KEY, + discogsKeyLength: process.env.DISCOGS_CONSUMER_KEY?.length || 0, + hasDiscogsSecret: !!process.env.DISCOGS_CONSUMER_SECRET, + discogsSecretLength: + process.env.DISCOGS_CONSUMER_SECRET?.length || 0, + hasViteDiscogsKey: !!process.env.VITE_DISCOGS_CONSUMER_KEY, + viteDiscogsKeyLength: + process.env.VITE_DISCOGS_CONSUMER_KEY?.length || 0, + hasViteDiscogsSecret: !!process.env.VITE_DISCOGS_CONSUMER_SECRET, + viteDiscogsSecretLength: + process.env.VITE_DISCOGS_CONSUMER_SECRET?.length || 0, + nodeEnv: process.env.NODE_ENV, + }, + // Cloudflare env bindings (runtime secrets) + cloudflareEnv: cloudflareEnv + ? { + hasDiscogsKey: !!(cloudflareEnv as any).DISCOGS_CONSUMER_KEY, + discogsKeyLength: + ((cloudflareEnv as any).DISCOGS_CONSUMER_KEY as string) + ?.length || 0, + hasDiscogsSecret: !!(cloudflareEnv as any) + .DISCOGS_CONSUMER_SECRET, + discogsSecretLength: + ((cloudflareEnv as any).DISCOGS_CONSUMER_SECRET as string) + ?.length || 0, + availableKeys: Object.keys(cloudflareEnv), + } + : 'not available', }; return Response.json(debugInfo); diff --git a/lib/api-clients/youtube/service.ts b/lib/api-clients/youtube/service.ts index e71cc7b..48bacca 100644 --- a/lib/api-clients/youtube/service.ts +++ b/lib/api-clients/youtube/service.ts @@ -20,7 +20,7 @@ export async function searchVideo(query: string): Promise { ); if (!response.ok) throw new Error('YouTube search failed'); - const data = await response.json(); + const data = (await response.json()) as { videoId: string }; return data.videoId; } catch (err) { console.error('YouTube search failed:', err); From bef9159589f3afe2813fe3e17a36463b4da45733 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 00:59:30 -0500 Subject: [PATCH 12/48] fix: expose Cloudflare env bindings to process.env in worker entry --- app/api/auth/discogs/debug.ts | 51 +++++++++++++++++++++-------------- entry-worker.js | 10 +++++++ 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/app/api/auth/discogs/debug.ts b/app/api/auth/discogs/debug.ts index 47bf4a6..2af7317 100644 --- a/app/api/auth/discogs/debug.ts +++ b/app/api/auth/discogs/debug.ts @@ -7,46 +7,57 @@ export const Route = createFileRoute('/api/auth/discogs/debug')({ GET: async ({ request }) => { const origin = new URL(request.url).origin; - // Try to get Cloudflare env from the event context + // Try multiple ways to access Cloudflare env + let eventInfo: Record = {}; let cloudflareEnv: Record | null = null; + try { const event = getEvent(); - // Cloudflare Workers adapter puts env in context.cloudflare.env - cloudflareEnv = (event?.context as any)?.cloudflare?.env || null; - } catch (e) { - // getEvent might not be available + // Explore the event structure + eventInfo = { + hasEvent: !!event, + contextKeys: event?.context ? Object.keys(event.context) : [], + // Check various possible locations + hasCloudflare: !!(event?.context as any)?.cloudflare, + hasCf: !!(event?.context as any)?.cf, + hasEnv: !!(event?.context as any)?.env, + hasPlatform: !!(event?.context as any)?.platform, + // Check nested + cloudflareKeys: (event?.context as any)?.cloudflare + ? Object.keys((event.context as any).cloudflare) + : [], + }; + + // Try different paths + cloudflareEnv = + (event?.context as any)?.cloudflare?.env || + (event?.context as any)?.env || + (event?.context as any)?.cf?.env || + null; + } catch (e: any) { + eventInfo = { error: e.message }; } // Check what environment variables are available const debugInfo = { origin, - // process.env (build-time only in Workers) + eventInfo, processEnv: { hasDiscogsKey: !!process.env.DISCOGS_CONSUMER_KEY, - discogsKeyLength: process.env.DISCOGS_CONSUMER_KEY?.length || 0, hasDiscogsSecret: !!process.env.DISCOGS_CONSUMER_SECRET, - discogsSecretLength: - process.env.DISCOGS_CONSUMER_SECRET?.length || 0, hasViteDiscogsKey: !!process.env.VITE_DISCOGS_CONSUMER_KEY, - viteDiscogsKeyLength: - process.env.VITE_DISCOGS_CONSUMER_KEY?.length || 0, hasViteDiscogsSecret: !!process.env.VITE_DISCOGS_CONSUMER_SECRET, - viteDiscogsSecretLength: - process.env.VITE_DISCOGS_CONSUMER_SECRET?.length || 0, nodeEnv: process.env.NODE_ENV, + // List all env keys (to see what's available) + allKeys: Object.keys(process.env).filter( + (k) => !k.startsWith('npm_'), + ), }, - // Cloudflare env bindings (runtime secrets) cloudflareEnv: cloudflareEnv ? { hasDiscogsKey: !!(cloudflareEnv as any).DISCOGS_CONSUMER_KEY, - discogsKeyLength: - ((cloudflareEnv as any).DISCOGS_CONSUMER_KEY as string) - ?.length || 0, hasDiscogsSecret: !!(cloudflareEnv as any) .DISCOGS_CONSUMER_SECRET, - discogsSecretLength: - ((cloudflareEnv as any).DISCOGS_CONSUMER_SECRET as string) - ?.length || 0, availableKeys: Object.keys(cloudflareEnv), } : 'not available', diff --git a/entry-worker.js b/entry-worker.js index ba0e429..56fae1f 100644 --- a/entry-worker.js +++ b/entry-worker.js @@ -2,6 +2,16 @@ import server from './dist/server/server.js'; export default { async fetch(req, env, ctx) { + // Expose Cloudflare secrets/env bindings to process.env + // This makes them accessible via process.env in route handlers + if (env) { + for (const [key, value] of Object.entries(env)) { + if (typeof value === 'string') { + process.env[key] = value; + } + } + } + // Forward the request to the TanStack Start server handler const res = await server.fetch(req, env); From f235c74f4a14ddf2b78a379ab5e372f1538a24bd Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 01:04:53 -0500 Subject: [PATCH 13/48] fix: use cloudflare:workers import for accessing bindings This is the official way to access Cloudflare bindings in TanStack Start. See: https://developers.cloudflare.com/workers/frameworks/framework-guides/tanstack-start/ --- app/api/auth/discogs/debug.ts | 65 ++++++++++------------------------- entry-worker.js | 21 ++++------- 2 files changed, 24 insertions(+), 62 deletions(-) diff --git a/app/api/auth/discogs/debug.ts b/app/api/auth/discogs/debug.ts index 2af7317..18a7445 100644 --- a/app/api/auth/discogs/debug.ts +++ b/app/api/auth/discogs/debug.ts @@ -1,5 +1,5 @@ import { createFileRoute } from '@tanstack/react-router'; -import { getEvent } from 'vinxi/http'; +import { env } from 'cloudflare:workers'; export const Route = createFileRoute('/api/auth/discogs/debug')({ server: { @@ -7,60 +7,31 @@ export const Route = createFileRoute('/api/auth/discogs/debug')({ GET: async ({ request }) => { const origin = new URL(request.url).origin; - // Try multiple ways to access Cloudflare env - let eventInfo: Record = {}; - let cloudflareEnv: Record | null = null; + // Access Cloudflare bindings the official way + const cloudflareEnv = env as Record; - try { - const event = getEvent(); - // Explore the event structure - eventInfo = { - hasEvent: !!event, - contextKeys: event?.context ? Object.keys(event.context) : [], - // Check various possible locations - hasCloudflare: !!(event?.context as any)?.cloudflare, - hasCf: !!(event?.context as any)?.cf, - hasEnv: !!(event?.context as any)?.env, - hasPlatform: !!(event?.context as any)?.platform, - // Check nested - cloudflareKeys: (event?.context as any)?.cloudflare - ? Object.keys((event.context as any).cloudflare) - : [], - }; - - // Try different paths - cloudflareEnv = - (event?.context as any)?.cloudflare?.env || - (event?.context as any)?.env || - (event?.context as any)?.cf?.env || - null; - } catch (e: any) { - eventInfo = { error: e.message }; - } - - // Check what environment variables are available const debugInfo = { origin, - eventInfo, + // Cloudflare env bindings (the correct way) + cloudflareEnv: { + hasDiscogsKey: !!cloudflareEnv.DISCOGS_CONSUMER_KEY, + discogsKeyLength: + (cloudflareEnv.DISCOGS_CONSUMER_KEY as string)?.length || 0, + hasDiscogsSecret: !!cloudflareEnv.DISCOGS_CONSUMER_SECRET, + discogsSecretLength: + (cloudflareEnv.DISCOGS_CONSUMER_SECRET as string)?.length || 0, + availableKeys: Object.keys(cloudflareEnv), + // Show first 4 chars to verify correct key + keyPrefix: + (cloudflareEnv.DISCOGS_CONSUMER_KEY as string)?.substring(0, 4) || + 'N/A', + }, + // process.env (build-time only) processEnv: { - hasDiscogsKey: !!process.env.DISCOGS_CONSUMER_KEY, - hasDiscogsSecret: !!process.env.DISCOGS_CONSUMER_SECRET, hasViteDiscogsKey: !!process.env.VITE_DISCOGS_CONSUMER_KEY, hasViteDiscogsSecret: !!process.env.VITE_DISCOGS_CONSUMER_SECRET, nodeEnv: process.env.NODE_ENV, - // List all env keys (to see what's available) - allKeys: Object.keys(process.env).filter( - (k) => !k.startsWith('npm_'), - ), }, - cloudflareEnv: cloudflareEnv - ? { - hasDiscogsKey: !!(cloudflareEnv as any).DISCOGS_CONSUMER_KEY, - hasDiscogsSecret: !!(cloudflareEnv as any) - .DISCOGS_CONSUMER_SECRET, - availableKeys: Object.keys(cloudflareEnv), - } - : 'not available', }; return Response.json(debugInfo); diff --git a/entry-worker.js b/entry-worker.js index 56fae1f..97925b0 100644 --- a/entry-worker.js +++ b/entry-worker.js @@ -1,23 +1,14 @@ +// NOTE: This file is NOT used in production. +// TanStack Start uses @tanstack/react-start/server-entry as the Worker entry point. +// Access Cloudflare bindings via: import { env } from 'cloudflare:workers' +// +// This file is kept for reference only. + import server from './dist/server/server.js'; export default { async fetch(req, env, ctx) { - // Expose Cloudflare secrets/env bindings to process.env - // This makes them accessible via process.env in route handlers - if (env) { - for (const [key, value] of Object.entries(env)) { - if (typeof value === 'string') { - process.env[key] = value; - } - } - } - - // Forward the request to the TanStack Start server handler const res = await server.fetch(req, env); - - // Cloudflare Workers strictly require a native Response object. - // The polyfilled Response from the server build might fail the internal checks. - // We explicitly reconstruct a native Response if needed. return new Response(res.body, { status: res.status, statusText: res.statusText, From 4ee3d009be11939aafa9851ac993cafe050d0b9e Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 01:08:55 -0500 Subject: [PATCH 14/48] feat: update all Discogs API code to use cloudflare:workers bindings All API routes and the discogs lib now use the official Cloudflare way to access secrets: import { env } from 'cloudflare:workers' --- app/api/auth/discogs/request-token.ts | 9 +++------ app/api/external/discogs/search.ts | 8 ++------ lib/api-clients/discogs/index.ts | 23 ++++++++++++----------- 3 files changed, 17 insertions(+), 23 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index fb7bc5f..f76a3a1 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -1,6 +1,7 @@ import { createFileRoute } from '@tanstack/react-router'; import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { serialize } from 'cookie'; +import { env } from 'cloudflare:workers'; // Allowed origins for OAuth redirects (security allowlist) const ALLOWED_ORIGINS = [ @@ -29,13 +30,9 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const sdk = new DiscogsSDK({ DiscogsConsumerKey: - process.env.DISCOGS_CONSUMER_KEY || - process.env.VITE_DISCOGS_CONSUMER_KEY || - '', + (env as Record).DISCOGS_CONSUMER_KEY || '', DiscogsConsumerSecret: - process.env.DISCOGS_CONSUMER_SECRET || - process.env.VITE_DISCOGS_CONSUMER_SECRET || - '', + (env as Record).DISCOGS_CONSUMER_SECRET || '', callbackUrl: `${baseUrl}/api/auth/discogs/callback`, userAgent: 'CrateApp/1.0 +https://crate.ai', debug: false, diff --git a/app/api/external/discogs/search.ts b/app/api/external/discogs/search.ts index aaddfc5..2546034 100644 --- a/app/api/external/discogs/search.ts +++ b/app/api/external/discogs/search.ts @@ -59,13 +59,9 @@ export const Route = createFileRoute('/api/external/discogs/search')({ const sdk = new DiscogsSDK({ DiscogsConsumerKey: - process.env.DISCOGS_CONSUMER_KEY || - process.env.VITE_DISCOGS_CONSUMER_KEY || - '', + (env as Record).DISCOGS_CONSUMER_KEY || '', DiscogsConsumerSecret: - process.env.DISCOGS_CONSUMER_SECRET || - process.env.VITE_DISCOGS_CONSUMER_SECRET || - '', + (env as Record).DISCOGS_CONSUMER_SECRET || '', userAgent: 'CrateApp/1.0 +https://crate.ai', }); diff --git a/lib/api-clients/discogs/index.ts b/lib/api-clients/discogs/index.ts index bffb97e..99769c6 100644 --- a/lib/api-clients/discogs/index.ts +++ b/lib/api-clients/discogs/index.ts @@ -1,17 +1,17 @@ import { Release } from '@/lib/types'; import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { rateLimiter } from '@/lib/utils/rateLimiter'; - -const discogs = new DiscogsSDK({ - DiscogsConsumerKey: - process.env.DISCOGS_CONSUMER_KEY || - process.env.VITE_DISCOGS_CONSUMER_KEY || - '', - DiscogsConsumerSecret: - process.env.DISCOGS_CONSUMER_SECRET || - process.env.VITE_DISCOGS_CONSUMER_SECRET || - '', -}); +import { env } from 'cloudflare:workers'; + +// Create SDK instance lazily (bindings only available during request handling) +function getDiscogsSDK() { + return new DiscogsSDK({ + DiscogsConsumerKey: + (env as Record).DISCOGS_CONSUMER_KEY || '', + DiscogsConsumerSecret: + (env as Record).DISCOGS_CONSUMER_SECRET || '', + }); +} export const fetchUserDetails = async (username: string) => { const resourceUrl = `https://api.discogs.com/users/${username}`; @@ -29,6 +29,7 @@ export const fetchUserCollection = async ( perPage = 50, folderId = 0, ) => { + const discogs = getDiscogsSDK(); const collection = await discogs.collection.getCollection({ username, page: 1, // Fetch the first page for now From babf7ab6549c8f8854a9e68c5d453635433e88f2 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 01:17:27 -0500 Subject: [PATCH 15/48] fix: add process.env fallback and .dev.vars for local development - cloudflare:workers bindings are empty in local dev - Added fallback to process.env for Discogs credentials - Created .dev.vars for local secrets (wrangler/miniflare) - Added .dev.vars to .gitignore Works in both environments: - Local dev: uses .dev.vars via miniflare - Production: uses cloudflare:workers bindings --- .gitignore | 1 + app/api/auth/discogs/request-token.ts | 12 ++++++++++-- app/api/external/discogs/search.ts | 12 ++++++++++-- lib/api-clients/discogs/index.ts | 12 ++++++++++-- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 52432bb..8540767 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,4 @@ context-repos/ # Cursor IDE rules .cursor/ +.dev.vars diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index f76a3a1..ca8d5ca 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -28,11 +28,19 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ try { const baseUrl = getValidatedOrigin(request.url); + // Use Cloudflare env bindings (production) or process.env (local dev) + const cfEnv = env as Record; const sdk = new DiscogsSDK({ DiscogsConsumerKey: - (env as Record).DISCOGS_CONSUMER_KEY || '', + cfEnv.DISCOGS_CONSUMER_KEY || + process.env.DISCOGS_CONSUMER_KEY || + process.env.VITE_DISCOGS_CONSUMER_KEY || + '', DiscogsConsumerSecret: - (env as Record).DISCOGS_CONSUMER_SECRET || '', + cfEnv.DISCOGS_CONSUMER_SECRET || + process.env.DISCOGS_CONSUMER_SECRET || + process.env.VITE_DISCOGS_CONSUMER_SECRET || + '', callbackUrl: `${baseUrl}/api/auth/discogs/callback`, userAgent: 'CrateApp/1.0 +https://crate.ai', debug: false, diff --git a/app/api/external/discogs/search.ts b/app/api/external/discogs/search.ts index 2546034..8031f44 100644 --- a/app/api/external/discogs/search.ts +++ b/app/api/external/discogs/search.ts @@ -57,11 +57,19 @@ export const Route = createFileRoute('/api/external/discogs/search')({ ); } + // Use Cloudflare env bindings (production) or process.env (local dev) + const cfEnv = env as Record; const sdk = new DiscogsSDK({ DiscogsConsumerKey: - (env as Record).DISCOGS_CONSUMER_KEY || '', + cfEnv.DISCOGS_CONSUMER_KEY || + process.env.DISCOGS_CONSUMER_KEY || + process.env.VITE_DISCOGS_CONSUMER_KEY || + '', DiscogsConsumerSecret: - (env as Record).DISCOGS_CONSUMER_SECRET || '', + cfEnv.DISCOGS_CONSUMER_SECRET || + process.env.DISCOGS_CONSUMER_SECRET || + process.env.VITE_DISCOGS_CONSUMER_SECRET || + '', userAgent: 'CrateApp/1.0 +https://crate.ai', }); diff --git a/lib/api-clients/discogs/index.ts b/lib/api-clients/discogs/index.ts index 99769c6..b617577 100644 --- a/lib/api-clients/discogs/index.ts +++ b/lib/api-clients/discogs/index.ts @@ -5,11 +5,19 @@ import { env } from 'cloudflare:workers'; // Create SDK instance lazily (bindings only available during request handling) function getDiscogsSDK() { + // Use Cloudflare env bindings (production) or process.env (local dev) + const cfEnv = env as Record; return new DiscogsSDK({ DiscogsConsumerKey: - (env as Record).DISCOGS_CONSUMER_KEY || '', + cfEnv.DISCOGS_CONSUMER_KEY || + process.env.DISCOGS_CONSUMER_KEY || + process.env.VITE_DISCOGS_CONSUMER_KEY || + '', DiscogsConsumerSecret: - (env as Record).DISCOGS_CONSUMER_SECRET || '', + cfEnv.DISCOGS_CONSUMER_SECRET || + process.env.DISCOGS_CONSUMER_SECRET || + process.env.VITE_DISCOGS_CONSUMER_SECRET || + '', }); } From 2b0e1b50f8f544d448a69ccd6c2f842cfe72b196 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 01:20:57 -0500 Subject: [PATCH 16/48] refactor: centralize Discogs env config and SDK creation - Created lib/config/env.ts for centralized env variable access - Created lib/config/discogs.ts for SDK factory - Updated all API routes to use createDiscogsSDK() - Removed duplicate 8-line fallback logic from 5 files - Added proper TypeScript types for env variables Benefits: - DRY: env logic in ONE place - Type-safe: CloudflareEnv type defines available secrets - Maintainable: adding secrets = update one file - Testable: can mock createDiscogsSDK in tests --- app/api/auth/discogs/debug.ts | 37 +++++++----------- app/api/auth/discogs/request-token.ts | 19 +-------- app/api/external/discogs/search.ts | 17 +-------- lib/api-clients/discogs/index.ts | 22 +---------- lib/config/discogs.ts | 33 ++++++++++++++++ lib/config/env.ts | 55 +++++++++++++++++++++++++++ 6 files changed, 107 insertions(+), 76 deletions(-) create mode 100644 lib/config/discogs.ts create mode 100644 lib/config/env.ts diff --git a/app/api/auth/discogs/debug.ts b/app/api/auth/discogs/debug.ts index 18a7445..8cc834a 100644 --- a/app/api/auth/discogs/debug.ts +++ b/app/api/auth/discogs/debug.ts @@ -1,37 +1,28 @@ import { createFileRoute } from '@tanstack/react-router'; -import { env } from 'cloudflare:workers'; +import { + getDiscogsCredentials, + hasDiscogsCredentials, +} from '@/lib/config/env'; export const Route = createFileRoute('/api/auth/discogs/debug')({ server: { handlers: { GET: async ({ request }) => { const origin = new URL(request.url).origin; - - // Access Cloudflare bindings the official way - const cloudflareEnv = env as Record; + const { consumerKey, consumerSecret } = getDiscogsCredentials(); const debugInfo = { origin, - // Cloudflare env bindings (the correct way) - cloudflareEnv: { - hasDiscogsKey: !!cloudflareEnv.DISCOGS_CONSUMER_KEY, - discogsKeyLength: - (cloudflareEnv.DISCOGS_CONSUMER_KEY as string)?.length || 0, - hasDiscogsSecret: !!cloudflareEnv.DISCOGS_CONSUMER_SECRET, - discogsSecretLength: - (cloudflareEnv.DISCOGS_CONSUMER_SECRET as string)?.length || 0, - availableKeys: Object.keys(cloudflareEnv), - // Show first 4 chars to verify correct key - keyPrefix: - (cloudflareEnv.DISCOGS_CONSUMER_KEY as string)?.substring(0, 4) || - 'N/A', - }, - // process.env (build-time only) - processEnv: { - hasViteDiscogsKey: !!process.env.VITE_DISCOGS_CONSUMER_KEY, - hasViteDiscogsSecret: !!process.env.VITE_DISCOGS_CONSUMER_SECRET, - nodeEnv: process.env.NODE_ENV, + hasCredentials: hasDiscogsCredentials(), + credentials: { + hasConsumerKey: !!consumerKey, + consumerKeyLength: consumerKey?.length || 0, + hasConsumerSecret: !!consumerSecret, + consumerSecretLength: consumerSecret?.length || 0, + // Show first 4 chars to verify correct key (safe to expose) + keyPrefix: consumerKey?.substring(0, 4) || 'N/A', }, + environment: process.env.NODE_ENV, }; return Response.json(debugInfo); diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index ca8d5ca..3fee601 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -1,7 +1,6 @@ import { createFileRoute } from '@tanstack/react-router'; -import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { serialize } from 'cookie'; -import { env } from 'cloudflare:workers'; +import { createDiscogsSDK } from '@/lib/config/discogs'; // Allowed origins for OAuth redirects (security allowlist) const ALLOWED_ORIGINS = [ @@ -28,22 +27,8 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ try { const baseUrl = getValidatedOrigin(request.url); - // Use Cloudflare env bindings (production) or process.env (local dev) - const cfEnv = env as Record; - const sdk = new DiscogsSDK({ - DiscogsConsumerKey: - cfEnv.DISCOGS_CONSUMER_KEY || - process.env.DISCOGS_CONSUMER_KEY || - process.env.VITE_DISCOGS_CONSUMER_KEY || - '', - DiscogsConsumerSecret: - cfEnv.DISCOGS_CONSUMER_SECRET || - process.env.DISCOGS_CONSUMER_SECRET || - process.env.VITE_DISCOGS_CONSUMER_SECRET || - '', + const sdk = createDiscogsSDK({ callbackUrl: `${baseUrl}/api/auth/discogs/callback`, - userAgent: 'CrateApp/1.0 +https://crate.ai', - debug: false, }); const requestTokenResponse = await sdk.auth diff --git a/app/api/external/discogs/search.ts b/app/api/external/discogs/search.ts index 8031f44..1772c4b 100644 --- a/app/api/external/discogs/search.ts +++ b/app/api/external/discogs/search.ts @@ -1,5 +1,4 @@ import { createFileRoute } from '@tanstack/react-router'; -import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { parse } from 'cookie'; import type { SearchParams, SearchResult, SearchResponse } from '@/lib/types'; import { env } from 'cloudflare:workers'; @@ -57,21 +56,7 @@ export const Route = createFileRoute('/api/external/discogs/search')({ ); } - // Use Cloudflare env bindings (production) or process.env (local dev) - const cfEnv = env as Record; - const sdk = new DiscogsSDK({ - DiscogsConsumerKey: - cfEnv.DISCOGS_CONSUMER_KEY || - process.env.DISCOGS_CONSUMER_KEY || - process.env.VITE_DISCOGS_CONSUMER_KEY || - '', - DiscogsConsumerSecret: - cfEnv.DISCOGS_CONSUMER_SECRET || - process.env.DISCOGS_CONSUMER_SECRET || - process.env.VITE_DISCOGS_CONSUMER_SECRET || - '', - userAgent: 'CrateApp/1.0 +https://crate.ai', - }); + const sdk = createDiscogsSDK(); const tokenManager = sdk.auth.base.getTokenManager(); await tokenManager.setAccessToken(accessToken); diff --git a/lib/api-clients/discogs/index.ts b/lib/api-clients/discogs/index.ts index b617577..7381baa 100644 --- a/lib/api-clients/discogs/index.ts +++ b/lib/api-clients/discogs/index.ts @@ -1,25 +1,7 @@ import { Release } from '@/lib/types'; import { DiscogsSDK } from '@crate.ai/discogs-sdk'; import { rateLimiter } from '@/lib/utils/rateLimiter'; -import { env } from 'cloudflare:workers'; - -// Create SDK instance lazily (bindings only available during request handling) -function getDiscogsSDK() { - // Use Cloudflare env bindings (production) or process.env (local dev) - const cfEnv = env as Record; - return new DiscogsSDK({ - DiscogsConsumerKey: - cfEnv.DISCOGS_CONSUMER_KEY || - process.env.DISCOGS_CONSUMER_KEY || - process.env.VITE_DISCOGS_CONSUMER_KEY || - '', - DiscogsConsumerSecret: - cfEnv.DISCOGS_CONSUMER_SECRET || - process.env.DISCOGS_CONSUMER_SECRET || - process.env.VITE_DISCOGS_CONSUMER_SECRET || - '', - }); -} +import { createDiscogsSDK } from '@/lib/config/discogs'; export const fetchUserDetails = async (username: string) => { const resourceUrl = `https://api.discogs.com/users/${username}`; @@ -37,7 +19,7 @@ export const fetchUserCollection = async ( perPage = 50, folderId = 0, ) => { - const discogs = getDiscogsSDK(); + const discogs = createDiscogsSDK(); const collection = await discogs.collection.getCollection({ username, page: 1, // Fetch the first page for now diff --git a/lib/config/discogs.ts b/lib/config/discogs.ts new file mode 100644 index 0000000..486ba5b --- /dev/null +++ b/lib/config/discogs.ts @@ -0,0 +1,33 @@ +/** + * Centralized Discogs SDK factory + * + * Creates a properly configured DiscogsSDK instance with credentials + * from the environment (Cloudflare bindings or local dev) + */ + +import { DiscogsSDK } from '@crate.ai/discogs-sdk'; +import { getDiscogsCredentials } from './env'; + +export interface CreateDiscogsSDKOptions { + callbackUrl?: string; + userAgent?: string; +} + +const DEFAULT_USER_AGENT = 'CrateApp/1.0 +https://crate.ai'; + +/** + * Create a new DiscogsSDK instance with credentials from environment + * + * NOTE: Must be called during request handling (not at module init) + * because Cloudflare bindings are only available during requests + */ +export function createDiscogsSDK(options: CreateDiscogsSDKOptions = {}) { + const { consumerKey, consumerSecret } = getDiscogsCredentials(); + + return new DiscogsSDK({ + DiscogsConsumerKey: consumerKey, + DiscogsConsumerSecret: consumerSecret, + callbackUrl: options.callbackUrl, + userAgent: options.userAgent || DEFAULT_USER_AGENT, + }); +} diff --git a/lib/config/env.ts b/lib/config/env.ts new file mode 100644 index 0000000..6804316 --- /dev/null +++ b/lib/config/env.ts @@ -0,0 +1,55 @@ +/** + * Centralized environment configuration for Cloudflare Workers + local dev + * + * In production (Cloudflare Workers): secrets come from cloudflare:workers bindings + * In local dev: secrets come from .dev.vars (loaded by miniflare) + * + * This module handles the fallback logic in ONE place. + */ + +import { env as cloudflareEnv } from 'cloudflare:workers'; + +type CloudflareEnv = { + DISCOGS_CONSUMER_KEY?: string; + DISCOGS_CONSUMER_SECRET?: string; + // Add other secrets here as needed +}; + +/** + * Get an environment variable from Cloudflare bindings (production) + * or process.env (local dev fallback) + */ +function getEnvVar(key: keyof CloudflareEnv): string { + const cfEnv = cloudflareEnv as CloudflareEnv; + + // Try Cloudflare env first (production) + if (cfEnv[key]) { + return cfEnv[key]; + } + + // Fall back to process.env (local dev) + // Check both non-prefixed and VITE_ prefixed versions + return ( + process.env[key] || + process.env[`VITE_${key}`] || + '' + ); +} + +/** + * Discogs API credentials + */ +export function getDiscogsCredentials() { + return { + consumerKey: getEnvVar('DISCOGS_CONSUMER_KEY'), + consumerSecret: getEnvVar('DISCOGS_CONSUMER_SECRET'), + }; +} + +/** + * Check if Discogs credentials are configured + */ +export function hasDiscogsCredentials(): boolean { + const { consumerKey, consumerSecret } = getDiscogsCredentials(); + return Boolean(consumerKey && consumerSecret); +} From b701053be730f565e0c36600d80a3f83eea07e62 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 01:36:19 -0500 Subject: [PATCH 17/48] fix: localhost --- app/api/auth/discogs/debug.ts | 17 +++++- lib/config/discogs.ts | 67 ++++++++++++++++++++---- lib/config/env.ts | 98 +++++++++++++++++++++++++---------- package.json | 1 + tsconfig.json | 7 ++- worker-configuration.d.ts | 50 ++++++++++++++++++ wrangler.toml | 4 ++ 7 files changed, 205 insertions(+), 39 deletions(-) create mode 100644 worker-configuration.d.ts diff --git a/app/api/auth/discogs/debug.ts b/app/api/auth/discogs/debug.ts index 8cc834a..2df87b6 100644 --- a/app/api/auth/discogs/debug.ts +++ b/app/api/auth/discogs/debug.ts @@ -2,14 +2,27 @@ import { createFileRoute } from '@tanstack/react-router'; import { getDiscogsCredentials, hasDiscogsCredentials, + getEnvironment, + getCloudflareEnv, } from '@/lib/config/env'; +/** + * Debug endpoint for verifying Discogs credentials are properly configured. + * + * This endpoint is useful for: + * - Verifying secrets are loaded in production after deployment + * - Debugging local development setup + * - Checking .dev.vars is properly configured + * + * @route GET /api/auth/discogs/debug + */ export const Route = createFileRoute('/api/auth/discogs/debug')({ server: { handlers: { GET: async ({ request }) => { const origin = new URL(request.url).origin; const { consumerKey, consumerSecret } = getDiscogsCredentials(); + const cfEnv = getCloudflareEnv(); const debugInfo = { origin, @@ -22,7 +35,9 @@ export const Route = createFileRoute('/api/auth/discogs/debug')({ // Show first 4 chars to verify correct key (safe to expose) keyPrefix: consumerKey?.substring(0, 4) || 'N/A', }, - environment: process.env.NODE_ENV, + environment: getEnvironment() || 'not-set', + // List all available env keys (without values) for debugging + availableBindings: Object.keys(cfEnv), }; return Response.json(debugInfo); diff --git a/lib/config/discogs.ts b/lib/config/discogs.ts index 486ba5b..25128e8 100644 --- a/lib/config/discogs.ts +++ b/lib/config/discogs.ts @@ -1,33 +1,82 @@ /** - * Centralized Discogs SDK factory + * Discogs SDK Factory * - * Creates a properly configured DiscogsSDK instance with credentials - * from the environment (Cloudflare bindings or local dev) + * Provides a centralized factory for creating DiscogsSDK instances + * with proper credential loading from Cloudflare Workers environment. + * + * ## Usage + * + * ```typescript + * // In API route handlers: + * const sdk = createDiscogsSDK(); + * + * // With OAuth callback URL: + * const sdk = createDiscogsSDK({ + * callbackUrl: `${baseUrl}/api/auth/discogs/callback` + * }); + * ``` + * + * ## Important + * + * - Must be called inside request handlers (not at module level) + * - Cloudflare bindings are only available during request handling + * - Credentials come from `.dev.vars` (local) or `wrangler secret` (production) + * + * @module lib/config/discogs */ import { DiscogsSDK } from '@crate.ai/discogs-sdk'; -import { getDiscogsCredentials } from './env'; +import { getDiscogsCredentials, hasDiscogsCredentials } from './env'; +/** + * Options for creating a DiscogsSDK instance + */ export interface CreateDiscogsSDKOptions { + /** OAuth callback URL for authentication flow */ callbackUrl?: string; + /** Custom User-Agent header for API requests */ userAgent?: string; } +/** Default User-Agent identifying the application to Discogs */ const DEFAULT_USER_AGENT = 'CrateApp/1.0 +https://crate.ai'; /** - * Create a new DiscogsSDK instance with credentials from environment + * Create a new DiscogsSDK instance with credentials from environment. + * + * @param options - Optional configuration + * @returns Configured DiscogsSDK instance + * @throws Error if credentials are not configured (in development) * - * NOTE: Must be called during request handling (not at module init) - * because Cloudflare bindings are only available during requests + * @example + * ```typescript + * // Basic usage + * const sdk = createDiscogsSDK(); + * const results = await sdk.search.getSearchResults({ query: 'daft punk' }); + * + * // With callback URL for OAuth + * const sdk = createDiscogsSDK({ + * callbackUrl: 'https://crate.audio/api/auth/discogs/callback' + * }); + * ``` */ -export function createDiscogsSDK(options: CreateDiscogsSDKOptions = {}) { +export function createDiscogsSDK( + options: CreateDiscogsSDKOptions = {}, +): DiscogsSDK { + // Validate credentials are present + if (!hasDiscogsCredentials()) { + console.warn( + '[Discogs SDK] Missing credentials. Ensure DISCOGS_CONSUMER_KEY and ' + + 'DISCOGS_CONSUMER_SECRET are set in .dev.vars (local) or via wrangler secret (production).', + ); + } + const { consumerKey, consumerSecret } = getDiscogsCredentials(); return new DiscogsSDK({ DiscogsConsumerKey: consumerKey, DiscogsConsumerSecret: consumerSecret, callbackUrl: options.callbackUrl, - userAgent: options.userAgent || DEFAULT_USER_AGENT, + userAgent: options.userAgent ?? DEFAULT_USER_AGENT, }); } diff --git a/lib/config/env.ts b/lib/config/env.ts index 6804316..675e6a4 100644 --- a/lib/config/env.ts +++ b/lib/config/env.ts @@ -1,55 +1,97 @@ /** - * Centralized environment configuration for Cloudflare Workers + local dev + * Centralized Environment Configuration for Cloudflare Workers * - * In production (Cloudflare Workers): secrets come from cloudflare:workers bindings - * In local dev: secrets come from .dev.vars (loaded by miniflare) + * This module provides type-safe access to environment variables/secrets. * - * This module handles the fallback logic in ONE place. + * ## How it works: + * + * Both local development and production use the same access pattern: + * `import { env } from 'cloudflare:workers'` + * + * - **Production**: Secrets are set via `wrangler secret put` in CI/CD + * - **Local Dev**: Secrets are loaded from `.dev.vars` by Miniflare + * + * ## Required files: + * + * - `.dev.vars` - Local development secrets (DO NOT COMMIT) + * ``` + * DISCOGS_CONSUMER_KEY=your_key + * DISCOGS_CONSUMER_SECRET=your_secret + * ``` + * + * - `wrangler.toml` - Non-sensitive env vars in [vars] section + * + * @see https://developers.cloudflare.com/workers/configuration/secrets/ + * @see https://developers.cloudflare.com/workers/local-development/environment-variables/ */ import { env as cloudflareEnv } from 'cloudflare:workers'; -type CloudflareEnv = { +/** + * Type definition for Cloudflare environment bindings. + * Add new secrets/vars here as they are added to the project. + * + * To generate types automatically, run: `nr cf-typegen` + */ +export interface CloudflareEnv { + // Discogs OAuth credentials DISCOGS_CONSUMER_KEY?: string; DISCOGS_CONSUMER_SECRET?: string; - // Add other secrets here as needed -}; + + // Environment identifier (set in wrangler.toml [env.*.vars]) + ENVIRONMENT?: 'development' | 'staging' | 'production'; +} + +/** + * Get the typed Cloudflare environment object. + * + * @returns The environment bindings from Cloudflare Workers runtime + */ +export function getCloudflareEnv(): CloudflareEnv { + return cloudflareEnv as CloudflareEnv; +} /** - * Get an environment variable from Cloudflare bindings (production) - * or process.env (local dev fallback) + * Get an environment variable by key. + * + * @param key - The environment variable key + * @returns The value or empty string if not set */ -function getEnvVar(key: keyof CloudflareEnv): string { - const cfEnv = cloudflareEnv as CloudflareEnv; - - // Try Cloudflare env first (production) - if (cfEnv[key]) { - return cfEnv[key]; - } - - // Fall back to process.env (local dev) - // Check both non-prefixed and VITE_ prefixed versions - return ( - process.env[key] || - process.env[`VITE_${key}`] || - '' - ); +export function getEnvVar( + key: K, +): NonNullable | string { + const env = getCloudflareEnv(); + return env[key] ?? ''; } /** - * Discogs API credentials + * Get Discogs API credentials from environment. + * + * @returns Object with consumerKey and consumerSecret */ export function getDiscogsCredentials() { + const env = getCloudflareEnv(); return { - consumerKey: getEnvVar('DISCOGS_CONSUMER_KEY'), - consumerSecret: getEnvVar('DISCOGS_CONSUMER_SECRET'), + consumerKey: env.DISCOGS_CONSUMER_KEY ?? '', + consumerSecret: env.DISCOGS_CONSUMER_SECRET ?? '', }; } /** - * Check if Discogs credentials are configured + * Check if Discogs credentials are configured. + * + * @returns true if both consumer key and secret are present */ export function hasDiscogsCredentials(): boolean { const { consumerKey, consumerSecret } = getDiscogsCredentials(); return Boolean(consumerKey && consumerSecret); } + +/** + * Get the current environment name. + * + * @returns 'development', 'staging', or 'production' + */ +export function getEnvironment(): CloudflareEnv['ENVIRONMENT'] { + return getEnvVar('ENVIRONMENT') as CloudflareEnv['ENVIRONMENT']; +} diff --git a/package.json b/package.json index cd5d467..26c6965 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "---------------MAINTENANCE-----------------": "🧹", "clean": "rm -rf .next .output dist node_modules", "reinstall": "rm -rf node_modules pnpm-lock.yaml && pnpm install", + "cf-typegen": "wrangler types", "---------------CONVEX DATA SYNC-----------------": "📦", "convex:export:from": "npx convex export --env-file .env.source --path convex-data.zip", "convex:import": "npx convex import convex-data.zip", diff --git a/tsconfig.json b/tsconfig.json index 7d3066a..0e73b8b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,7 +19,12 @@ }, "target": "es2015" }, - "include": ["vite-env.d.ts", "**/*.ts", "**/*.tsx"], + "include": [ + "vite-env.d.ts", + "worker-configuration.d.ts", + "**/*.ts", + "**/*.tsx" + ], "exclude": [ "node_modules", ".output", diff --git a/worker-configuration.d.ts b/worker-configuration.d.ts new file mode 100644 index 0000000..17790ec --- /dev/null +++ b/worker-configuration.d.ts @@ -0,0 +1,50 @@ +/** + * Cloudflare Workers Environment Bindings Type Definitions + * + * This file provides TypeScript type safety for the `cloudflare:workers` import. + * + * To regenerate this file automatically based on wrangler.toml, run: + * ``` + * nr cf-typegen + * ``` + * + * @see https://developers.cloudflare.com/workers/configuration/typescript/ + */ + +interface CloudflareEnv { + // =========================================== + // SECRETS (set via wrangler secret put) + // =========================================== + + /** + * Discogs OAuth Consumer Key + * @see https://www.discogs.com/settings/developers + */ + DISCOGS_CONSUMER_KEY: string; + + /** + * Discogs OAuth Consumer Secret + * @see https://www.discogs.com/settings/developers + */ + DISCOGS_CONSUMER_SECRET: string; + + // =========================================== + // ENVIRONMENT VARIABLES (set in wrangler.toml) + // =========================================== + + /** + * Current environment identifier + * Set in wrangler.toml under [env.*.vars] + */ + ENVIRONMENT?: 'development' | 'staging' | 'production'; +} + +declare module 'cloudflare:workers' { + /** + * The environment bindings object containing secrets and variables. + * + * - In production: populated from `wrangler secret put` and `wrangler.toml` + * - In local dev: populated from `.dev.vars` and `wrangler.toml` + */ + const env: CloudflareEnv; +} diff --git a/wrangler.toml b/wrangler.toml index 0948212..eb096d8 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -5,6 +5,10 @@ assets = { directory = "dist/client" } compatibility_date = "2024-12-16" compatibility_flags = ["nodejs_compat"] +# Default environment variables (used in local development) +[vars] +ENVIRONMENT = "development" + [env.production] name = "crate-app" # routes = [ From d341527b482c736d1f7118c6c94ea790e6b75627 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Wed, 10 Dec 2025 01:44:14 -0500 Subject: [PATCH 18/48] fix: allow workers.dev URLs in OAuth origin validation --- app/api/auth/discogs/request-token.ts | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 3fee601..403beac 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -11,8 +11,13 @@ const ALLOWED_ORIGINS = [ function getValidatedOrigin(requestUrl: string): string { const origin = new URL(requestUrl).origin; - // Allow preview deployments (e.g., https://131-pr.crate.audio) - const isPreviewOrigin = /^https:\/\/\d+-pr\.crate\.audio$/.test(origin); + + // Allow preview deployments: + // - Custom domain: https://131-pr.crate.audio + // - Workers.dev: https://crate-app-pr-131.xxx.workers.dev + const isPreviewOrigin = + /^https:\/\/\d+-pr\.crate\.audio$/.test(origin) || + /^https:\/\/crate-app-pr-\d+\.[a-z0-9]+\.workers\.dev$/.test(origin); if (!ALLOWED_ORIGINS.includes(origin) && !isPreviewOrigin) { throw new Error(`Invalid origin: ${origin}`); @@ -20,6 +25,13 @@ function getValidatedOrigin(requestUrl: string): string { return origin; } +/** + * Check if cookies should use secure flag (HTTPS) + */ +function isSecureOrigin(origin: string): boolean { + return origin.startsWith('https://'); +} + export const Route = createFileRoute('/api/auth/discogs/request-token')({ server: { handlers: { @@ -54,12 +66,13 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const { token, secret } = requestTokenResponse.requestTokens; const headers = new Headers(); + const secureCookie = isSecureOrigin(baseUrl); headers.append( 'Set-Cookie', serialize('request_token', token, { httpOnly: true, - secure: process.env.NODE_ENV === 'production', + secure: secureCookie, sameSite: 'lax', path: '/', }), @@ -69,7 +82,7 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ 'Set-Cookie', serialize('request_token_secret', secret, { httpOnly: true, - secure: process.env.NODE_ENV === 'production', + secure: secureCookie, sameSite: 'lax', path: '/', }), @@ -88,10 +101,6 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ return Response.json( { error: error.message || 'Error getting authorization URL', - details: - process.env.NODE_ENV === 'development' - ? error.stack - : undefined, }, { status: 500 }, ); From 6c3f3371e60c842b39a06f46ddfdda6f4da2b035 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Fri, 12 Dec 2025 19:43:58 -0500 Subject: [PATCH 19/48] chore: ignore local context-repos --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 8540767..25f797a 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,6 @@ context-repos/ # Cursor IDE rules .cursor/ .dev.vars + +# Context repositories (local reference repos, not part of the project) +context-repos/ \ No newline at end of file From a2994408e912e410e02d82caad1c920b64a341c4 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Fri, 12 Dec 2025 19:55:13 -0500 Subject: [PATCH 20/48] fix: harden Discogs OAuth error typing --- app/api/auth/discogs/request-token.ts | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 403beac..3dcd7bf 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -45,10 +45,21 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const requestTokenResponse = await sdk.auth .getRequestToken() - .catch(async (error) => { - const responseText = error.response?.text - ? await error.response.text() - : ''; + .catch(async (error: unknown) => { + const response = (() => { + if (!error || typeof error !== 'object') return undefined; + if (!('response' in error)) return undefined; + const { response } = error as { response?: unknown }; + return response; + })(); + + const responseText = + response && + typeof response === 'object' && + 'text' in response && + typeof (response as { text?: unknown }).text === 'function' + ? await (response as { text: () => Promise }).text() + : ''; if (responseText.includes('Authentication Required')) { throw new Error( 'Vercel authentication is blocking the request.', @@ -96,11 +107,12 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ }, { headers }, ); - } catch (error: any) { + } catch (error: unknown) { + const message = error instanceof Error ? error.message : String(error); console.error('Error in request token route:', error); return Response.json( { - error: error.message || 'Error getting authorization URL', + error: message || 'Error getting authorization URL', }, { status: 500 }, ); From c0a76e90e5733f0c9d192ec10254f52eb8638198 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Fri, 12 Dec 2025 20:08:14 -0500 Subject: [PATCH 21/48] fix: preview --- .github/workflows/deploy-preview.yaml | 6 +++--- .github/workflows/deploy-production.yaml | 2 -- .github/workflows/deploy-staging.yaml | 2 -- app/api/auth/discogs/request-token.ts | 3 ++- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy-preview.yaml b/.github/workflows/deploy-preview.yaml index d9e2394..ac969b8 100644 --- a/.github/workflows/deploy-preview.yaml +++ b/.github/workflows/deploy-preview.yaml @@ -12,7 +12,9 @@ jobs: deploy: name: Build & Deploy Preview runs-on: ubuntu-latest - + concurrency: + group: preview-${{ github.event.pull_request.number }} + cancel-in-progress: true steps: - name: Checkout uses: actions/checkout@v4 @@ -33,8 +35,6 @@ jobs: - name: Build env: - VITE_DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} - VITE_DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} VITE_CONVEX_URL: ${{ secrets.VITE_CONVEX_URL }} run: pnpm build diff --git a/.github/workflows/deploy-production.yaml b/.github/workflows/deploy-production.yaml index cb20ccf..7e5701c 100644 --- a/.github/workflows/deploy-production.yaml +++ b/.github/workflows/deploy-production.yaml @@ -39,8 +39,6 @@ jobs: - name: Build env: VITE_CONVEX_URL: ${{ secrets.VITE_CONVEX_URL }} - VITE_DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} - VITE_DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} run: pnpm build - name: Clean wrangler cache diff --git a/.github/workflows/deploy-staging.yaml b/.github/workflows/deploy-staging.yaml index ae3beb4..1d1935f 100644 --- a/.github/workflows/deploy-staging.yaml +++ b/.github/workflows/deploy-staging.yaml @@ -39,8 +39,6 @@ jobs: - name: Build env: VITE_CONVEX_URL: ${{ secrets.VITE_CONVEX_URL }} - VITE_DISCOGS_CONSUMER_KEY: ${{ secrets.VITE_DISCOGS_CONSUMER_KEY }} - VITE_DISCOGS_CONSUMER_SECRET: ${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }} run: pnpm build - name: Clean wrangler cache diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 3dcd7bf..b3b2044 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -108,7 +108,8 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ { headers }, ); } catch (error: unknown) { - const message = error instanceof Error ? error.message : String(error); + const message = + error instanceof Error ? error.message : String(error); console.error('Error in request token route:', error); return Response.json( { From 5d5c4a23ab09c82386cd513c3b42def18d65bfa1 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Fri, 12 Dec 2025 20:10:01 -0500 Subject: [PATCH 22/48] fix: Prevent Vite from crawling to local --- .eslintrc.json | 2 ++ vite.config.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/.eslintrc.json b/.eslintrc.json index 60272ba..2ffb2ae 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -14,6 +14,8 @@ "routeTree.gen.ts", "context-repos", "__tests__" + "__tests__", + "context-repos" ], "parser": "@typescript-eslint/parser", "parserOptions": { diff --git a/vite.config.ts b/vite.config.ts index 0fe1084..15c5ae2 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -13,6 +13,7 @@ export default defineConfig({ cloudflare({ viteEnvironment: { name: 'ssr' } }), tailwindcss(), tsconfigPaths({ + // Prevent Vite from crawling `context-repos/**/tsconfig.json` (local reference repos) projects: ['./tsconfig.json'], ignoreConfigErrors: true, }), From 98b83c68a4dd6659265292e31335317802d5153d Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Fri, 12 Dec 2025 20:12:49 -0500 Subject: [PATCH 23/48] chore: add context-repos to prettier ignore --- .prettierignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.prettierignore b/.prettierignore index 2368ebf..2bc1cba 100644 --- a/.prettierignore +++ b/.prettierignore @@ -13,4 +13,4 @@ node_modules/ pnpm-lock.yaml # Context repos -context-repos/ \ No newline at end of file +context-repos/ From e91b54ff54e78f1d9eca931c3759e827b1e9ad0c Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Fri, 12 Dec 2025 20:19:18 -0500 Subject: [PATCH 24/48] ci: harden preview deploy and isolate context-repos --- .github/workflows/cleanup-preview.yaml | 4 ++- .github/workflows/deploy-preview.yaml | 42 +++++++++++++++++--------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/.github/workflows/cleanup-preview.yaml b/.github/workflows/cleanup-preview.yaml index 643a4ee..d84a71a 100644 --- a/.github/workflows/cleanup-preview.yaml +++ b/.github/workflows/cleanup-preview.yaml @@ -8,6 +8,9 @@ jobs: cleanup: name: Delete Preview Worker runs-on: ubuntu-latest + concurrency: + group: preview-${{ github.event.pull_request.number }} + cancel-in-progress: true steps: - name: Delete Preview Worker @@ -16,4 +19,3 @@ jobs: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} command: delete --name crate-app-pr-${{ github.event.pull_request.number }} --force - diff --git a/.github/workflows/deploy-preview.yaml b/.github/workflows/deploy-preview.yaml index ac969b8..204e109 100644 --- a/.github/workflows/deploy-preview.yaml +++ b/.github/workflows/deploy-preview.yaml @@ -15,6 +15,10 @@ jobs: concurrency: group: preview-${{ github.event.pull_request.number }} cancel-in-progress: true + + env: + WORKER_NAME: crate-app-pr-${{ github.event.pull_request.number }} + steps: - name: Checkout uses: actions/checkout@v4 @@ -44,6 +48,7 @@ jobs: - name: Install Wrangler CLI run: npm install -g wrangler + # Deploy first to ensure the Worker exists, then set secrets deterministically. - name: Deploy Preview to Cloudflare Workers id: deploy uses: cloudflare/wrangler-action@v3 @@ -51,15 +56,25 @@ jobs: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} workingDirectory: dist/server - command: deploy --name crate-app-pr-${{ github.event.pull_request.number }} + command: deploy --name ${{ env.WORKER_NAME }} - name: Set Worker Secrets env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} run: | - echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | wrangler secret put DISCOGS_CONSUMER_KEY --name crate-app-pr-${{ github.event.pull_request.number }} - echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | wrangler secret put DISCOGS_CONSUMER_SECRET --name crate-app-pr-${{ github.event.pull_request.number }} + echo "${{ secrets.VITE_DISCOGS_CONSUMER_KEY }}" | wrangler secret put DISCOGS_CONSUMER_KEY --name "$WORKER_NAME" + echo "${{ secrets.VITE_DISCOGS_CONSUMER_SECRET }}" | wrangler secret put DISCOGS_CONSUMER_SECRET --name "$WORKER_NAME" + + - name: Smoke check Discogs runtime bindings + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + set -euo pipefail + URL="https://crate-app-pr-${PR_NUMBER}.govi218mu.workers.dev/api/auth/discogs/debug" + echo "Checking ${URL}" + BODY="$(curl -fsSL --retry 10 --retry-all-errors --retry-delay 3 "${URL}")" + node -e 'const json = JSON.parse(process.env.BODY || "{}"); if (!json.hasCredentials) { console.error(json); process.exit(1); } console.log("hasCredentials:", json.hasCredentials); console.log("availableBindings:", json.availableBindings);' BODY="$BODY" - name: Comment PR with Preview URL uses: actions/github-script@v7 @@ -68,31 +83,29 @@ jobs: const prNumber = context.payload.pull_request.number; const previewUrl = `https://${prNumber}-pr.crate.audio`; const fallbackUrl = `https://crate-app-pr-${prNumber}.govi218mu.workers.dev`; - - // Find existing comment + const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: prNumber, }); - - const botComment = comments.find(comment => - comment.user.type === 'Bot' && - comment.body.includes('🚀 Preview Deployment') + + const botComment = comments.find((comment) => + comment.user.type === 'Bot' && comment.body.includes('🚀 Preview Deployment'), ); - + const body = `## 🚀 Preview Deployment - + | Environment | URL | |-------------|-----| | Preview | [${previewUrl}](${previewUrl}) | | Fallback | [${fallbackUrl}](${fallbackUrl}) | - + **Commit:** \`${context.sha.substring(0, 7)}\` **Updated:** ${new Date().toISOString()} - + > This preview will be automatically deleted when the PR is closed.`; - + if (botComment) { await github.rest.issues.updateComment({ owner: context.repo.owner, @@ -108,4 +121,3 @@ jobs: body, }); } - From a86c647e694220381066f66705fe17bbb8aa447f Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 00:09:00 -0500 Subject: [PATCH 25/48] chorus: config --- vite.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/vite.config.ts b/vite.config.ts index 15c5ae2..0fe1084 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -13,7 +13,6 @@ export default defineConfig({ cloudflare({ viteEnvironment: { name: 'ssr' } }), tailwindcss(), tsconfigPaths({ - // Prevent Vite from crawling `context-repos/**/tsconfig.json` (local reference repos) projects: ['./tsconfig.json'], ignoreConfigErrors: true, }), From a963debb1df386198e0b9b5ad07ad354f7ae5241 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 00:18:10 -0500 Subject: [PATCH 26/48] chore:update workflow --- .github/workflows/deploy-preview.yaml | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-preview.yaml b/.github/workflows/deploy-preview.yaml index 204e109..74785ee 100644 --- a/.github/workflows/deploy-preview.yaml +++ b/.github/workflows/deploy-preview.yaml @@ -73,8 +73,27 @@ jobs: set -euo pipefail URL="https://crate-app-pr-${PR_NUMBER}.govi218mu.workers.dev/api/auth/discogs/debug" echo "Checking ${URL}" - BODY="$(curl -fsSL --retry 10 --retry-all-errors --retry-delay 3 "${URL}")" - node -e 'const json = JSON.parse(process.env.BODY || "{}"); if (!json.hasCredentials) { console.error(json); process.exit(1); } console.log("hasCredentials:", json.hasCredentials); console.log("availableBindings:", json.availableBindings);' BODY="$BODY" + # Give Workers a moment to apply secret updates + sleep 3 + + BODY="$(curl -fsSL --retry 15 --retry-all-errors --retry-delay 3 "${URL}")" + echo "Debug response: ${BODY}" + + export BODY + node -e ' + const json = JSON.parse(process.env.BODY || "{}"); + const bindings = Array.isArray(json.availableBindings) ? json.availableBindings : []; + const ok = + json.hasCredentials === true && + bindings.includes("DISCOGS_CONSUMER_KEY") && + bindings.includes("DISCOGS_CONSUMER_SECRET"); + if (!ok) { + console.error(json); + process.exit(1); + } + console.log("hasCredentials:", json.hasCredentials); + console.log("availableBindings:", bindings); + ' - name: Comment PR with Preview URL uses: actions/github-script@v7 From f434e0b16a1ed20e33a47ed03a23f27e28a19dc3 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 10:44:45 -0500 Subject: [PATCH 27/48] chore: upgrade @crate.ai/discogs-sdk to 2.4.0 (Workers-compatible) --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 26c6965..b53bc91 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@auth/core": "0.37.0", "@convex-dev/auth": "^0.0.90", "@convex-dev/migrations": "^0.3.1", - "@crate.ai/discogs-sdk": "^2.3.0", + "@crate.ai/discogs-sdk": "^2.4.0", "@fontsource-variable/inter": "^5.2.8", "@hookform/resolvers": "^3.9.0", "@opentelemetry/api": "^1.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 956598d..6d9e4ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^0.3.1 version: 0.3.1(convex@1.29.3(react@18.3.1)) '@crate.ai/discogs-sdk': - specifier: ^2.3.0 - version: 2.3.0 + specifier: ^2.4.0 + version: 2.4.0 '@fontsource-variable/inter': specifier: ^5.2.8 version: 5.2.8 @@ -529,8 +529,8 @@ packages: peerDependencies: convex: ^1.24.8 - '@crate.ai/discogs-sdk@2.3.0': - resolution: {integrity: sha512-V4VEEA/kMP42uZY3lhjCpJ1MXL8V6Vk1PGItuG2UauSORGhxHVHnYwHfI3tStxWpukD2mGjAtMQIlA30L7JgZQ==} + '@crate.ai/discogs-sdk@2.4.0': + resolution: {integrity: sha512-OD4hwfeDUO0cdWnRd6GJDwmQyxCGw3vUXQwxJH4oFtsAEckzRdzEZzu9lf2Q4lGlSce3i+juTrCFUk5dLaYzIQ==} engines: {node: '>=18.0.0'} '@cspotcode/source-map-support@0.8.1': @@ -6254,7 +6254,7 @@ snapshots: dependencies: convex: 1.29.3(react@18.3.1) - '@crate.ai/discogs-sdk@2.3.0': {} + '@crate.ai/discogs-sdk@2.4.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: From 3a13b3b10985cbab490a6cedee9707d49628b48c Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 11:01:17 -0500 Subject: [PATCH 28/48] debug: add detailed logging to diagnose Discogs OAuth failure --- app/api/auth/discogs/request-token.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index b3b2044..7271560 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -46,6 +46,8 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const requestTokenResponse = await sdk.auth .getRequestToken() .catch(async (error: unknown) => { + console.error('[request-token] Raw error:', error); + const response = (() => { if (!error || typeof error !== 'object') return undefined; if (!('response' in error)) return undefined; @@ -60,6 +62,10 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ typeof (response as { text?: unknown }).text === 'function' ? await (response as { text: () => Promise }).text() : ''; + + console.error('[request-token] Response text:', responseText); + console.error('[request-token] Response object:', response); + if (responseText.includes('Authentication Required')) { throw new Error( 'Vercel authentication is blocking the request.', @@ -110,10 +116,15 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ } catch (error: unknown) { const message = error instanceof Error ? error.message : String(error); - console.error('Error in request token route:', error); + console.error('[request-token] Full error details:', { + error, + message, + stack: error instanceof Error ? error.stack : undefined, + }); return Response.json( { error: message || 'Error getting authorization URL', + details: error instanceof Error ? error.stack : String(error), }, { status: 500 }, ); From 45b2cee75f92188299f466e8be159da533ee8698 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 11:02:32 -0500 Subject: [PATCH 29/48] fix: ci --- app/api/auth/discogs/request-token.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 7271560..7bb3f63 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -47,7 +47,7 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ .getRequestToken() .catch(async (error: unknown) => { console.error('[request-token] Raw error:', error); - + const response = (() => { if (!error || typeof error !== 'object') return undefined; if (!('response' in error)) return undefined; @@ -62,10 +62,10 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ typeof (response as { text?: unknown }).text === 'function' ? await (response as { text: () => Promise }).text() : ''; - + console.error('[request-token] Response text:', responseText); console.error('[request-token] Response object:', response); - + if (responseText.includes('Authentication Required')) { throw new Error( 'Vercel authentication is blocking the request.', From b9322ac28e126a7894a60eb7d6d1066a09624161 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 11:10:47 -0500 Subject: [PATCH 30/48] debug: log credentials being passed to SDK --- lib/config/discogs.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/config/discogs.ts b/lib/config/discogs.ts index 25128e8..c4e78af 100644 --- a/lib/config/discogs.ts +++ b/lib/config/discogs.ts @@ -72,6 +72,16 @@ export function createDiscogsSDK( } const { consumerKey, consumerSecret } = getDiscogsCredentials(); + + console.log('[createDiscogsSDK] Creating SDK with credentials:', { + hasKey: Boolean(consumerKey), + hasSecret: Boolean(consumerSecret), + keyLength: consumerKey?.length, + secretLength: consumerSecret?.length, + keyPrefix: consumerKey?.substring(0, 4), + secretPrefix: consumerSecret?.substring(0, 4), + callbackUrl: options.callbackUrl, + }); return new DiscogsSDK({ DiscogsConsumerKey: consumerKey, From f76ddedfca627bb3e1621aacfe489df34ca0bbbb Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 11:14:09 -0500 Subject: [PATCH 31/48] debug: log actual credential values being loaded --- lib/config/env.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/config/env.ts b/lib/config/env.ts index 675e6a4..4fffd74 100644 --- a/lib/config/env.ts +++ b/lib/config/env.ts @@ -71,6 +71,15 @@ export function getEnvVar( */ export function getDiscogsCredentials() { const env = getCloudflareEnv(); + console.log('[getDiscogsCredentials] Raw env object:', Object.keys(env)); + console.log('[getDiscogsCredentials] Credentials check:', { + hasKey: Boolean(env.DISCOGS_CONSUMER_KEY), + hasSecret: Boolean(env.DISCOGS_CONSUMER_SECRET), + keyLength: env.DISCOGS_CONSUMER_KEY?.length, + secretLength: env.DISCOGS_CONSUMER_SECRET?.length, + keyValue: env.DISCOGS_CONSUMER_KEY, + secretValue: env.DISCOGS_CONSUMER_SECRET, + }); return { consumerKey: env.DISCOGS_CONSUMER_KEY ?? '', consumerSecret: env.DISCOGS_CONSUMER_SECRET ?? '', From eccc199bbfd6450925245f3290c65d86e0c70281 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 11:16:02 -0500 Subject: [PATCH 32/48] fix: format --- lib/config/discogs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/config/discogs.ts b/lib/config/discogs.ts index c4e78af..aa9a65b 100644 --- a/lib/config/discogs.ts +++ b/lib/config/discogs.ts @@ -72,7 +72,7 @@ export function createDiscogsSDK( } const { consumerKey, consumerSecret } = getDiscogsCredentials(); - + console.log('[createDiscogsSDK] Creating SDK with credentials:', { hasKey: Boolean(consumerKey), hasSecret: Boolean(consumerSecret), From 7541946da314aad8dc236096a35fe7cf1f451ca7 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 20:17:04 -0500 Subject: [PATCH 33/48] fix: add OAuth authentication when fetching Discogs user profile The user profile endpoint requires OAuth headers, not just the resource URL. This was causing the callback to fail with HTML error pages. --- app/api/auth/discogs/request-token.ts | 12 +----------- lib/config/discogs.ts | 10 ---------- lib/config/env.ts | 9 --------- 3 files changed, 1 insertion(+), 30 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 7bb3f63..9303aec 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -46,8 +46,6 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const requestTokenResponse = await sdk.auth .getRequestToken() .catch(async (error: unknown) => { - console.error('[request-token] Raw error:', error); - const response = (() => { if (!error || typeof error !== 'object') return undefined; if (!('response' in error)) return undefined; @@ -63,9 +61,6 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ ? await (response as { text: () => Promise }).text() : ''; - console.error('[request-token] Response text:', responseText); - console.error('[request-token] Response object:', response); - if (responseText.includes('Authentication Required')) { throw new Error( 'Vercel authentication is blocking the request.', @@ -116,15 +111,10 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ } catch (error: unknown) { const message = error instanceof Error ? error.message : String(error); - console.error('[request-token] Full error details:', { - error, - message, - stack: error instanceof Error ? error.stack : undefined, - }); + console.error('Error in request token route:', error); return Response.json( { error: message || 'Error getting authorization URL', - details: error instanceof Error ? error.stack : String(error), }, { status: 500 }, ); diff --git a/lib/config/discogs.ts b/lib/config/discogs.ts index aa9a65b..25128e8 100644 --- a/lib/config/discogs.ts +++ b/lib/config/discogs.ts @@ -73,16 +73,6 @@ export function createDiscogsSDK( const { consumerKey, consumerSecret } = getDiscogsCredentials(); - console.log('[createDiscogsSDK] Creating SDK with credentials:', { - hasKey: Boolean(consumerKey), - hasSecret: Boolean(consumerSecret), - keyLength: consumerKey?.length, - secretLength: consumerSecret?.length, - keyPrefix: consumerKey?.substring(0, 4), - secretPrefix: consumerSecret?.substring(0, 4), - callbackUrl: options.callbackUrl, - }); - return new DiscogsSDK({ DiscogsConsumerKey: consumerKey, DiscogsConsumerSecret: consumerSecret, diff --git a/lib/config/env.ts b/lib/config/env.ts index 4fffd74..675e6a4 100644 --- a/lib/config/env.ts +++ b/lib/config/env.ts @@ -71,15 +71,6 @@ export function getEnvVar( */ export function getDiscogsCredentials() { const env = getCloudflareEnv(); - console.log('[getDiscogsCredentials] Raw env object:', Object.keys(env)); - console.log('[getDiscogsCredentials] Credentials check:', { - hasKey: Boolean(env.DISCOGS_CONSUMER_KEY), - hasSecret: Boolean(env.DISCOGS_CONSUMER_SECRET), - keyLength: env.DISCOGS_CONSUMER_KEY?.length, - secretLength: env.DISCOGS_CONSUMER_SECRET?.length, - keyValue: env.DISCOGS_CONSUMER_KEY, - secretValue: env.DISCOGS_CONSUMER_SECRET, - }); return { consumerKey: env.DISCOGS_CONSUMER_KEY ?? '', consumerSecret: env.DISCOGS_CONSUMER_SECRET ?? '', From adb51532f596f9d6807fee92081f0b08b6c92620 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 20:36:49 -0500 Subject: [PATCH 34/48] fix --- package.json | 2 +- pnpm-lock.yaml | 1355 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1355 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b53bc91..26c6965 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@auth/core": "0.37.0", "@convex-dev/auth": "^0.0.90", "@convex-dev/migrations": "^0.3.1", - "@crate.ai/discogs-sdk": "^2.4.0", + "@crate.ai/discogs-sdk": "^2.3.0", "@fontsource-variable/inter": "^5.2.8", "@hookform/resolvers": "^3.9.0", "@opentelemetry/api": "^1.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6d9e4ad..0c374dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,7 +24,7 @@ importers: specifier: ^0.3.1 version: 0.3.1(convex@1.29.3(react@18.3.1)) '@crate.ai/discogs-sdk': - specifier: ^2.4.0 + specifier: ^2.3.0 version: 2.4.0 '@fontsource-variable/inter': specifier: ^5.2.8 @@ -241,6 +241,27 @@ importers: specifier: ^4.53.0 version: 4.53.0(@cloudflare/workers-types@4.20251209.0) + context-repos/discogs-sdk/core: + devDependencies: + '@changesets/cli': + specifier: ^2.27.1 + version: 2.29.8(@types/node@18.19.130) + '@types/node': + specifier: ^18.19.33 + version: 18.19.130 + '@vitest/coverage-v8': + specifier: ^1.0.0 + version: 1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1)) + tsup: + specifier: ^8.0.2 + version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@4.9.5) + typescript: + specifier: ^4.4.4 + version: 4.9.5 + vitest: + specifier: ^1.0.0 + version: 1.6.1(@types/node@18.19.130)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1) + packages: '@acemir/cssom@0.9.28': @@ -281,6 +302,10 @@ packages: peerDependencies: zod: ^3.23.8 + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + '@antfu/ni@27.0.1': resolution: {integrity: sha512-I6SOlwJ0MN73ECYcr7VJHpqSseyd7bpshx6JAaD0zNowS4kSWzFsqg8ikQT7DnCLiD4AZ+FaQJQ8WAk0Qi89Vw==} engines: {node: '>=20'} @@ -461,6 +486,64 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@changesets/apply-release-plan@7.0.14': + resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} + + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.29.8': + resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==} + hasBin: true + + '@changesets/config@3.1.2': + resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-release-plan@4.0.14': + resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.2': + resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.6': + resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@cloudflare/kv-asset-handler@0.4.1': resolution: {integrity: sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg==} engines: {node: '>=18.0.0'} @@ -580,6 +663,12 @@ packages: '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -598,6 +687,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} @@ -616,6 +711,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} @@ -634,6 +735,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} @@ -652,6 +759,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} @@ -670,6 +783,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} @@ -688,6 +807,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} @@ -706,6 +831,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} @@ -724,6 +855,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} @@ -742,6 +879,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} @@ -760,6 +903,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} @@ -778,6 +927,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} @@ -796,6 +951,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} @@ -814,6 +975,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} @@ -832,6 +999,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} @@ -850,6 +1023,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} @@ -868,6 +1047,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -904,6 +1089,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -940,6 +1131,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -970,6 +1167,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} @@ -988,6 +1191,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} @@ -1006,6 +1215,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} @@ -1024,6 +1239,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -1201,6 +1422,15 @@ packages: cpu: [x64] os: [win32] + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@ioredis/commands@1.4.0': resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==} @@ -1212,6 +1442,14 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1238,6 +1476,12 @@ packages: resolution: {integrity: sha512-S+msolgD9aPVoJ+ZomVD0WSKm+qJBKvJimzwq8dMvlGKbIPsAyEWhHHdSRuQT3g2VpDIctvbi9nU++kN/VPZaw==} engines: {node: '>= 18'} + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mapbox/node-pre-gyp@2.0.3': resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} engines: {node: '>=18'} @@ -2057,6 +2301,9 @@ packages: cpu: [x64] os: [win32] + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sindresorhus/is@7.1.1': resolution: {integrity: sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==} engines: {node: '>=18'} @@ -2381,6 +2628,9 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} @@ -2496,6 +2746,14 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/coverage-v8@1.6.1': + resolution: {integrity: sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw==} + peerDependencies: + vitest: 1.6.1 + + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + '@vitest/expect@4.0.15': resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} @@ -2513,15 +2771,27 @@ packages: '@vitest/pretty-format@4.0.15': resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + '@vitest/runner@4.0.15': resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + '@vitest/snapshot@4.0.15': resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + '@vitest/spy@4.0.15': resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + '@vitest/utils@4.0.15': resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} @@ -2581,6 +2851,10 @@ packages: 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'} @@ -2609,6 +2883,9 @@ packages: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} 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'} @@ -2621,6 +2898,9 @@ packages: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} engines: {node: '>= 14'} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -2647,6 +2927,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -2705,6 +2988,10 @@ packages: resolution: {integrity: sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==} hasBin: true + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} @@ -2758,6 +3045,12 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + c12@3.3.2: resolution: {integrity: sha512-QkikB2X5voO1okL3QsES0N690Sn/K9WokXqUsDQsWy5SnYb+psYQFGA10iy1bZHj3fjISKsI67Q90gruvWWM3A==} peerDependencies: @@ -2766,6 +3059,10 @@ packages: magicast: optional: true + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2789,6 +3086,10 @@ packages: caniuse-lite@1.0.30001757: resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + chai@6.2.1: resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} engines: {node: '>=18'} @@ -2805,6 +3106,12 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -2824,6 +3131,10 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} @@ -2877,6 +3188,10 @@ packages: 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'} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -3107,6 +3422,10 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3152,6 +3471,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -3167,6 +3490,10 @@ packages: diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@8.0.2: resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} @@ -3249,6 +3576,10 @@ packages: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -3293,6 +3624,11 @@ packages: es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -3416,6 +3752,9 @@ packages: exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3469,6 +3808,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + 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'} @@ -3477,6 +3820,9 @@ packages: resolution: {integrity: sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==} engines: {node: '>=18'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3520,6 +3866,14 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -3565,6 +3919,9 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -3718,6 +4075,9 @@ packages: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} @@ -3748,6 +4108,10 @@ packages: httpxy@0.1.7: resolution: {integrity: sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==} + human-id@4.1.3: + resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + hasBin: true + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -3759,6 +4123,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.1: + resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -3938,6 +4306,10 @@ packages: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} @@ -3962,6 +4334,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -3991,6 +4367,22 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -4005,12 +4397,20 @@ packages: jose@5.10.0: resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true @@ -4054,6 +4454,9 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jwt-decode@4.0.0: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} @@ -4150,6 +4553,13 @@ packages: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + listhen@1.9.0: resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true @@ -4158,10 +4568,22 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + local-pkg@1.1.2: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -4175,6 +4597,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -4182,6 +4607,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -4208,6 +4636,9 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.1: resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} @@ -4215,6 +4646,10 @@ packages: resolution: {integrity: sha512-T9BPOmEOhp6SmV25SwLVcHK4E6JyG/coH3C6F1NjNXSziv/fd4GmsqMk8YR6qpPOswfaOCApSNkZv6fxoaYFcQ==} engines: {node: '>=18'} + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -4303,12 +4738,19 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4450,6 +4892,9 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -4458,21 +4903,48 @@ packages: resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} engines: {node: '>=16.17'} + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + 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@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + p-timeout@6.1.4: resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} engines: {node: '>=14.16'} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} @@ -4552,6 +5024,9 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + perfect-debounce@2.0.0: resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} @@ -4575,6 +5050,14 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -4585,6 +5068,24 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -4601,6 +5102,11 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + prettier@3.7.1: resolution: {integrity: sha512-RWKXE4qB3u5Z6yz7omJkjWwmTfLdcbv44jUVHC5NpfXwFGzvpQM798FGv/6WNK879tc+Cn0AAyherCl1KjbyZQ==} engines: {node: '>=14'} @@ -4614,6 +5120,10 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} @@ -4744,6 +5254,10 @@ packages: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -5058,6 +5572,9 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -5070,6 +5587,9 @@ packages: spdx-license-ids@3.0.22: resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + srvx@0.8.16: resolution: {integrity: sha512-hmcGW4CgroeSmzgF1Ihwgl+Ths0JqAJ7HwjP2X7e3JzY7u4IydLMcdnlqGQiQGUswz+PO9oh/KtCpOISIvs9QQ==} engines: {node: '>=20.16.0'} @@ -5161,9 +5681,17 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + super-regex@1.1.0: resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} engines: {node: '>=18'} @@ -5225,17 +5753,32 @@ packages: resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + terser@5.44.1: resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} engines: {node: '>=10'} hasBin: true + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + throttleit@2.1.0: resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} engines: {node: '>=18'} @@ -5253,6 +5796,9 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -5261,6 +5807,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + tinyrainbow@3.0.3: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} @@ -5269,6 +5819,10 @@ packages: resolution: {integrity: sha512-Wq3kFq9V0l//CkvIxEw5kyWIUAW+zfgg2h+FbR/xOeJGR7kp7wKAXbMVXue1P0GaNByRPRQxW670Y3Xzx9bWxA==} engines: {node: '>= 18'} + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + tldts-core@7.0.19: resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} @@ -5295,12 +5849,19 @@ packages: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -5314,6 +5875,25 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + tsx@4.20.6: resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} engines: {node: '>=18.0.0'} @@ -5323,6 +5903,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -5351,6 +5935,11 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -5403,6 +5992,10 @@ packages: resolution: {integrity: sha512-/JpWMG9s1nBSlXJAQ8EREFTFy3oy6USFd8T6AoBaw1q2GGcF4R9yp3ofg32UODZlYEO5VD0EWE1RpI9XDWyPYg==} engines: {node: '>=18.12.0'} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + unpic@4.2.2: resolution: {integrity: sha512-z6T2ScMgRV2y2H8MwwhY5xHZWXhUx/YxtOCGJwfURSl7ypVy4HpLIMWoIZKnnxQa/RKzM0kg8hUh0paIrpLfvw==} @@ -5544,6 +6137,11 @@ packages: resolution: {integrity: sha512-1pGA+cU1G9feBQ1sd5FMftPuLUT8NSX880AvELhNWqoqWhe2jeSOQxjDPxlA3f1AC+Bbknl4UPKHyVXmfLZQjw==} hasBin: true + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-tsconfig-paths@5.1.4: resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: @@ -5552,6 +6150,37 @@ packages: vite: optional: true + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@6.4.1: resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -5640,6 +6269,31 @@ packages: vite: optional: true + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@4.0.15: resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -5844,6 +6498,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + youch-core@0.3.3: resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} @@ -5936,6 +6594,11 @@ snapshots: zod: 3.25.76 zod-to-json-schema: 3.25.0(zod@3.25.76) + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@antfu/ni@27.0.1': dependencies: ansis: 4.2.0 @@ -6188,6 +6851,152 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@bcoe/v8-coverage@0.2.3': {} + + '@changesets/apply-release-plan@7.0.14': + dependencies: + '@changesets/config': 3.1.2 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.3 + + '@changesets/assemble-release-plan@6.0.9': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.3 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.8(@types/node@18.19.130)': + dependencies: + '@changesets/apply-release-plan': 7.0.14 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.2 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.14 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.6 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@18.19.130) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.3 + + '@changesets/get-release-plan@4.0.14': + dependencies: + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.2 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.6 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.2': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.1.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.6': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.2 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.3 + prettier: 2.8.8 + '@cloudflare/kv-asset-handler@0.4.1': dependencies: mime: 3.0.0 @@ -6296,6 +7105,9 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.25.12': optional: true @@ -6305,6 +7117,9 @@ snapshots: '@esbuild/aix-ppc64@0.27.0': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.25.12': optional: true @@ -6314,6 +7129,9 @@ snapshots: '@esbuild/android-arm64@0.27.0': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.25.12': optional: true @@ -6323,6 +7141,9 @@ snapshots: '@esbuild/android-arm@0.27.0': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.25.12': optional: true @@ -6332,6 +7153,9 @@ snapshots: '@esbuild/android-x64@0.27.0': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.25.12': optional: true @@ -6341,6 +7165,9 @@ snapshots: '@esbuild/darwin-arm64@0.27.0': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.25.12': optional: true @@ -6350,6 +7177,9 @@ snapshots: '@esbuild/darwin-x64@0.27.0': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.25.12': optional: true @@ -6359,6 +7189,9 @@ snapshots: '@esbuild/freebsd-arm64@0.27.0': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.25.12': optional: true @@ -6368,6 +7201,9 @@ snapshots: '@esbuild/freebsd-x64@0.27.0': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.25.12': optional: true @@ -6377,6 +7213,9 @@ snapshots: '@esbuild/linux-arm64@0.27.0': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.25.12': optional: true @@ -6386,6 +7225,9 @@ snapshots: '@esbuild/linux-arm@0.27.0': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.25.12': optional: true @@ -6395,6 +7237,9 @@ snapshots: '@esbuild/linux-ia32@0.27.0': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.25.12': optional: true @@ -6404,6 +7249,9 @@ snapshots: '@esbuild/linux-loong64@0.27.0': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.25.12': optional: true @@ -6413,6 +7261,9 @@ snapshots: '@esbuild/linux-mips64el@0.27.0': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.25.12': optional: true @@ -6422,6 +7273,9 @@ snapshots: '@esbuild/linux-ppc64@0.27.0': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.25.12': optional: true @@ -6431,6 +7285,9 @@ snapshots: '@esbuild/linux-riscv64@0.27.0': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.25.12': optional: true @@ -6440,6 +7297,9 @@ snapshots: '@esbuild/linux-s390x@0.27.0': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.25.12': optional: true @@ -6458,6 +7318,9 @@ snapshots: '@esbuild/netbsd-arm64@0.27.0': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.25.12': optional: true @@ -6476,6 +7339,9 @@ snapshots: '@esbuild/openbsd-arm64@0.27.0': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.25.12': optional: true @@ -6491,6 +7357,9 @@ snapshots: '@esbuild/openharmony-arm64@0.27.0': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.25.12': optional: true @@ -6500,6 +7369,9 @@ snapshots: '@esbuild/sunos-x64@0.27.0': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.25.12': optional: true @@ -6509,6 +7381,9 @@ snapshots: '@esbuild/win32-arm64@0.27.0': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.25.12': optional: true @@ -6518,6 +7393,9 @@ snapshots: '@esbuild/win32-ia32@0.27.0': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.25.12': optional: true @@ -6660,6 +7538,13 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@inquirer/external-editor@1.0.3(@types/node@18.19.130)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.1 + optionalDependencies: + '@types/node': 18.19.130 + '@ioredis/commands@1.4.0': {} '@isaacs/cliui@8.0.2': @@ -6675,6 +7560,12 @@ snapshots: dependencies: minipass: 7.1.2 + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6706,6 +7597,22 @@ snapshots: '@kikobeats/time-span@1.0.11': {} + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.4 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.4 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + '@mapbox/node-pre-gyp@2.0.3': dependencies: consola: 3.4.2 @@ -7442,6 +8349,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.53.3': optional: true + '@sinclair/typebox@0.27.8': {} + '@sindresorhus/is@7.1.1': {} '@sindresorhus/merge-streams@4.0.0': {} @@ -7847,6 +8756,8 @@ snapshots: '@types/node': 20.19.25 form-data: 4.0.5 + '@types/node@12.20.55': {} + '@types/node@18.19.130': dependencies: undici-types: 5.26.5 @@ -8020,6 +8931,31 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/coverage-v8@1.6.1(vitest@1.6.1(@types/node@18.19.130)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magic-string: 0.30.21 + magicast: 0.3.5 + picocolors: 1.1.1 + std-env: 3.10.0 + strip-literal: 2.1.1 + test-exclude: 6.0.0 + vitest: 1.6.1(@types/node@18.19.130)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.1': + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + '@vitest/expect@4.0.15': dependencies: '@standard-schema/spec': 1.0.0 @@ -8041,19 +8977,42 @@ snapshots: dependencies: tinyrainbow: 3.0.3 + '@vitest/runner@1.6.1': + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + '@vitest/runner@4.0.15': dependencies: '@vitest/utils': 4.0.15 pathe: 2.0.3 + '@vitest/snapshot@1.6.1': + dependencies: + magic-string: 0.30.21 + pathe: 1.1.2 + pretty-format: 29.7.0 + '@vitest/snapshot@4.0.15': dependencies: '@vitest/pretty-format': 4.0.15 magic-string: 0.30.21 pathe: 2.0.3 + '@vitest/spy@1.6.1': + dependencies: + tinyspy: 2.2.1 + '@vitest/spy@4.0.15': {} + '@vitest/utils@1.6.1': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + '@vitest/utils@4.0.15': dependencies: '@vitest/pretty-format': 4.0.15 @@ -8108,6 +9067,8 @@ snapshots: dependencies: string-width: 4.2.3 + ansi-colors@4.1.3: {} + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -8126,6 +9087,8 @@ snapshots: ansis@4.2.0: {} + any-promise@1.3.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -8154,6 +9117,10 @@ snapshots: - bare-abort-controller - react-native-b4a + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} aria-hidden@1.2.6: @@ -8183,6 +9150,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + assertion-error@1.1.0: {} + assertion-error@2.0.1: {} ast-types@0.16.1: @@ -8222,6 +9191,10 @@ snapshots: baseline-browser-mapping@2.8.31: {} + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 @@ -8288,6 +9261,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bundle-require@5.1.0(esbuild@0.27.0): + dependencies: + esbuild: 0.27.0 + load-tsconfig: 0.2.5 + c12@3.3.2(magicast@0.5.1): dependencies: chokidar: 4.0.3 @@ -8305,6 +9283,8 @@ snapshots: optionalDependencies: magicast: 0.5.1 + cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -8328,6 +9308,16 @@ snapshots: caniuse-lite@1.0.30001757: {} + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + chai@6.2.1: {} chalk@2.4.2: @@ -8343,6 +9333,12 @@ snapshots: chalk@5.6.2: {} + chardet@2.1.1: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 @@ -8384,6 +9380,8 @@ snapshots: chownr@3.0.0: {} + ci-info@3.9.0: {} + citty@0.1.6: dependencies: consola: 3.4.2 @@ -8438,6 +9436,8 @@ snapshots: commander@2.20.3: {} + commander@4.1.1: {} + commondir@1.0.1: {} compatx@0.2.0: {} @@ -8625,6 +9625,10 @@ snapshots: decimal.js@10.6.0: {} + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -8657,6 +9661,8 @@ snapshots: destroy@1.2.0: {} + detect-indent@6.1.0: {} + detect-libc@1.0.3: {} detect-libc@2.1.2: {} @@ -8665,6 +9671,8 @@ snapshots: diff-match-patch@1.0.5: {} + diff-sequences@29.6.3: {} + diff@8.0.2: {} dir-glob@3.0.1: @@ -8742,6 +9750,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.0 + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + entities@4.5.0: {} entities@6.0.1: {} @@ -8834,6 +9847,32 @@ snapshots: es6-promise@4.2.8: {} + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -9053,6 +10092,8 @@ snapshots: exsolve@1.0.8: {} + extendable-error@0.1.7: {} + fast-deep-equal@3.1.3: {} fast-equals@5.3.3: {} @@ -9097,6 +10138,11 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -9107,6 +10153,12 @@ snapshots: semver-regex: 4.0.5 super-regex: 1.1.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.0 + rollup: 4.53.3 + flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -9145,6 +10197,18 @@ snapshots: fresh@2.0.0: {} + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -9177,6 +10241,8 @@ snapshots: get-east-asian-width@1.4.0: {} + get-func-name@2.0.2: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -9362,6 +10428,8 @@ snapshots: dependencies: whatwg-encoding: 3.1.1 + html-escaper@2.0.2: {} + htmlparser2@10.0.0: dependencies: domelementtype: 2.3.0 @@ -9411,6 +10479,8 @@ snapshots: httpxy@0.1.7: {} + human-id@4.1.3: {} + human-signals@5.0.0: {} humanize-ms@1.2.1: @@ -9421,6 +10491,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.1: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -9588,6 +10662,10 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + is-symbol@1.1.1: dependencies: call-bound: 1.0.4 @@ -9611,6 +10689,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-windows@1.0.2: {} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -9633,6 +10713,27 @@ snapshots: isexe@3.1.1: {} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -9645,10 +10746,17 @@ snapshots: jose@5.10.0: {} + joycon@3.1.1: {} + js-tokens@4.0.0: {} js-tokens@9.0.1: {} + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -9701,6 +10809,10 @@ snapshots: chalk: 5.6.2 diff-match-patch: 1.0.5 + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + jwt-decode@4.0.0: {} keyv@4.5.4: @@ -9771,6 +10883,10 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + listhen@1.9.0: dependencies: '@parcel/watcher': 2.5.1 @@ -9799,12 +10915,23 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 + load-tsconfig@0.2.5: {} + + local-pkg@0.5.1: + dependencies: + mlly: 1.8.0 + pkg-types: 1.3.1 + local-pkg@1.1.2: dependencies: mlly: 1.8.0 pkg-types: 2.3.0 quansync: 0.2.11 + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -9815,12 +10942,18 @@ snapshots: lodash.merge@4.6.2: {} + lodash.startcase@4.4.0: {} + lodash@4.17.21: {} loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + lru-cache@10.4.3: {} lru-cache@11.2.4: {} @@ -9844,6 +10977,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 + magicast@0.5.1: dependencies: '@babel/parser': 7.28.5 @@ -9856,6 +10995,10 @@ snapshots: type-fest: 4.41.0 web-worker: 1.2.0 + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + math-intrinsics@1.1.0: {} mdn-data@2.12.2: {} @@ -9936,10 +11079,18 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + mri@1.2.0: {} + ms@2.0.0: {} ms@2.1.3: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -10168,6 +11319,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + outdent@0.5.0: {} + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -10178,18 +11331,42 @@ snapshots: dependencies: p-timeout: 6.1.4 + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-limit@5.0.0: + dependencies: + yocto-queue: 1.2.2 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 + p-map@2.1.0: {} + p-timeout@6.1.4: {} + p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + package-manager-detector@1.6.0: {} parent-module@1.0.1: @@ -10253,6 +11430,8 @@ snapshots: pathe@2.0.3: {} + pathval@1.1.1: {} + perfect-debounce@2.0.0: {} picocolors@1.1.1: {} @@ -10265,6 +11444,10 @@ snapshots: pify@3.0.0: {} + pify@4.0.1: {} + + pirates@4.0.7: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -10279,6 +11462,14 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.6.1 + postcss: 8.5.6 + tsx: 4.20.6 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -10294,6 +11485,8 @@ snapshots: prelude-ls@1.2.1: {} + prettier@2.8.8: {} + prettier@3.7.1: {} pretty-bytes@7.1.0: {} @@ -10304,6 +11497,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + pretty-format@3.8.0: {} pretty-ms@7.0.1: @@ -10427,6 +11626,13 @@ snapshots: normalize-package-data: 2.5.0 path-type: 3.0.0 + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.2 + pify: 4.0.1 + strip-bom: 3.0.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -10832,6 +12038,11 @@ snapshots: source-map@0.7.6: {} + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -10846,6 +12057,8 @@ snapshots: spdx-license-ids@3.0.22: {} + sprintf-js@1.0.3: {} + srvx@0.8.16: {} stackback@0.0.2: {} @@ -10948,10 +12161,24 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + super-regex@1.1.0: dependencies: function-timeout: 1.0.2 @@ -11018,6 +12245,8 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 + term-size@2.2.1: {} + terser@5.44.1: dependencies: '@jridgewell/source-map': 0.3.11 @@ -11025,6 +12254,12 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + text-decoder@1.2.3: dependencies: b4a: 1.7.3 @@ -11033,6 +12268,14 @@ snapshots: text-table@0.2.0: {} + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + throttleit@2.1.0: {} time-span@5.1.0: @@ -11045,6 +12288,8 @@ snapshots: tinybench@2.9.0: {} + tinyexec@0.3.2: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: @@ -11052,10 +12297,14 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@0.8.4: {} + tinyrainbow@3.0.3: {} tinyspawn@1.5.5: {} + tinyspy@2.2.1: {} + tldts-core@7.0.19: {} tldts@7.0.19: @@ -11078,16 +12327,48 @@ snapshots: dependencies: punycode: 2.3.1 + tree-kill@1.2.2: {} + ts-api-utils@1.4.3(typescript@5.9.3): dependencies: typescript: 5.9.3 + ts-interface-checker@0.1.13: {} + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 tslib@2.8.1: {} + tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@4.9.5): + dependencies: + bundle-require: 5.1.0(esbuild@0.27.0) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.0 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6) + resolve-from: 5.0.0 + rollup: 4.53.3 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.6 + typescript: 4.9.5 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsx@4.20.6: dependencies: esbuild: 0.25.12 @@ -11099,6 +12380,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.1.0: {} + type-fest@0.20.2: {} type-fest@4.41.0: {} @@ -11140,6 +12423,8 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typescript@4.9.5: {} + typescript@5.9.3: {} ufo@1.6.1: {} @@ -11203,6 +12488,8 @@ snapshots: unplugin: 2.3.11 unplugin-utils: 0.3.1 + universalify@0.1.2: {} + unpic@4.2.2: {} unplugin-utils@0.3.1: @@ -11398,6 +12685,24 @@ snapshots: - xml2js - yaml + vite-node@1.6.1(@types/node@18.19.130)(lightningcss@1.30.2)(terser@5.44.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.21(@types/node@18.19.130)(lightningcss@1.30.2)(terser@5.44.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)): dependencies: debug: 4.4.3 @@ -11409,6 +12714,17 @@ snapshots: - supports-color - typescript + vite@5.4.21(@types/node@18.19.130)(lightningcss@1.30.2)(terser@5.44.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.53.3 + optionalDependencies: + '@types/node': 18.19.130 + fsevents: 2.3.3 + lightningcss: 1.30.2 + terser: 5.44.1 + vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6): dependencies: esbuild: 0.25.12 @@ -11445,6 +12761,41 @@ snapshots: optionalDependencies: vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vitest@1.6.1(@types/node@18.19.130)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.2 + chai: 4.5.0 + debug: 4.4.3 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.21 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.10.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.21(@types/node@18.19.130)(lightningcss@1.30.2)(terser@5.44.1) + vite-node: 1.6.1(@types/node@18.19.130)(lightningcss@1.30.2)(terser@5.44.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 18.19.130 + jsdom: 27.3.0(postcss@8.5.6) + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jiti@2.6.1)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6): dependencies: '@vitest/expect': 4.0.15 @@ -11660,6 +13011,8 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.2.2: {} + youch-core@0.3.3: dependencies: '@poppinss/exception': 1.2.2 From 8e2f03651c2db39ca445e85ffef3da3f940f302d Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sat, 13 Dec 2025 21:02:00 -0500 Subject: [PATCH 35/48] fix: bump version --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 26c6965..bb1008a 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@auth/core": "0.37.0", "@convex-dev/auth": "^0.0.90", "@convex-dev/migrations": "^0.3.1", - "@crate.ai/discogs-sdk": "^2.3.0", + "@crate.ai/discogs-sdk": "^2.4.1", "@fontsource-variable/inter": "^5.2.8", "@hookform/resolvers": "^3.9.0", "@opentelemetry/api": "^1.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c374dd..f15adc5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^0.3.1 version: 0.3.1(convex@1.29.3(react@18.3.1)) '@crate.ai/discogs-sdk': - specifier: ^2.3.0 - version: 2.4.0 + specifier: ^2.4.1 + version: 2.4.1 '@fontsource-variable/inter': specifier: ^5.2.8 version: 5.2.8 @@ -612,8 +612,8 @@ packages: peerDependencies: convex: ^1.24.8 - '@crate.ai/discogs-sdk@2.4.0': - resolution: {integrity: sha512-OD4hwfeDUO0cdWnRd6GJDwmQyxCGw3vUXQwxJH4oFtsAEckzRdzEZzu9lf2Q4lGlSce3i+juTrCFUk5dLaYzIQ==} + '@crate.ai/discogs-sdk@2.4.1': + resolution: {integrity: sha512-+Nu33eGU/ITHZA+/Tsd1Czfoe0pXoTpr+81zME+IAa2Z0Md2ntCmHy45OF0dIKe79WxpX5DL+kchOhA3TSpQoQ==} engines: {node: '>=18.0.0'} '@cspotcode/source-map-support@0.8.1': @@ -7063,7 +7063,7 @@ snapshots: dependencies: convex: 1.29.3(react@18.3.1) - '@crate.ai/discogs-sdk@2.4.0': {} + '@crate.ai/discogs-sdk@2.4.1': {} '@cspotcode/source-map-support@0.8.1': dependencies: From 0eb1e0813a0ee61b2bbb71b0e3f13fe1fffcd36e Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sun, 14 Dec 2025 10:07:54 -0500 Subject: [PATCH 36/48] fix(discogs): handle OAuth handshake in app routes for Workers Bypass SDK OAuth handler in Workers by calling Discogs oauth/request_token and oauth/access_token directly, constructing a PLAINTEXT OAuth header with literal '&' in oauth_signature. Keeps discogs-sdk for normal API calls (identity/profile, collection, search). --- app/api/auth/discogs/request-token.ts | 89 ++++++++++++++++----------- 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 9303aec..9c28663 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -1,6 +1,6 @@ import { createFileRoute } from '@tanstack/react-router'; import { serialize } from 'cookie'; -import { createDiscogsSDK } from '@/lib/config/discogs'; +import { getDiscogsCredentials } from '@/lib/config/env'; // Allowed origins for OAuth redirects (security allowlist) const ALLOWED_ORIGINS = [ @@ -32,51 +32,70 @@ function isSecureOrigin(origin: string): boolean { return origin.startsWith('https://'); } +const DISCOGS_API_BASE = 'https://api.discogs.com'; +const DISCOGS_AUTHORIZE_BASE = 'https://www.discogs.com/oauth/authorize'; + +function oauthNonce(): string { + return `${Date.now()}${Math.random().toString().slice(2)}`; +} + +function oauthTimestamp(): string { + return Math.floor(Date.now() / 1000).toString(); +} + +function buildOAuthHeader(params: Record): string { + const parts = Object.entries(params).map(([k, v]) => `${k}="${v}"`); + return `OAuth ${parts.join(',')}`; +} + export const Route = createFileRoute('/api/auth/discogs/request-token')({ server: { handlers: { GET: async ({ request }) => { try { const baseUrl = getValidatedOrigin(request.url); + const callbackUrl = `${baseUrl}/api/auth/discogs/callback`; + const { consumerKey, consumerSecret } = getDiscogsCredentials(); - const sdk = createDiscogsSDK({ - callbackUrl: `${baseUrl}/api/auth/discogs/callback`, + if (!consumerKey || !consumerSecret) { + throw new Error('Discogs credentials are not configured'); + } + + // OAuth 1.0a PLAINTEXT: + // oauth_signature MUST be literal `${consumerSecret}&` (no encodeURIComponent on the signature value). + const authHeader = buildOAuthHeader({ + oauth_consumer_key: consumerKey, + oauth_nonce: oauthNonce(), + oauth_callback: encodeURIComponent(callbackUrl), + oauth_signature: `${consumerSecret}&`, + oauth_signature_method: 'PLAINTEXT', + oauth_timestamp: oauthTimestamp(), + oauth_version: '1.0', + }); + + const res = await fetch(`${DISCOGS_API_BASE}/oauth/request_token`, { + method: 'POST', + headers: { + Authorization: authHeader, + 'Content-Type': 'application/x-www-form-urlencoded', + // Discogs recommends providing a UA + 'User-Agent': 'CrateApp/1.0 +https://crate.ai', + }, }); - const requestTokenResponse = await sdk.auth - .getRequestToken() - .catch(async (error: unknown) => { - const response = (() => { - if (!error || typeof error !== 'object') return undefined; - if (!('response' in error)) return undefined; - const { response } = error as { response?: unknown }; - return response; - })(); - - const responseText = - response && - typeof response === 'object' && - 'text' in response && - typeof (response as { text?: unknown }).text === 'function' - ? await (response as { text: () => Promise }).text() - : ''; - - if (responseText.includes('Authentication Required')) { - throw new Error( - 'Vercel authentication is blocking the request.', - ); - } - throw error; - }); - - if ( - !requestTokenResponse?.requestTokens?.token || - !requestTokenResponse?.requestTokens?.secret - ) { + const text = await res.text(); + if (!res.ok) { + throw new Error(`HTTP error ${res.status}: ${text}`); + } + + const params = new URLSearchParams(text); + const token = params.get('oauth_token'); + const secret = params.get('oauth_token_secret'); + + if (!token || !secret) { throw new Error('Invalid response from Discogs'); } - const { token, secret } = requestTokenResponse.requestTokens; const headers = new Headers(); const secureCookie = isSecureOrigin(baseUrl); @@ -102,7 +121,7 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ return Response.json( { - authUrl: requestTokenResponse.verificationURL, + authUrl: `${DISCOGS_AUTHORIZE_BASE}?oauth_token=${token}`, requestToken: token, requestTokenSecret: secret, }, From 6f8700a89e6d920a8cf1853637859c7c3634aa33 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sun, 14 Dec 2025 14:09:57 -0500 Subject: [PATCH 37/48] debug(discogs): return safe OAuth header diagnostics on failure --- app/api/auth/discogs/request-token.ts | 39 ++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 9c28663..87c3a25 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -1,6 +1,6 @@ import { createFileRoute } from '@tanstack/react-router'; import { serialize } from 'cookie'; -import { getDiscogsCredentials } from '@/lib/config/env'; +import { getDiscogsCredentials, getEnvironment } from '@/lib/config/env'; // Allowed origins for OAuth redirects (security allowlist) const ALLOWED_ORIGINS = [ @@ -48,6 +48,12 @@ function buildOAuthHeader(params: Record): string { return `OAuth ${parts.join(',')}`; } +function mask(value: string, visiblePrefix = 4): string { + if (!value) return ''; + if (value.length <= visiblePrefix) return `${value.slice(0, 1)}***`; + return `${value.slice(0, visiblePrefix)}***`; +} + export const Route = createFileRoute('/api/auth/discogs/request-token')({ server: { handlers: { @@ -56,6 +62,7 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const baseUrl = getValidatedOrigin(request.url); const callbackUrl = `${baseUrl}/api/auth/discogs/callback`; const { consumerKey, consumerSecret } = getDiscogsCredentials(); + const envName = getEnvironment() ?? 'development'; if (!consumerKey || !consumerSecret) { throw new Error('Discogs credentials are not configured'); @@ -63,11 +70,12 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ // OAuth 1.0a PLAINTEXT: // oauth_signature MUST be literal `${consumerSecret}&` (no encodeURIComponent on the signature value). + const oauthSignature = `${consumerSecret}&`; const authHeader = buildOAuthHeader({ oauth_consumer_key: consumerKey, oauth_nonce: oauthNonce(), oauth_callback: encodeURIComponent(callbackUrl), - oauth_signature: `${consumerSecret}&`, + oauth_signature: oauthSignature, oauth_signature_method: 'PLAINTEXT', oauth_timestamp: oauthTimestamp(), oauth_version: '1.0', @@ -85,7 +93,32 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const text = await res.text(); if (!res.ok) { - throw new Error(`HTTP error ${res.status}: ${text}`); + const debug = + envName !== 'production' + ? { + env: envName, + baseUrl, + callbackUrl, + consumerKeyPrefix: mask(consumerKey), + consumerSecretPrefix: mask(consumerSecret), + oauthSignatureHasAmpersand: oauthSignature.includes('&'), + oauthSignatureHasPercent26: oauthSignature.includes('%26'), + oauthSignatureEndsWithAmpersand: oauthSignature.endsWith('&'), + oauthCallbackEncoded: encodeURIComponent(callbackUrl), + authHeaderHasOauthSignature: authHeader.includes( + 'oauth_signature="', + ), + // Never return secrets; only structural sanity checks. + authHeaderContainsPercentChar: authHeader.includes('%'), + } + : undefined; + return Response.json( + { + error: `HTTP error ${res.status}: ${text}`, + debug, + }, + { status: 500 }, + ); } const params = new URLSearchParams(text); From 146033bc5bca168481cb16a230fd51a19cf5187e Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sun, 14 Dec 2025 15:06:38 -0500 Subject: [PATCH 38/48] fix(discogs): percent-encode oauth_signature in OAuth header Discogs/Workers parsing appears sensitive to raw '&' inside oauth_signature. Encode the PLAINTEXT signature value so '&' becomes '%26' in the header. Also keep safe debug flags in request-token failures. --- app/api/auth/discogs/request-token.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 87c3a25..80065c1 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -69,13 +69,15 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ } // OAuth 1.0a PLAINTEXT: - // oauth_signature MUST be literal `${consumerSecret}&` (no encodeURIComponent on the signature value). - const oauthSignature = `${consumerSecret}&`; + // Send oauth_signature percent-encoded inside the Authorization header. + // Discogs/Workers parsing is sensitive to raw '&' in oauth_signature value. + const oauthSignatureRaw = `${consumerSecret}&`; + const oauthSignatureParam = encodeURIComponent(oauthSignatureRaw); const authHeader = buildOAuthHeader({ oauth_consumer_key: consumerKey, oauth_nonce: oauthNonce(), oauth_callback: encodeURIComponent(callbackUrl), - oauth_signature: oauthSignature, + oauth_signature: oauthSignatureParam, oauth_signature_method: 'PLAINTEXT', oauth_timestamp: oauthTimestamp(), oauth_version: '1.0', @@ -101,15 +103,17 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ callbackUrl, consumerKeyPrefix: mask(consumerKey), consumerSecretPrefix: mask(consumerSecret), - oauthSignatureHasAmpersand: oauthSignature.includes('&'), - oauthSignatureHasPercent26: oauthSignature.includes('%26'), - oauthSignatureEndsWithAmpersand: oauthSignature.endsWith('&'), + oauthSignatureRawEndsWithAmpersand: + oauthSignatureRaw.endsWith('&'), + oauthSignatureParamHasPercent26: + oauthSignatureParam.includes('%26'), oauthCallbackEncoded: encodeURIComponent(callbackUrl), authHeaderHasOauthSignature: authHeader.includes( 'oauth_signature="', ), // Never return secrets; only structural sanity checks. authHeaderContainsPercentChar: authHeader.includes('%'), + authHeaderHasPercent26: authHeader.includes('%26'), } : undefined; return Response.json( From dbfc807e3f117463e7717b5a1f8023ce5a8e4781 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sun, 14 Dec 2025 15:07:42 -0500 Subject: [PATCH 39/48] fix: format --- app/api/auth/discogs/request-token.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 80065c1..8570a4a 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -108,9 +108,8 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ oauthSignatureParamHasPercent26: oauthSignatureParam.includes('%26'), oauthCallbackEncoded: encodeURIComponent(callbackUrl), - authHeaderHasOauthSignature: authHeader.includes( - 'oauth_signature="', - ), + authHeaderHasOauthSignature: + authHeader.includes('oauth_signature="'), // Never return secrets; only structural sanity checks. authHeaderContainsPercentChar: authHeader.includes('%'), authHeaderHasPercent26: authHeader.includes('%26'), From bbd54c3be5362032351df0690115bb1ff2bb78b2 Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sun, 14 Dec 2025 15:15:58 -0500 Subject: [PATCH 40/48] fix(discogs): send OAuth params in POST body (Workers-safe) Avoid Authorization header parsing/mutation in Workers by sending OAuth 1.0a params as application/x-www-form-urlencoded POST body for request_token and access_token endpoints. --- app/api/auth/discogs/request-token.ts | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 8570a4a..0dd6935 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -43,11 +43,6 @@ function oauthTimestamp(): string { return Math.floor(Date.now() / 1000).toString(); } -function buildOAuthHeader(params: Record): string { - const parts = Object.entries(params).map(([k, v]) => `${k}="${v}"`); - return `OAuth ${parts.join(',')}`; -} - function mask(value: string, visiblePrefix = 4): string { if (!value) return ''; if (value.length <= visiblePrefix) return `${value.slice(0, 1)}***`; @@ -73,11 +68,14 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ // Discogs/Workers parsing is sensitive to raw '&' in oauth_signature value. const oauthSignatureRaw = `${consumerSecret}&`; const oauthSignatureParam = encodeURIComponent(oauthSignatureRaw); - const authHeader = buildOAuthHeader({ + // IMPORTANT: Avoid Authorization header on Workers. + // OAuth 1.0 allows sending OAuth params in POST body for + // application/x-www-form-urlencoded requests. + const oauthParams = new URLSearchParams({ oauth_consumer_key: consumerKey, oauth_nonce: oauthNonce(), - oauth_callback: encodeURIComponent(callbackUrl), - oauth_signature: oauthSignatureParam, + oauth_callback: callbackUrl, + oauth_signature: oauthSignatureRaw, // URLSearchParams will encode oauth_signature_method: 'PLAINTEXT', oauth_timestamp: oauthTimestamp(), oauth_version: '1.0', @@ -86,11 +84,11 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ const res = await fetch(`${DISCOGS_API_BASE}/oauth/request_token`, { method: 'POST', headers: { - Authorization: authHeader, 'Content-Type': 'application/x-www-form-urlencoded', // Discogs recommends providing a UA 'User-Agent': 'CrateApp/1.0 +https://crate.ai', }, + body: oauthParams.toString(), }); const text = await res.text(); @@ -108,11 +106,12 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ oauthSignatureParamHasPercent26: oauthSignatureParam.includes('%26'), oauthCallbackEncoded: encodeURIComponent(callbackUrl), - authHeaderHasOauthSignature: - authHeader.includes('oauth_signature="'), - // Never return secrets; only structural sanity checks. - authHeaderContainsPercentChar: authHeader.includes('%'), - authHeaderHasPercent26: authHeader.includes('%26'), + // Body encoding checks (safe; no secrets) + bodyHasOauthSignature: oauthParams + .toString() + .includes('oauth_signature='), + bodyContainsPercentChar: oauthParams.toString().includes('%'), + bodyHasPercent26: oauthParams.toString().includes('%26'), } : undefined; return Response.json( From 7a1f77c51ffd753d27d311664679a8769619d15a Mon Sep 17 00:00:00 2001 From: Ahmed felfel <36571501+paprikaf@users.noreply.github.com> Date: Sun, 14 Dec 2025 15:18:18 -0500 Subject: [PATCH 41/48] chore: format --- app/api/auth/discogs/request-token.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 0dd6935..5a26e7e 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -110,7 +110,9 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ bodyHasOauthSignature: oauthParams .toString() .includes('oauth_signature='), - bodyContainsPercentChar: oauthParams.toString().includes('%'), + bodyContainsPercentChar: oauthParams + .toString() + .includes('%'), bodyHasPercent26: oauthParams.toString().includes('%26'), } : undefined; From 7eaeeb427a5911fe7f6f231381bbba6f763e1853 Mon Sep 17 00:00:00 2001 From: gov Date: Wed, 17 Dec 2025 12:37:35 -0500 Subject: [PATCH 42/48] fix: bad conflict res --- .eslintrc.json | 1 - 1 file changed, 1 deletion(-) diff --git a/.eslintrc.json b/.eslintrc.json index 2ffb2ae..566d650 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -13,7 +13,6 @@ "convex/_generated", "routeTree.gen.ts", "context-repos", - "__tests__" "__tests__", "context-repos" ], From 4b9d3067c2be3b112dd9c1588480b91971aab598 Mon Sep 17 00:00:00 2001 From: gov Date: Wed, 17 Dec 2025 15:19:00 -0500 Subject: [PATCH 43/48] fix: add better observability for discogs route --- app/api/auth/discogs/request-token.ts | 45 +++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/app/api/auth/discogs/request-token.ts b/app/api/auth/discogs/request-token.ts index 5a26e7e..bf2bea9 100644 --- a/app/api/auth/discogs/request-token.ts +++ b/app/api/auth/discogs/request-token.ts @@ -53,11 +53,16 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ server: { handlers: { GET: async ({ request }) => { + const envName = getEnvironment() ?? 'development'; + let stage = 'init'; + try { + stage = 'validation'; const baseUrl = getValidatedOrigin(request.url); const callbackUrl = `${baseUrl}/api/auth/discogs/callback`; + + stage = 'configuration'; const { consumerKey, consumerSecret } = getDiscogsCredentials(); - const envName = getEnvironment() ?? 'development'; if (!consumerKey || !consumerSecret) { throw new Error('Discogs credentials are not configured'); @@ -81,6 +86,11 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ oauth_version: '1.0', }); + stage = 'upstream_request'; + console.log( + `[Discogs Auth] Requesting token from ${DISCOGS_API_BASE}`, + ); + const res = await fetch(`${DISCOGS_API_BASE}/oauth/request_token`, { method: 'POST', headers: { @@ -92,7 +102,15 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ }); const text = await res.text(); + if (!res.ok) { + stage = 'upstream_error'; + console.error('[Discogs Auth] Upstream error:', { + status: res.status, + statusText: res.statusText, + body: text, + }); + const debug = envName !== 'production' ? { @@ -116,21 +134,25 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ bodyHasPercent26: oauthParams.toString().includes('%26'), } : undefined; + return Response.json( { - error: `HTTP error ${res.status}: ${text}`, + error: `Upstream error ${res.status}: ${text}`, + stage, debug, }, - { status: 500 }, + { status: 502 }, ); } + stage = 'response_parsing'; const params = new URLSearchParams(text); const token = params.get('oauth_token'); const secret = params.get('oauth_token_secret'); if (!token || !secret) { - throw new Error('Invalid response from Discogs'); + console.error('[Discogs Auth] Invalid response format:', text); + throw new Error('Invalid response from Discogs: missing tokens'); } const headers = new Headers(); @@ -165,14 +187,25 @@ export const Route = createFileRoute('/api/auth/discogs/request-token')({ { headers }, ); } catch (error: unknown) { + console.error(`[Discogs Auth] Error during ${stage}:`, error); + const message = error instanceof Error ? error.message : String(error); - console.error('Error in request token route:', error); + + let status = 500; + if (stage === 'validation') status = 403; + if (stage === 'configuration') status = 503; + return Response.json( { error: message || 'Error getting authorization URL', + stage, + details: + envName !== 'production' && error instanceof Error + ? error.stack + : undefined, }, - { status: 500 }, + { status }, ); } }, From 1190e5410d7a765b482e2fadb9f7ad3eae74f0f3 Mon Sep 17 00:00:00 2001 From: gov Date: Tue, 30 Dec 2025 01:54:50 -0500 Subject: [PATCH 44/48] fix: swap to netlify --- lib/config/env.ts | 41 ++++++++--------------------------------- public/_redirects | 1 + vite.config.ts | 12 +++++------- 3 files changed, 14 insertions(+), 40 deletions(-) create mode 100644 public/_redirects diff --git a/lib/config/env.ts b/lib/config/env.ts index 675e6a4..eb27d83 100644 --- a/lib/config/env.ts +++ b/lib/config/env.ts @@ -1,54 +1,29 @@ /** - * Centralized Environment Configuration for Cloudflare Workers + * Centralized Environment Configuration * * This module provides type-safe access to environment variables/secrets. * - * ## How it works: - * - * Both local development and production use the same access pattern: - * `import { env } from 'cloudflare:workers'` - * - * - **Production**: Secrets are set via `wrangler secret put` in CI/CD - * - **Local Dev**: Secrets are loaded from `.dev.vars` by Miniflare - * - * ## Required files: - * - * - `.dev.vars` - Local development secrets (DO NOT COMMIT) - * ``` - * DISCOGS_CONSUMER_KEY=your_key - * DISCOGS_CONSUMER_SECRET=your_secret - * ``` - * - * - `wrangler.toml` - Non-sensitive env vars in [vars] section - * - * @see https://developers.cloudflare.com/workers/configuration/secrets/ - * @see https://developers.cloudflare.com/workers/local-development/environment-variables/ + * Adapted for Netlify/Node.js environment. */ -import { env as cloudflareEnv } from 'cloudflare:workers'; - /** - * Type definition for Cloudflare environment bindings. - * Add new secrets/vars here as they are added to the project. - * - * To generate types automatically, run: `nr cf-typegen` + * Type definition for Environment variables. */ export interface CloudflareEnv { // Discogs OAuth credentials DISCOGS_CONSUMER_KEY?: string; DISCOGS_CONSUMER_SECRET?: string; - // Environment identifier (set in wrangler.toml [env.*.vars]) + // Environment identifier ENVIRONMENT?: 'development' | 'staging' | 'production'; } /** - * Get the typed Cloudflare environment object. - * - * @returns The environment bindings from Cloudflare Workers runtime + * Get the environment object. + * In Node.js/Netlify, this comes from process.env */ export function getCloudflareEnv(): CloudflareEnv { - return cloudflareEnv as CloudflareEnv; + return (typeof process !== 'undefined' ? process.env : {}) as unknown as CloudflareEnv; } /** @@ -93,5 +68,5 @@ export function hasDiscogsCredentials(): boolean { * @returns 'development', 'staging', or 'production' */ export function getEnvironment(): CloudflareEnv['ENVIRONMENT'] { - return getEnvVar('ENVIRONMENT') as CloudflareEnv['ENVIRONMENT']; + return (getEnvVar('ENVIRONMENT') as CloudflareEnv['ENVIRONMENT']) || 'development'; } diff --git a/public/_redirects b/public/_redirects new file mode 100644 index 0000000..7797f7c --- /dev/null +++ b/public/_redirects @@ -0,0 +1 @@ +/* /index.html 200 diff --git a/vite.config.ts b/vite.config.ts index 0fe1084..bbe2adc 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,5 @@ import { defineConfig } from 'vite'; import { tanstackStart } from '@tanstack/react-start/plugin/vite'; -import { cloudflare } from '@cloudflare/vite-plugin'; import viteReact from '@vitejs/plugin-react'; import tsconfigPaths from 'vite-tsconfig-paths'; import tailwindcss from '@tailwindcss/vite'; @@ -10,18 +9,17 @@ export default defineConfig({ port: 1995, }, plugins: [ - cloudflare({ viteEnvironment: { name: 'ssr' } }), - tailwindcss(), - tsconfigPaths({ - projects: ['./tsconfig.json'], - ignoreConfigErrors: true, - }), tanstackStart({ srcDirectory: '.', router: { routesDirectory: 'app', }, }), + tailwindcss(), + tsconfigPaths({ + projects: ['./tsconfig.json'], + ignoreConfigErrors: true, + }), viteReact(), ], ssr: { From c276f33b6ca49fb394ba5ebeda990b8dc33fe8b0 Mon Sep 17 00:00:00 2001 From: gov Date: Mon, 5 Jan 2026 14:35:48 -0500 Subject: [PATCH 45/48] fix: netflify index file --- .gitignore | 4 +- index.html | 12 + netlify.toml | 6 + package.json | 1 + pnpm-lock.yaml | 2763 +++++++++++++++++++++++++++++++++++++++++++-- public/_redirects | 2 +- vite.config.ts | 2 + 7 files changed, 2713 insertions(+), 77 deletions(-) create mode 100644 index.html create mode 100644 netlify.toml diff --git a/.gitignore b/.gitignore index 25f797a..f6d3cb1 100644 --- a/.gitignore +++ b/.gitignore @@ -60,4 +60,6 @@ context-repos/ .dev.vars # Context repositories (local reference repos, not part of the project) -context-repos/ \ No newline at end of file +context-repos/ +# Local Netlify folder +.netlify diff --git a/index.html b/index.html new file mode 100644 index 0000000..3fd0624 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + Crate + + +
+ + + diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..d15d64f --- /dev/null +++ b/netlify.toml @@ -0,0 +1,6 @@ +[build] + command = "pnpm build" + publish = "dist/client" + +[functions] + directory = "dist/server" diff --git a/package.json b/package.json index bb1008a..2ccad28 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@crate.ai/discogs-sdk": "^2.4.1", "@fontsource-variable/inter": "^5.2.8", "@hookform/resolvers": "^3.9.0", + "@netlify/vite-plugin": "^2.7.19", "@opentelemetry/api": "^1.9.0", "@oslojs/crypto": "^1.0.1", "@radix-ui/react-avatar": "^1.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f15adc5..2a5f827 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: '@hookform/resolvers': specifier: ^3.9.0 version: 3.10.0(react-hook-form@7.66.1(react@18.3.1)) + '@netlify/vite-plugin': + specifier: ^2.7.19 + version: 2.7.19(@netlify/api@14.0.12)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(rollup@4.53.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) '@opentelemetry/api': specifier: ^1.9.0 version: 1.9.0 @@ -76,7 +79,7 @@ importers: version: 1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start': specifier: ^1.139.3 - version: 1.139.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) + version: 1.139.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -161,13 +164,13 @@ importers: version: 27.0.1 '@cloudflare/vite-plugin': specifier: ^1.17.0 - version: 1.17.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))(workerd@1.20251202.0)(wrangler@4.53.0(@cloudflare/workers-types@4.20251209.0)) + version: 1.17.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))(workerd@1.20251202.0)(wrangler@4.53.0(@cloudflare/workers-types@4.20251209.0)) '@cloudflare/workers-types': specifier: ^4.20251209.0 version: 4.20251209.0 '@tailwindcss/vite': specifier: ^4.1.17 - version: 4.1.17(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) + version: 4.1.17(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -197,7 +200,7 @@ importers: version: 7.18.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.1.1(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) + version: 5.1.1(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) convex-test: specifier: ^0.0.41 version: 0.0.41(convex@1.29.3(react@18.3.1)) @@ -227,16 +230,16 @@ importers: version: 5.9.3 vinxi: specifier: ^0.5.8 - version: 0.5.8(@types/node@20.19.25)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + version: 0.5.8(@netlify/blobs@10.5.0)(@types/node@20.19.25)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) vite: specifier: ^7.2.4 - version: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + version: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) + version: 5.1.4(typescript@5.9.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) vitest: specifier: ^4.0.15 - version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jiti@2.6.1)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jiti@2.6.1)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) wrangler: specifier: ^4.53.0 version: 4.53.0(@cloudflare/workers-types@4.20251209.0) @@ -596,6 +599,10 @@ packages: '@cloudflare/workers-types@4.20251209.0': resolution: {integrity: sha512-O+cbUVwgb4NgUB39R1cITbRshlAAPy1UQV0l8xEy2xcZ3wTh3fMl9f5oBwLsVmE9JRhIZx6llCLOBVf53eI5xA==} + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + '@convex-dev/auth@0.0.90': resolution: {integrity: sha512-aqw88EB042HvnaF4wcf/f/wTocmT2Bus2VDQRuV79cM0+8kORM0ICK/ByZ6XsHgQ9qr6TmidNbXm6QAgndrdpQ==} hasBin: true @@ -654,15 +661,26 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + '@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==} + '@dependents/detective-less@5.0.1': + resolution: {integrity: sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==} + engines: {node: '>=18'} + '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@envelop/instrumentation@1.0.0': + resolution: {integrity: sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==} + engines: {node: '>=18.0.0'} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -687,6 +705,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -711,6 +735,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -735,6 +765,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -759,6 +795,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -783,6 +825,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -807,6 +855,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -831,6 +885,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -855,6 +915,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -879,6 +945,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -903,6 +975,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -927,6 +1005,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -951,6 +1035,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -975,6 +1065,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -999,6 +1095,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -1023,6 +1125,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -1047,6 +1155,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -1071,6 +1185,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} @@ -1089,6 +1209,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -1113,6 +1239,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} @@ -1131,6 +1263,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -1155,6 +1293,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} @@ -1167,6 +1311,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -1191,6 +1341,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -1215,6 +1371,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -1239,6 +1401,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -1263,6 +1431,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1281,6 +1455,12 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fastify/accept-negotiator@2.0.1': + resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} + + '@fastify/busboy@3.2.0': + resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -1313,115 +1493,262 @@ packages: 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/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@iarna/toml@2.2.5': + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + '@img/sharp-win32-ia32@0.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@import-maps/resolve@2.0.0': + resolution: {integrity: sha512-RwzRTpmrrS6Q1ZhQExwuxJGK1Wqhv4stt+OF2JzS+uawewpwNyU7EJL1WpBex7aDiiGLs4FsXGkfUBdYuX7xiQ==} + '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -1487,6 +1814,122 @@ packages: engines: {node: '>=18'} hasBin: true + '@netlify/ai@0.3.5': + resolution: {integrity: sha512-7suwHOBy9s14yeWRxt+w3Zh6Rrx8gX7zP/xmsxqxLyJlcBykWm6siBJs2mMtJgbWvcrgI5BEgNLh5qfXlTCsRQ==} + engines: {node: '>=20.6.1'} + peerDependencies: + '@netlify/api': '>=14.0.12' + + '@netlify/api@14.0.12': + resolution: {integrity: sha512-4xSfHAj9PIZZ78YOPby6TBHxYnf6sOE1/jpkHSDyt2oRxF94qJ0fhp96Fo2kq/rIhvgTlU5Ce3HARi8BDY4mLw==} + engines: {node: '>=18.14.0'} + + '@netlify/binary-info@1.0.0': + resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} + + '@netlify/blobs@10.5.0': + resolution: {integrity: sha512-yrdt6H1X56DYz7pS3exU/iHO+iOW5sVzseaQwRQQ9OYChB/pVjXQzkBKAjS9dHIecSpv0oynkLxd/mwSJfAJLQ==} + engines: {node: ^14.16.0 || >=16.0.0} + + '@netlify/cache@3.3.4': + resolution: {integrity: sha512-Fl4/KxP8NS7+skjfRixgekuqBNvLPay/J6qC2mxvHjkkZNu1oUs8QOc+T3Nvt4n+UMrltnt9ggg0q/q4hmBIVw==} + engines: {node: '>=20.6.1'} + + '@netlify/config@24.2.0': + resolution: {integrity: sha512-idc1D6kdQOFjG70aZC06crqElTyaSulVlnOEDZX2+5/vcmfFCBu8CJSEd5YzC6VCCXBgOW3Hw0cVxDTl5X6+CQ==} + engines: {node: '>=18.14.0'} + hasBin: true + + '@netlify/dev-utils@4.3.3': + resolution: {integrity: sha512-qziF8R9kf7mRNgSpmUH96O0aV1ZiwK4c9ZecFQbDSQuYhgy9GY1WTjiQF0oQnohjTjWNtXhrU39LAeXWNLaBJg==} + engines: {node: ^18.14.0 || >=20} + + '@netlify/dev@4.8.7': + resolution: {integrity: sha512-nQwyJwHXgT356VxFbmRN27l5Pr+5UDWEivS8ijX+Jau9DOJeAuSRCHAQ/tSB/P3EIIiJ+Qc0ebjUuAjB4uRztQ==} + engines: {node: '>=20.6.1'} + + '@netlify/edge-bundler@14.9.2': + resolution: {integrity: sha512-qJErMNAW48QnvtAJe0yRtz2urenxHUdFhdVpbWoXWuG4Xlq8D06unjl9OfGnymNsoiwLpLcCjEngSNcdZoTa0w==} + engines: {node: '>=18.14.0'} + + '@netlify/edge-functions-bootstrap@2.16.0': + resolution: {integrity: sha512-v8QQihSbBHj3JxtJsHoepXALpNumD9M7egHoc8z62FYl5it34dWczkaJoFFopEyhiBVKi4K/n0ZYpdzwfujd6g==} + + '@netlify/edge-functions-dev@1.0.7': + resolution: {integrity: sha512-PlkG3PxULQ7z/CSzx5LthGsVtJPOo8E+sA67cOwNq/eHxtwpCUfCPOmxq3AGKqMR1pzUGC6k5yewhgXoG8Zm7w==} + engines: {node: '>=20.6.1'} + + '@netlify/edge-functions@3.0.3': + resolution: {integrity: sha512-grElRK+rTBdYrPsULPKrhcHhrW+fwpDRLPbGByqa6Xrz0fhzcFJ2D9ijxEQ/onFcSVPYHT1u1mI48GhS5bZ/Ag==} + engines: {node: '>=18.0.0'} + + '@netlify/functions-dev@1.1.7': + resolution: {integrity: sha512-0f/yMvc3XZQDbD3BmI0oJiMHXyocO+ovYCoKtjUlLbvmeM35iVIy+G/XuSjBtvjBmiRF0VM++E7X/ACTvB7tzw==} + engines: {node: '>=20.6.1'} + + '@netlify/functions@5.1.2': + resolution: {integrity: sha512-tpPiLSkQatuexH8AdAZ8RlALvT7ixOE9VhvpkzQGNvihcms8hzmvUDuSxQa7UneTj/sHsdirnXmnJ+nmf+Nx/w==} + 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.1.3': + resolution: {integrity: sha512-jVjhHokAQLGI5SJA2nj8OWeNQ7ASV4m0n4aiR4PHrhM8ot385V2BbUGkSpC28M92uqP0l1cbAQaSoSOU4re8iQ==} + engines: {node: '>=20.6.1'} + + '@netlify/images@1.3.3': + resolution: {integrity: sha512-1X3fUmacCLMlPIqyeV5tdo6Wbf9aBSWobgr4DyRvg9zDV9jbKqgdN3BNbcUXmVaqfN+0iiv0k9p02mcRV3OyOw==} + engines: {node: '>=20.6.1'} + + '@netlify/open-api@2.45.0': + resolution: {integrity: sha512-kLysr2N8HQi0qoEq04vpRvrE/fSnZaXJYf1bVxKre2lLaM1RSm05hqDswKTgxM601pZf9h1i1Ea3L4DZNgHb5w==} + engines: {node: '>=14.8.0'} + + '@netlify/otel@5.1.1': + resolution: {integrity: sha512-WCSlOsd0a0Vn+iPC5PYru7rq/5/QpBGnvam6C7cq9DEiTFqfwExNoxk6SWI0T6nI56gkBryaGsENLTEnUue1lg==} + engines: {node: ^18.14.0 || >=20.6.1} + + '@netlify/redirect-parser@15.0.3': + resolution: {integrity: sha512-/HB3fcRRNgf6O/pbLn4EYNDHrU2kiadMMnazg8/OjvQK2S9i4y61vQcrICvDxYKUKQdgeEaABUuaCNAJFnfD9w==} + engines: {node: '>=18.14.0'} + + '@netlify/redirects@3.1.4': + resolution: {integrity: sha512-2FcF/0Q24JA+VmpWlVRp835UvhBHQe3XGVaxAQfHiDd5aXztaz2U5Y4VEZyrZJOubY5xnxr2yqumDfClAiCKxw==} + engines: {node: '>=20.6.1'} + + '@netlify/runtime-utils@2.2.1': + resolution: {integrity: sha512-dyJeuggzQM8+Dsi0T8Z9UjfLJ6vCmNC36W6WE2aqzfTdTw4wPkh2xlEu4LoD75+TGuYK7jIhEoU2QcCXOzfyAQ==} + engines: {node: ^18.14.0 || >=20} + + '@netlify/runtime@4.1.13': + resolution: {integrity: sha512-pnexwAHckodyApbNaHiEzNyVlw+zx33wIwUSAopkq7qU8YYUQbDWIMi5gpGE6FsIvv/CCR8uxMgeIPOBLuVk5Q==} + engines: {node: '>=20.6.1'} + + '@netlify/serverless-functions-api@2.8.2': + resolution: {integrity: sha512-JoesbwNZ6l7D7LDmom0Ae35j1nBORd/nht6dI5ULWW9YeI6Df9C84zmBytdRcY2KafsU1l859UGa6O7nBKxT6Q==} + engines: {node: '>=18.0.0'} + + '@netlify/static@3.1.3': + resolution: {integrity: sha512-88VG2jwWY1eOT/IiMbkrak7qyo+t7om0v731i63JiCDfXjCEp+yFPNr9L4v8S6wcCmgnkGQ6Sr5roF1sEtp6+Q==} + engines: {node: '>=20.6.1'} + + '@netlify/types@2.3.0': + resolution: {integrity: sha512-5gxMWh/S7wr0uHKSTbMv4bjWmWSpwpeLYvErWeVNAPll5/QNFo9aWimMAUuh8ReLY3/fg92XAroVVu7+z27Snw==} + engines: {node: ^18.14.0 || >=20} + + '@netlify/vite-plugin@2.7.19': + resolution: {integrity: sha512-2EFGOqm3tThLTnPqOlPIt8BebP5pZVAAJtpW+eyPQixnyKZKXOd90U8sDowEKykXANMW9s49/5jcJBI+oXcSdA==} + engines: {node: ^20.6.1 || >=22} + peerDependencies: + vite: ^5 || ^6 || ^7 + + '@netlify/zip-it-and-ship-it@14.1.18': + resolution: {integrity: sha512-l3wVvGMrGAjsUlQ4JNUngiyUDlNIqu93UFo+NuJMTC+7h/IeKyNcbcIHm5w0A5W2CmkiZyQgQRo+CfrtujqyPw==} + engines: {node: '>=18.14.0'} + hasBin: true + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1515,23 +1958,79 @@ packages: resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} engines: {node: '>=20.0'} + '@opentelemetry/api-logs@0.203.0': + resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} + engines: {node: '>=8.0.0'} + '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@oslojs/asn1@1.0.0': - resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==} + '@opentelemetry/context-async-hooks@1.30.1': + resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@oslojs/binary@1.0.0': - resolution: {integrity: sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==} + '@opentelemetry/core@1.30.1': + resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@oslojs/crypto@1.0.1': - resolution: {integrity: sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==} + '@opentelemetry/instrumentation@0.203.0': + resolution: {integrity: sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@oslojs/encoding@1.1.0': - resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@opentelemetry/propagator-b3@1.30.1': + resolution: {integrity: sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@panva/hkdf@1.2.1': + '@opentelemetry/propagator-jaeger@1.30.1': + resolution: {integrity: sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/resources@1.30.1': + resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.30.1': + resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@1.30.1': + resolution: {integrity: sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + + '@oslojs/asn1@1.0.0': + resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==} + + '@oslojs/binary@1.0.0': + resolution: {integrity: sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==} + + '@oslojs/crypto@1.0.1': + resolution: {integrity: sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} '@parcel/watcher-android-arm64@2.5.1': @@ -2312,6 +2811,9 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + '@speed-highlight/core@1.2.12': resolution: {integrity: sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA==} @@ -2640,6 +3142,9 @@ packages: '@types/node@22.19.1': resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -2654,6 +3159,15 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2675,10 +3189,22 @@ packages: typescript: optional: true + '@typescript-eslint/project-service@8.52.0': + resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@7.18.0': resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/tsconfig-utils@8.52.0': + resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@7.18.0': resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2693,6 +3219,10 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.52.0': + resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@7.18.0': resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2702,6 +3232,12 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@8.52.0': + resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@7.18.0': resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2712,6 +3248,10 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.52.0': + resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -2731,6 +3271,11 @@ packages: '@upstash/redis@1.35.7': resolution: {integrity: sha512-bdCdKhke+kYUjcLLuGWSeQw7OLuWIx3eyKksyToLBAlGIMX9qiII0ptp8E0y7VFE1yuBxBd/3kSzJ8774Q4g+A==} + '@vercel/nft@0.29.4': + resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} + engines: {node: '>=18'} + hasBin: true + '@vercel/nft@0.30.4': resolution: {integrity: sha512-wE6eAGSXScra60N2l6jWvNtVK0m+sh873CpfZW4KI2v8EHuUQp+mSEi4T+IcdPCSEDgCdAS/7bizbhQlkjzrSA==} engines: {node: '>=18'} @@ -2795,6 +3340,41 @@ packages: '@vitest/utils@4.0.15': resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} + '@vue/compiler-core@3.5.26': + resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==} + + '@vue/compiler-dom@3.5.26': + resolution: {integrity: sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==} + + '@vue/compiler-sfc@3.5.26': + resolution: {integrity: sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==} + + '@vue/compiler-ssr@3.5.26': + resolution: {integrity: sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==} + + '@vue/shared@3.5.26': + resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==} + + '@whatwg-node/disposablestack@0.0.6': + resolution: {integrity: sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/fetch@0.10.13': + resolution: {integrity: sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/node-fetch@0.8.4': + resolution: {integrity: sha512-AlKLc57loGoyYlrzDbejB9EeR+pfdJdGzbYnkEuZaGekFboBwzfVYVMsy88PMriqPI1ORpiGYGgSSWpx7a2sDA==} + engines: {node: '>=18.0.0'} + + '@whatwg-node/promise-helpers@1.3.2': + resolution: {integrity: sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==} + engines: {node: '>=16.0.0'} + + '@whatwg-node/server@0.10.17': + resolution: {integrity: sha512-QxI+HQfJeI/UscFNCTcSri6nrHP25mtyAMbhEri7W2ctdb3EsorPuJz7IovSgNjvKVs73dg9Fmayewx1O2xOxA==} + engines: {node: '>=18.0.0'} + abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} @@ -2845,9 +3425,17 @@ packages: react: optional: true + ajv-errors@3.0.0: + resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} + peerDependencies: + ajv: ^8.0.1 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -2934,6 +3522,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-module-types@6.0.1: + resolution: {integrity: sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==} + engines: {node: '>=18'} + ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} @@ -2988,6 +3580,12 @@ packages: resolution: {integrity: sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==} hasBin: true + 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 + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -3035,10 +3633,16 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-crc32@1.0.0: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} engines: {node: '>=8.0.0'} + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -3075,6 +3679,9 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -3138,6 +3745,9 @@ packages: 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==} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -3168,23 +3778,51 @@ packages: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + 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.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} + color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3192,6 +3830,9 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -3257,6 +3898,10 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} + copy-file@11.1.0: + resolution: {integrity: sha512-X8XDzyvYaA6msMyAM575CUoygY5b44QzLcGRKsK3MFmXcOvQa518dNPLsKYwkYsn72g3EiW+LE0ytd/FlqWmyw==} + engines: {node: '>=18'} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -3269,6 +3914,10 @@ packages: resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} engines: {node: '>= 14'} + cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + croner@9.1.0: resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} engines: {node: '>=18.0'} @@ -3287,6 +3936,10 @@ packages: css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + 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} @@ -3298,6 +3951,13 @@ packages: css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + 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'} + cssstyle@5.3.4: resolution: {integrity: sha512-KyOS/kJMEq5O9GdPnaf82noigg5X5DYn0kZPJTaAsCUaBizp6Xa1y9D4Qoqf/JazEXWuruErHgVXwjN5391ZJw==} engines: {node: '>=20'} @@ -3353,6 +4013,10 @@ packages: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-urls@6.0.0: resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} engines: {node: '>=20'} @@ -3416,12 +4080,23 @@ packages: supports-color: optional: true + decache@4.6.2: + resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} + decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + dedent@1.7.1: + resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-eql@4.1.4: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} @@ -3487,6 +4162,52 @@ packages: 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==} + diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} @@ -3532,6 +4253,14 @@ packages: resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} engines: {node: '>=20'} + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dotenv@17.2.3: resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} @@ -3546,6 +4275,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==} @@ -3561,6 +4293,13 @@ 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'} @@ -3572,6 +4311,9 @@ packages: encoding-sniffer@0.2.1: resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} @@ -3588,6 +4330,14 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.0: + resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==} + 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.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -3644,6 +4394,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3663,6 +4418,11 @@ 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-plugin-react-hooks@7.0.1: resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} engines: {node: '>=18'} @@ -3682,6 +4442,10 @@ packages: 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@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3755,6 +4519,11 @@ packages: extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3775,12 +4544,21 @@ 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==} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -3790,9 +4568,20 @@ packages: picomatch: optional: true + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + fetchdts@0.1.7: resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3808,6 +4597,14 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + filter-obj@6.1.0: + resolution: {integrity: sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA==} + engines: {node: '>=18'} + + 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'} @@ -3816,6 +4613,10 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + find-versions@6.0.0: resolution: {integrity: sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==} engines: {node: '>=18'} @@ -3830,6 +4631,9 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -3858,6 +4662,10 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -3911,6 +4719,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-amd-module-type@6.0.1: + resolution: {integrity: sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==} + engines: {node: '>=18'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -3941,6 +4753,10 @@ packages: 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-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -3994,6 +4810,11 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + goober@2.1.18: resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==} peerDependencies: @@ -4071,6 +4892,10 @@ packages: 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} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -4138,10 +4963,21 @@ packages: 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 + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-in-the-middle@1.15.0: + resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -4150,6 +4986,14 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -4169,6 +5013,10 @@ packages: resolution: {integrity: sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==} engines: {node: '>=12.22.0'} + ipx@3.1.1: + resolution: {integrity: sha512-7Xnt54Dco7uYkfdAw0r2vCly3z0rSaVhEXMzPvl3FndsTVm5p26j+PO+gyinkYmcsEUvX2Rh7OGK7KzYWRu6BA==} + hasBin: true + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -4276,6 +5124,18 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + 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-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -4302,6 +5162,10 @@ 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.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -4318,10 +5182,21 @@ packages: 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-unix@2.0.14: resolution: {integrity: sha512-ZE+Iq0h1pxZu/IGsBKobH5PZ0L3ylv7WHEmKiRG8kEzue6f+w0i3ckwnDY7Ckej2jjq1c7NDYljEkNqOxv4w9A==} engines: {node: '>= 12'} + 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'} @@ -4401,6 +5276,12 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + + js-image-generator@1.0.4: + resolution: {integrity: sha512-ckb7kyVojGAnArouVR+5lBIuwU1fcrn7E/YYSd0FK7oIngAkMmRvHASLro9Zt5SQdWToaI66NybG+OGxPw/HlQ==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4438,6 +5319,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} @@ -4457,6 +5341,24 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + 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'} @@ -4475,10 +5377,22 @@ packages: knitwork@1.3.0: resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==} + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + lambda-local@2.2.0: + resolution: {integrity: sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg==} + engines: {node: '>=8'} + hasBin: true + lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} + 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'} @@ -4588,21 +5502,50 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + 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.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 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'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -4629,6 +5572,10 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -4650,10 +5597,17 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + 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} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} @@ -4661,6 +5615,10 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} + 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==} @@ -4727,6 +5685,9 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -4738,6 +5699,14 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + module-definition@6.0.1: + resolution: {integrity: sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==} + engines: {node: '>=18'} + hasBin: true + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -4759,6 +5728,9 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + netlify-redirector@0.5.0: + resolution: {integrity: sha512-4zdzIP+6muqPCuE8avnrgDJ6KW/2+UpHTRcTbMXCIRxiRmyrX+IZ4WSJGZdHPWF3WmQpXpy603XxecZ9iygN7w==} + next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: @@ -4798,6 +5770,10 @@ 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.2: resolution: {integrity: sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==} engines: {node: '>= 6.13.0'} @@ -4812,6 +5788,14 @@ packages: node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + 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@8.1.0: resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} engines: {node: ^18.17.0 || >=20.5.0} @@ -4820,6 +5804,14 @@ packages: 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'} @@ -4873,6 +5865,9 @@ packages: ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + omit.js@2.0.2: + resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -4880,6 +5875,9 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -4915,6 +5913,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@5.0.0: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} @@ -4927,10 +5929,22 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + 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'} @@ -4939,6 +5953,10 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + p-wait-for@5.0.2: + resolution: {integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==} + engines: {node: '>=12'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -4952,10 +5970,22 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + + parse-imports@2.2.1: + resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==} + engines: {node: '>= 18'} + parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + parse-ms@2.1.0: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} @@ -4980,6 +6010,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -5027,6 +6061,9 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + perfect-debounce@2.0.0: resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} @@ -5041,6 +6078,9 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 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'} @@ -5086,6 +6126,12 @@ packages: yaml: optional: true + postcss-values-parser@6.0.2: + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.2.9 + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -5098,6 +6144,11 @@ packages: preact@10.11.3: resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} + 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'} @@ -5141,6 +6192,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -5154,6 +6208,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quote-unquote@1.0.0: + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} @@ -5250,10 +6307,18 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + 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-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -5261,6 +6326,10 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readable-stream@4.7.0: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5316,6 +6385,9 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -5324,6 +6396,13 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} + engines: {node: '>=8.6.0'} + + require-package-name@2.0.1: + resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -5352,6 +6431,14 @@ packages: 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.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -5403,9 +6490,16 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sax@1.4.3: + resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -5494,6 +6588,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -5548,6 +6646,9 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} + slashes@3.0.12: + resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} @@ -5595,6 +6696,9 @@ packages: engines: {node: '>=20.16.0'} hasBin: true + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -5712,6 +6816,11 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + 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==} @@ -5769,6 +6878,9 @@ packages: text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -5830,6 +6942,13 @@ packages: resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} hasBin: true + 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-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5838,6 +6957,12 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + tomlify-j0.4@3.0.0: + resolution: {integrity: sha512-2Ulkc8T7mXJ2l0W476YC/A209PR38Nw8PuaCNtk9uI3t1zzFdGQeWYGQvmj2PZkVvRC/Yoi4xQKMRnWc/N29tQ==} + tough-cookie@6.0.0: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} @@ -5853,12 +6978,22 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -5948,6 +7083,10 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ulid@3.0.2: + resolution: {integrity: sha512-yu26mwteFYzBAot7KVMqFGCVpsF6g8wXfJzQUHvu1no3+rRRSFcSV2nKeYvNPLD2J4b08jYBDhHUjeH0ygIl9w==} + hasBin: true + ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} @@ -5984,6 +7123,10 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + 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'} @@ -5996,6 +7139,10 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + unixify@1.0.0: + resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} + engines: {node: '>=0.10.0'} + unpic@4.2.2: resolution: {integrity: sha512-z6T2ScMgRV2y2H8MwwhY5xHZWXhUx/YxtOCGJwfURSl7ypVy4HpLIMWoIZKnnxQa/RKzM0kg8hUh0paIrpLfvw==} @@ -6095,6 +7242,12 @@ packages: 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==} + use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -6127,9 +7280,21 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + hasBin: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} @@ -6332,6 +7497,10 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + web-streams-polyfill@4.0.0-beta.3: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} @@ -6403,6 +7572,14 @@ packages: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + engines: {node: '>= 12.0.0'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -6437,6 +7614,10 @@ 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} + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -6472,6 +7653,11 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -6486,6 +7672,11 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -6494,6 +7685,9 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -6536,6 +7730,9 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.3.5: + resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} + zustand@5.0.8: resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==} engines: {node: '>=12.20.0'} @@ -7007,7 +8204,7 @@ snapshots: optionalDependencies: workerd: 1.20251202.0 - '@cloudflare/vite-plugin@1.17.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))(workerd@1.20251202.0)(wrangler@4.53.0(@cloudflare/workers-types@4.20251209.0))': + '@cloudflare/vite-plugin@1.17.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))(workerd@1.20251202.0)(wrangler@4.53.0(@cloudflare/workers-types@4.20251209.0))': dependencies: '@cloudflare/unenv-preset': 2.7.13(unenv@2.0.0-rc.24)(workerd@1.20251202.0) '@remix-run/node-fetch-server': 0.8.1 @@ -7017,7 +8214,7 @@ snapshots: picocolors: 1.1.1 tinyglobby: 0.2.15 unenv: 2.0.0-rc.24 - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) wrangler: 4.53.0(@cloudflare/workers-types@4.20251209.0) ws: 8.18.0 transitivePeerDependencies: @@ -7042,6 +8239,8 @@ snapshots: '@cloudflare/workers-types@4.20251209.0': {} + '@colors/colors@1.6.0': {} + '@convex-dev/auth@0.0.90(@auth/core@0.37.0)(convex@1.29.3(react@18.3.1))(react@18.3.1)': dependencies: '@auth/core': 0.37.0 @@ -7093,6 +8292,12 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} + '@dabh/diagnostics@2.0.8': + dependencies: + '@so-ric/colorspace': 1.1.6 + enabled: 2.0.0 + kuler: 2.0.0 + '@deno/shim-deno-test@0.5.0': {} '@deno/shim-deno@0.19.2': @@ -7100,11 +8305,21 @@ snapshots: '@deno/shim-deno-test': 0.5.0 which: 4.0.0 + '@dependents/detective-less@5.0.1': + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.1 + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true + '@envelop/instrumentation@1.0.0': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -7117,6 +8332,9 @@ snapshots: '@esbuild/aix-ppc64@0.27.0': optional: true + '@esbuild/aix-ppc64@0.27.2': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true @@ -7129,6 +8347,9 @@ snapshots: '@esbuild/android-arm64@0.27.0': optional: true + '@esbuild/android-arm64@0.27.2': + optional: true + '@esbuild/android-arm@0.21.5': optional: true @@ -7141,6 +8362,9 @@ snapshots: '@esbuild/android-arm@0.27.0': optional: true + '@esbuild/android-arm@0.27.2': + optional: true + '@esbuild/android-x64@0.21.5': optional: true @@ -7153,6 +8377,9 @@ snapshots: '@esbuild/android-x64@0.27.0': optional: true + '@esbuild/android-x64@0.27.2': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true @@ -7165,6 +8392,9 @@ snapshots: '@esbuild/darwin-arm64@0.27.0': optional: true + '@esbuild/darwin-arm64@0.27.2': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true @@ -7177,6 +8407,9 @@ snapshots: '@esbuild/darwin-x64@0.27.0': optional: true + '@esbuild/darwin-x64@0.27.2': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true @@ -7189,6 +8422,9 @@ snapshots: '@esbuild/freebsd-arm64@0.27.0': optional: true + '@esbuild/freebsd-arm64@0.27.2': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true @@ -7201,6 +8437,9 @@ snapshots: '@esbuild/freebsd-x64@0.27.0': optional: true + '@esbuild/freebsd-x64@0.27.2': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true @@ -7213,6 +8452,9 @@ snapshots: '@esbuild/linux-arm64@0.27.0': optional: true + '@esbuild/linux-arm64@0.27.2': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true @@ -7225,6 +8467,9 @@ snapshots: '@esbuild/linux-arm@0.27.0': optional: true + '@esbuild/linux-arm@0.27.2': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true @@ -7237,6 +8482,9 @@ snapshots: '@esbuild/linux-ia32@0.27.0': optional: true + '@esbuild/linux-ia32@0.27.2': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true @@ -7249,6 +8497,9 @@ snapshots: '@esbuild/linux-loong64@0.27.0': optional: true + '@esbuild/linux-loong64@0.27.2': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true @@ -7261,6 +8512,9 @@ snapshots: '@esbuild/linux-mips64el@0.27.0': optional: true + '@esbuild/linux-mips64el@0.27.2': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true @@ -7273,6 +8527,9 @@ snapshots: '@esbuild/linux-ppc64@0.27.0': optional: true + '@esbuild/linux-ppc64@0.27.2': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true @@ -7285,6 +8542,9 @@ snapshots: '@esbuild/linux-riscv64@0.27.0': optional: true + '@esbuild/linux-riscv64@0.27.2': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true @@ -7297,6 +8557,9 @@ snapshots: '@esbuild/linux-s390x@0.27.0': optional: true + '@esbuild/linux-s390x@0.27.2': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true @@ -7309,6 +8572,9 @@ snapshots: '@esbuild/linux-x64@0.27.0': optional: true + '@esbuild/linux-x64@0.27.2': + optional: true + '@esbuild/netbsd-arm64@0.25.12': optional: true @@ -7318,6 +8584,9 @@ snapshots: '@esbuild/netbsd-arm64@0.27.0': optional: true + '@esbuild/netbsd-arm64@0.27.2': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true @@ -7330,6 +8599,9 @@ snapshots: '@esbuild/netbsd-x64@0.27.0': optional: true + '@esbuild/netbsd-x64@0.27.2': + optional: true + '@esbuild/openbsd-arm64@0.25.12': optional: true @@ -7339,6 +8611,9 @@ snapshots: '@esbuild/openbsd-arm64@0.27.0': optional: true + '@esbuild/openbsd-arm64@0.27.2': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true @@ -7351,12 +8626,18 @@ snapshots: '@esbuild/openbsd-x64@0.27.0': optional: true + '@esbuild/openbsd-x64@0.27.2': + optional: true + '@esbuild/openharmony-arm64@0.25.12': optional: true '@esbuild/openharmony-arm64@0.27.0': optional: true + '@esbuild/openharmony-arm64@0.27.2': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true @@ -7369,6 +8650,9 @@ snapshots: '@esbuild/sunos-x64@0.27.0': optional: true + '@esbuild/sunos-x64@0.27.2': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true @@ -7381,6 +8665,9 @@ snapshots: '@esbuild/win32-arm64@0.27.0': optional: true + '@esbuild/win32-arm64@0.27.2': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true @@ -7393,6 +8680,9 @@ snapshots: '@esbuild/win32-ia32@0.27.0': optional: true + '@esbuild/win32-ia32@0.27.2': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true @@ -7405,6 +8695,9 @@ snapshots: '@esbuild/win32-x64@0.27.0': optional: true + '@esbuild/win32-x64@0.27.2': + optional: true + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -7428,6 +8721,10 @@ snapshots: '@eslint/js@8.57.1': {} + '@fastify/accept-negotiator@2.0.1': {} + + '@fastify/busboy@3.2.0': {} + '@floating-ui/core@1.7.3': dependencies: '@floating-ui/utils': 0.2.10 @@ -7461,83 +8758,185 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} + '@humanwhocodes/momoa@2.0.4': {} + '@humanwhocodes/object-schema@2.0.3': {} + '@iarna/toml@2.2.5': {} + + '@img/colour@1.0.0': {} + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': optional: true + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.7.1 optional: true + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.7.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + '@img/sharp-win32-ia32@0.33.5': optional: true + '@img/sharp-win32-ia32@0.34.5': + optional: true + '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@import-maps/resolve@2.0.0': {} + '@inquirer/external-editor@1.0.3(@types/node@18.19.130)': dependencies: chardet: 2.1.1 @@ -7595,35 +8994,367 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@kikobeats/time-span@1.0.11': {} + '@kikobeats/time-span@1.0.11': {} + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.4 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.4 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.7.3 + tar: 7.5.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@netlify/ai@0.3.5(@netlify/api@14.0.12)': + dependencies: + '@netlify/api': 14.0.12 + + '@netlify/api@14.0.12': + dependencies: + '@netlify/open-api': 2.45.0 + node-fetch: 3.3.2 + p-wait-for: 5.0.2 + picoquery: 2.5.0 + + '@netlify/binary-info@1.0.0': {} + + '@netlify/blobs@10.5.0': + dependencies: + '@netlify/dev-utils': 4.3.3 + '@netlify/otel': 5.1.1 + '@netlify/runtime-utils': 2.2.1 + transitivePeerDependencies: + - supports-color + + '@netlify/cache@3.3.4': + dependencies: + '@netlify/runtime-utils': 2.2.1 + + '@netlify/config@24.2.0': + dependencies: + '@iarna/toml': 2.2.5 + '@netlify/api': 14.0.12 + '@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.2 + yargs: 17.7.2 + zod: 4.3.5 + + '@netlify/dev-utils@4.3.3': + dependencies: + '@whatwg-node/server': 0.10.17 + ansis: 4.2.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.3 + tmp-promise: 3.0.3 + uuid: 13.0.0 + write-file-atomic: 5.0.1 + + '@netlify/dev@4.8.7(@netlify/api@14.0.12)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(rollup@4.53.3)': + dependencies: + '@netlify/ai': 0.3.5(@netlify/api@14.0.12) + '@netlify/blobs': 10.5.0 + '@netlify/config': 24.2.0 + '@netlify/dev-utils': 4.3.3 + '@netlify/edge-functions-dev': 1.0.7 + '@netlify/functions-dev': 1.1.7(rollup@4.53.3) + '@netlify/headers': 2.1.3 + '@netlify/images': 1.3.3(@netlify/blobs@10.5.0)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2) + '@netlify/redirects': 3.1.4 + '@netlify/runtime': 4.1.13 + '@netlify/static': 3.1.3 + ulid: 3.0.2 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/api' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - db0 + - encoding + - idb-keyval + - ioredis + - react-native-b4a + - rollup + - supports-color + - uploadthing + + '@netlify/edge-bundler@14.9.2': + 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.27.2 + 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.5.2 + tmp-promise: 3.0.3 + urlpattern-polyfill: 8.0.2 + uuid: 11.1.0 + + '@netlify/edge-functions-bootstrap@2.16.0': {} + + '@netlify/edge-functions-dev@1.0.7': + dependencies: + '@netlify/dev-utils': 4.3.3 + '@netlify/edge-bundler': 14.9.2 + '@netlify/edge-functions': 3.0.3 + '@netlify/edge-functions-bootstrap': 2.16.0 + '@netlify/runtime-utils': 2.2.1 + get-port: 7.1.0 + + '@netlify/edge-functions@3.0.3': + dependencies: + '@netlify/types': 2.3.0 + + '@netlify/functions-dev@1.1.7(rollup@4.53.3)': + dependencies: + '@netlify/blobs': 10.5.0 + '@netlify/dev-utils': 4.3.3 + '@netlify/functions': 5.1.2 + '@netlify/zip-it-and-ship-it': 14.1.18(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 + semver: 7.7.3 + source-map-support: 0.5.21 + transitivePeerDependencies: + - bare-abort-controller + - encoding + - react-native-b4a + - rollup + - supports-color + + '@netlify/functions@5.1.2': + dependencies: + '@netlify/types': 2.3.0 + + '@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 + + '@netlify/headers@2.1.3': + dependencies: + '@netlify/headers-parser': 9.0.2 + + '@netlify/images@1.3.3(@netlify/blobs@10.5.0)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)': + dependencies: + ipx: 3.1.1(@netlify/blobs@10.5.0)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2) + 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 + + '@netlify/open-api@2.45.0': {} + + '@netlify/otel@5.1.1': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 1.30.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@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 + + '@netlify/redirects@3.1.4': + dependencies: + '@netlify/dev-utils': 4.3.3 + '@netlify/redirect-parser': 15.0.3 + cookie: 1.1.1 + jsonwebtoken: 9.0.2 + netlify-redirector: 0.5.0 + + '@netlify/runtime-utils@2.2.1': {} + + '@netlify/runtime@4.1.13': + dependencies: + '@netlify/blobs': 10.5.0 + '@netlify/cache': 3.3.4 + '@netlify/runtime-utils': 2.2.1 + '@netlify/types': 2.3.0 + transitivePeerDependencies: + - supports-color + + '@netlify/serverless-functions-api@2.8.2': {} - '@manypkg/find-root@1.1.0': + '@netlify/static@3.1.3': dependencies: - '@babel/runtime': 7.28.4 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 + mime-types: 3.0.2 - '@manypkg/get-packages@1.1.3': + '@netlify/types@2.3.0': {} + + '@netlify/vite-plugin@2.7.19(@netlify/api@14.0.12)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(rollup@4.53.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': dependencies: - '@babel/runtime': 7.28.4 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 + '@netlify/dev': 4.8.7(@netlify/api@14.0.12)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(rollup@4.53.3) + '@netlify/dev-utils': 4.3.3 + dedent: 1.7.1 + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/api' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - babel-plugin-macros + - bare-abort-controller + - db0 + - encoding + - idb-keyval + - ioredis + - react-native-b4a + - rollup + - supports-color + - uploadthing - '@mapbox/node-pre-gyp@2.0.3': + '@netlify/zip-it-and-ship-it@14.1.18(rollup@4.53.3)': dependencies: - consola: 3.4.2 - detect-libc: 2.1.2 - https-proxy-agent: 7.0.6 - node-fetch: 2.7.0 - nopt: 8.1.0 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@netlify/binary-info': 1.0.0 + '@netlify/serverless-functions-api': 2.8.2 + '@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.27.2 + 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.4 + 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 - tar: 7.5.2 + tmp-promise: 3.0.3 + toml: 3.0.0 + unixify: 1.0.0 + urlpattern-polyfill: 8.0.2 + yargs: 17.7.2 + zod: 3.25.76 transitivePeerDependencies: + - bare-abort-controller - encoding + - react-native-b4a + - rollup - supports-color '@nodelib/fs.scandir@2.1.5': @@ -7655,8 +9386,65 @@ snapshots: '@oozcitak/util@10.0.0': {} + '@opentelemetry/api-logs@0.203.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api@1.9.0': {} + '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.203.0 + import-in-the-middle: 1.15.0 + require-in-the-middle: 7.5.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/propagator-b3@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/propagator-jaeger@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + semver: 7.7.3 + + '@opentelemetry/semantic-conventions@1.28.0': {} + '@oslojs/asn1@1.0.0': dependencies: '@oslojs/binary': 1.0.0 @@ -8355,6 +10143,11 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + '@speed-highlight/core@1.2.12': {} '@stablelib/base64@1.0.1': {} @@ -8422,14 +10215,14 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 - '@tailwindcss/vite@4.1.17(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))': + '@tailwindcss/vite@4.1.17(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.1.17 '@tailwindcss/oxide': 4.1.17 tailwindcss: 4.1.17 - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) - '@tanstack/directive-functions-plugin@1.139.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))': + '@tanstack/directive-functions-plugin@1.139.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.5 @@ -8439,7 +10232,7 @@ snapshots: babel-dead-code-elimination: 1.0.10 pathe: 2.0.3 tiny-invariant: 1.3.3 - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -8478,19 +10271,19 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.139.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))': + '@tanstack/react-start@1.139.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': dependencies: '@tanstack/react-router': 1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start-client': 1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start-server': 1.139.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-utils': 1.139.0 '@tanstack/start-client-core': 1.139.7 - '@tanstack/start-plugin-core': 1.139.8(@tanstack/react-router@1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) + '@tanstack/start-plugin-core': 1.139.8(@tanstack/react-router@1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) '@tanstack/start-server-core': 1.139.8 pathe: 2.0.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -8534,7 +10327,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.139.7(@tanstack/react-router@1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))': + '@tanstack/router-plugin@1.139.7(@tanstack/react-router@1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) @@ -8552,7 +10345,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -8569,7 +10362,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.139.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))': + '@tanstack/server-functions-plugin@1.139.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.5 @@ -8578,7 +10371,7 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 - '@tanstack/directive-functions-plugin': 1.139.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) + '@tanstack/directive-functions-plugin': 1.139.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: @@ -8593,7 +10386,7 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.139.8(@tanstack/react-router@1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))': + '@tanstack/start-plugin-core@1.139.8(@tanstack/react-router@1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.5 @@ -8601,9 +10394,9 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.139.7 '@tanstack/router-generator': 1.139.7 - '@tanstack/router-plugin': 1.139.7(@tanstack/react-router@1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) + '@tanstack/router-plugin': 1.139.7(@tanstack/react-router@1.139.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) '@tanstack/router-utils': 1.139.0 - '@tanstack/server-functions-plugin': 1.139.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) + '@tanstack/server-functions-plugin': 1.139.0(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) '@tanstack/start-client-core': 1.139.7 '@tanstack/start-server-core': 1.139.8 babel-dead-code-elimination: 1.0.10 @@ -8613,8 +10406,8 @@ snapshots: srvx: 0.8.16 tinyglobby: 0.2.15 ufo: 1.6.1 - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) - vitefu: 1.1.1(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) + vitefu: 1.1.1(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) xmlbuilder2: 4.0.1 zod: 3.25.76 transitivePeerDependencies: @@ -8770,6 +10563,8 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/normalize-package-data@2.4.4': {} + '@types/prop-types@15.7.15': {} '@types/react-dom@18.3.7(@types/react@18.3.27)': @@ -8783,6 +10578,15 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/retry@0.12.2': {} + + '@types/triple-beam@1.3.5': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.19.25 + optional: true + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -8814,11 +10618,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.52.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) @@ -8833,6 +10650,8 @@ snapshots: '@typescript-eslint/types@7.18.0': {} + '@typescript-eslint/types@8.52.0': {} + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 7.18.0 @@ -8848,6 +10667,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/visitor-keys': 8.52.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) @@ -8864,6 +10698,11 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.52.0': + dependencies: + '@typescript-eslint/types': 8.52.0 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} '@unpic/core@1.0.2': @@ -8880,6 +10719,25 @@ snapshots: dependencies: uncrypto: 0.1.3 + '@vercel/nft@0.29.4(rollup@4.53.3)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 10.5.0 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.3 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + '@vercel/nft@0.30.4(rollup@4.53.3)': dependencies: '@mapbox/node-pre-gyp': 2.0.3 @@ -8919,7 +10777,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vitejs/plugin-react@5.1.1(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))': + '@vitejs/plugin-react@5.1.1(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -8927,7 +10785,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.47 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -8965,13 +10823,13 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.15(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6))': + '@vitest/mocker@4.0.15(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) '@vitest/pretty-format@4.0.15': dependencies: @@ -9018,6 +10876,67 @@ snapshots: '@vitest/pretty-format': 4.0.15 tinyrainbow: 3.0.3 + '@vue/compiler-core@3.5.26': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.26 + entities: 7.0.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.26': + dependencies: + '@vue/compiler-core': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/compiler-sfc@3.5.26': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.26 + '@vue/compiler-dom': 3.5.26 + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.26': + dependencies: + '@vue/compiler-dom': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/shared@3.5.26': {} + + '@whatwg-node/disposablestack@0.0.6': + dependencies: + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/fetch@0.10.13': + dependencies: + '@whatwg-node/node-fetch': 0.8.4 + urlpattern-polyfill: 10.1.0 + + '@whatwg-node/node-fetch@0.8.4': + dependencies: + '@fastify/busboy': 3.2.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + + '@whatwg-node/promise-helpers@1.3.2': + dependencies: + tslib: 2.8.1 + + '@whatwg-node/server@0.10.17': + dependencies: + '@envelop/instrumentation': 1.0.0 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.13 + '@whatwg-node/promise-helpers': 1.3.2 + tslib: 2.8.1 + abbrev@3.0.1: {} abort-controller@3.0.0: @@ -9056,6 +10975,10 @@ snapshots: optionalDependencies: react: 18.3.1 + ajv-errors@3.0.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -9063,6 +10986,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -9154,6 +11084,8 @@ snapshots: assertion-error@2.0.1: {} + ast-module-types@6.0.1: {} + ast-types@0.16.1: dependencies: tslib: 2.8.1 @@ -9191,6 +11123,15 @@ snapshots: baseline-browser-mapping@2.8.31: {} + 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 + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -9252,8 +11193,12 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.28.0) + 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: @@ -9302,6 +11247,8 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + callsite@1.0.0: {} + callsites@3.1.0: {} camelcase@8.0.0: {} @@ -9386,6 +11333,8 @@ snapshots: dependencies: consola: 3.4.2 + cjs-module-lexer@1.4.3: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -9416,28 +11365,51 @@ snapshots: dependencies: color-name: 1.1.4 + color-convert@3.1.3: + dependencies: + color-name: 2.1.0 + color-name@1.1.3: {} color-name@1.1.4: {} + color-name@2.1.0: {} + color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.4 + color-string@2.1.4: + dependencies: + color-name: 2.1.0 + color@4.2.3: dependencies: color-convert: 2.0.1 color-string: 1.9.1 + color@5.0.3: + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 + commander@10.0.1: {} + + commander@11.1.0: {} + + commander@12.1.0: {} + commander@2.20.3: {} commander@4.1.1: {} + common-path-prefix@3.0.0: {} + commondir@1.0.1: {} compatx@0.2.0: {} @@ -9481,6 +11453,11 @@ snapshots: cookie@1.1.1: {} + copy-file@11.1.0: + dependencies: + graceful-fs: 4.2.11 + p-event: 6.0.1 + core-util-is@1.0.3: {} crc-32@1.2.2: {} @@ -9490,6 +11467,10 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.7.0 + cron-parser@4.9.0: + dependencies: + luxon: 3.7.2 + croner@9.1.0: {} cross-spawn@6.0.6: @@ -9518,6 +11499,11 @@ snapshots: 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 @@ -9527,6 +11513,12 @@ snapshots: css.escape@1.5.1: {} + cssfilter@0.0.10: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + cssstyle@5.3.4(postcss@8.5.6): dependencies: '@asamuzakjp/css-color': 4.1.0 @@ -9577,6 +11569,8 @@ snapshots: dargs@7.0.0: {} + data-uri-to-buffer@4.0.1: {} + data-urls@6.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -9621,10 +11615,16 @@ snapshots: dependencies: ms: 2.1.3 + decache@4.6.2: + dependencies: + callsite: 1.0.0 + decimal.js-light@2.5.1: {} decimal.js@10.6.0: {} + dedent@1.7.1: {} + deep-eql@4.1.4: dependencies: type-detect: 4.1.0 @@ -9669,6 +11669,64 @@ snapshots: 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: {} + + detective-typescript@14.0.0(typescript@5.9.3): + dependencies: + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + detective-vue2@2.2.0(typescript@5.9.3): + dependencies: + '@dependents/detective-less': 5.0.1 + '@vue/compiler-sfc': 3.5.26 + 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.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + dettle@1.0.5: {} + diff-match-patch@1.0.5: {} diff-sequences@29.6.3: {} @@ -9714,6 +11772,12 @@ snapshots: dependencies: type-fest: 5.2.0 + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + + dotenv@16.6.1: {} + dotenv@17.2.3: {} dunder-proto@1.0.1: @@ -9726,6 +11790,10 @@ snapshots: eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + ee-first@1.1.1: {} electron-to-chromium@1.5.262: {} @@ -9736,6 +11804,10 @@ snapshots: emoji-regex@9.2.2: {} + empathic@2.0.0: {} + + enabled@2.0.0: {} + encodeurl@1.0.2: {} encodeurl@2.0.0: {} @@ -9745,6 +11817,10 @@ snapshots: 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: dependencies: graceful-fs: 4.2.11 @@ -9759,6 +11835,10 @@ snapshots: entities@6.0.1: {} + entities@7.0.0: {} + + env-paths@3.0.0: {} + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -9959,6 +12039,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.0 '@esbuild/win32-x64': 0.27.0 + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -9969,6 +12078,14 @@ snapshots: escape-string-regexp@5.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + eslint-plugin-react-hooks@7.0.1(eslint@8.57.1): dependencies: '@babel/core': 7.28.5 @@ -9991,6 +12108,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.1: {} + eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) @@ -10094,6 +12213,16 @@ snapshots: extendable-error@0.1.7: {} + 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-deep-equal@3.1.3: {} fast-equals@5.3.3: {} @@ -10112,18 +12241,37 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-safe-stringify@2.1.1: {} + fast-sha256@1.3.0: {} + fast-uri@3.1.0: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.3): 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 + fetchdts@0.1.7: {} + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -10138,6 +12286,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 + filter-obj@6.1.0: {} + + find-up-simple@1.0.1: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -10148,6 +12300,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + find-versions@6.0.0: dependencies: semver-regex: 4.0.5 @@ -10167,6 +12325,8 @@ snapshots: flatted@3.3.3: {} + fn.name@1.1.0: {} + follow-redirects@1.15.11: {} for-each@0.3.5: @@ -10193,6 +12353,10 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + fresh@0.5.2: {} fresh@2.0.0: {} @@ -10237,6 +12401,11 @@ snapshots: gensync@1.0.0-beta.2: {} + get-amd-module-type@6.0.1: + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + get-caller-file@2.0.5: {} get-east-asian-width@1.4.0: {} @@ -10267,6 +12436,10 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + get-stream@8.0.1: {} get-symbol-description@1.1.0: @@ -10345,6 +12518,10 @@ snapshots: globrex@0.1.2: {} + gonzales-pe@4.3.0: + dependencies: + minimist: 1.2.8 + goober@2.1.18(csstype@3.2.3): dependencies: csstype: 3.2.3 @@ -10424,6 +12601,10 @@ snapshots: hosted-git-info@2.8.9: {} + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -10501,15 +12682,30 @@ snapshots: ignore@7.0.5: {} + image-meta@0.2.2: {} + + image-size@2.0.2: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@1.15.0: + 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 + imurmurhash@0.1.4: {} indent-string@4.0.0: {} + indent-string@5.0.0: {} + + index-to-position@1.2.0: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -10539,6 +12735,45 @@ snapshots: transitivePeerDependencies: - supports-color + ipx@3.1.1(@netlify/blobs@10.5.0)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2): + 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.5.1 + pathe: 2.0.3 + sharp: 0.34.5 + svgo: 4.0.0 + ufo: 1.6.1 + unstorage: 1.17.3(@netlify/blobs@10.5.0)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2) + xss: 1.0.15 + 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 + iron-webcrypto@1.2.1: {} is-array-buffer@3.0.5: @@ -10634,6 +12869,12 @@ snapshots: is-path-inside@3.0.3: {} + is-path-inside@4.0.0: {} + + is-plain-obj@2.1.0: {} + + is-plain-obj@4.1.0: {} + is-potential-custom-element-name@1.0.1: {} is-reference@1.2.1: @@ -10657,6 +12898,8 @@ snapshots: is-stream@3.0.0: {} + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -10676,8 +12919,14 @@ snapshots: dependencies: which-typed-array: 1.1.19 + is-unicode-supported@2.1.0: {} + is-unix@2.0.14: {} + is-url-superb@4.0.0: {} + + is-url@1.2.4: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -10748,6 +12997,12 @@ snapshots: joycon@3.1.1: {} + jpeg-js@0.4.4: {} + + js-image-generator@1.0.4: + dependencies: + jpeg-js: 0.4.4 + js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -10797,6 +13052,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-schema@0.4.0: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -10813,6 +13070,34 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + 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 + + junk@4.0.1: {} + + jwa@1.4.2: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.3: + dependencies: + jwa: 1.4.2 + safe-buffer: 5.2.1 + jwt-decode@4.0.0: {} keyv@4.5.4: @@ -10825,10 +13110,20 @@ snapshots: knitwork@1.3.0: {} + kuler@2.0.0: {} + + lambda-local@2.2.0: + dependencies: + commander: 10.0.1 + dotenv: 16.6.1 + winston: 3.19.0 + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 + leven@3.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -10936,16 +13231,43 @@ snapshots: dependencies: p-locate: 5.0.0 + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + lodash.defaults@4.2.0: {} + lodash.includes@4.3.0: {} + lodash.isarguments@3.1.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.merge@4.6.2: {} + lodash.once@4.1.1: {} + lodash.startcase@4.4.0: {} 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 + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -10971,6 +13293,8 @@ snapshots: dependencies: react: 18.3.1 + luxon@3.7.2: {} + lz-string@1.5.0: {} magic-string@0.30.21: @@ -10999,12 +13323,20 @@ snapshots: dependencies: semver: 7.7.3 + map-obj@5.0.2: {} + math-intrinsics@1.1.0: {} + mdn-data@2.0.28: {} + mdn-data@2.12.2: {} memorystream@0.3.1: {} + merge-options@3.0.4: + dependencies: + is-plain-obj: 2.1.0 + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -11066,6 +13398,8 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimist@1.2.8: {} + minipass@7.1.2: {} minizlib@3.1.0: @@ -11079,6 +13413,13 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + module-definition@6.0.1: + dependencies: + ast-module-types: 6.0.1 + node-source-walk: 7.0.1 + + module-details-from-path@1.0.4: {} + mri@1.2.0: {} ms@2.0.0: {} @@ -11095,6 +13436,8 @@ snapshots: natural-compare@1.4.0: {} + netlify-redirector@0.5.0: {} + next-themes@0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -11102,7 +13445,7 @@ snapshots: nice-try@1.0.5: {} - nitropack@2.12.9(@upstash/redis@1.35.7): + nitropack@2.12.9(@netlify/blobs@10.5.0)(@upstash/redis@1.35.7): dependencies: '@cloudflare/kv-asset-handler': 0.4.1 '@rollup/plugin-alias': 5.1.1(rollup@4.53.3) @@ -11169,7 +13512,7 @@ snapshots: unenv: 2.0.0-rc.24 unimport: 5.5.0 unplugin-utils: 0.3.1 - unstorage: 1.17.3(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2) + unstorage: 1.17.3(@netlify/blobs@10.5.0)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2) untyped: 2.0.0 unwasm: 0.3.11 youch: 4.1.0-beta.13 @@ -11214,6 +13557,12 @@ snapshots: 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.2: {} node-gyp-build@4.8.4: {} @@ -11222,6 +13571,12 @@ snapshots: node-releases@2.0.27: {} + node-source-walk@7.0.1: + dependencies: + '@babel/parser': 7.28.5 + + node-stream-zip@1.15.0: {} + nopt@8.1.0: dependencies: abbrev: 3.0.1 @@ -11233,6 +13588,16 @@ 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: {} npm-run-all@4.1.5: @@ -11292,6 +13657,8 @@ snapshots: ohash@2.0.11: {} + omit.js@2.0.2: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -11300,6 +13667,10 @@ snapshots: dependencies: wrappy: 1.0.2 + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -11343,6 +13714,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.2 + p-limit@5.0.0: dependencies: yocto-queue: 1.2.2 @@ -11355,12 +13730,28 @@ snapshots: dependencies: p-limit: 3.1.0 + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + p-map@2.1.0: {} + p-map@7.0.4: {} + + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.3.0 + retry: 0.13.1 + p-timeout@6.1.4: {} p-try@2.2.0: {} + p-wait-for@5.0.2: + dependencies: + p-timeout: 6.1.4 + package-json-from-dist@1.0.1: {} package-manager-detector@0.2.11: @@ -11373,11 +13764,24 @@ snapshots: dependencies: callsites: 3.1.0 + parse-gitignore@2.0.0: {} + + parse-imports@2.2.1: + dependencies: + es-module-lexer: 1.7.0 + slashes: 3.0.12 + parse-json@4.0.0: dependencies: error-ex: 1.3.4 json-parse-better-errors: 1.0.2 + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.27.1 + index-to-position: 1.2.0 + type-fest: 4.41.0 + parse-ms@2.1.0: {} parse5-htmlparser2-tree-adapter@7.1.0: @@ -11401,6 +13805,8 @@ snapshots: path-exists@4.0.0: {} + path-exists@5.0.0: {} + path-is-absolute@1.0.1: {} path-key@2.0.1: {} @@ -11432,6 +13838,8 @@ snapshots: pathval@1.1.1: {} + pend@1.2.0: {} + perfect-debounce@2.0.0: {} picocolors@1.1.1: {} @@ -11440,6 +13848,8 @@ snapshots: picomatch@4.0.3: {} + picoquery@2.5.0: {} + pidtree@0.3.1: {} pify@3.0.0: {} @@ -11470,6 +13880,13 @@ snapshots: postcss: 8.5.6 tsx: 4.20.6 + postcss-values-parser@6.0.2(postcss@8.5.6): + dependencies: + color-name: 1.1.4 + is-url-superb: 4.0.0 + postcss: 8.5.6 + quote-unquote: 1.0.0 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -11483,6 +13900,26 @@ snapshots: preact@10.11.3: {} + 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.3) + detective-vue2: 2.2.0(typescript@5.9.3) + module-definition: 6.0.1 + node-source-walk: 7.0.1 + postcss: 8.5.6 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + prelude-ls@1.2.1: {} prettier@2.8.8: {} @@ -11519,6 +13956,11 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + punycode@2.3.1: {} quansync@0.2.11: {} @@ -11527,6 +13969,8 @@ snapshots: queue-microtask@1.2.3: {} + quote-unquote@1.0.0: {} + radix3@1.1.2: {} randombytes@2.1.0: @@ -11620,12 +14064,26 @@ snapshots: dependencies: loose-envify: 1.4.0 + read-package-up@11.0.0: + dependencies: + find-up-simple: 1.0.1 + read-pkg: 9.0.1 + type-fest: 4.41.0 + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -11643,6 +14101,12 @@ 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: dependencies: abort-controller: 3.0.0 @@ -11728,10 +14192,22 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + remove-trailing-separator@1.1.0: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} + require-in-the-middle@7.5.2: + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.4 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + require-package-name@2.0.1: {} + requires-port@1.0.0: {} resend@6.5.2: @@ -11750,6 +14226,14 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + 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.1.0: {} rimraf@3.0.2: @@ -11822,8 +14306,12 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} + sax@1.4.3: {} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -11966,6 +14454,37 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -12020,6 +14539,8 @@ snapshots: slash@5.1.0: {} + slashes@3.0.12: {} + smob@1.5.0: {} sonner@1.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -12061,6 +14582,8 @@ snapshots: srvx@0.8.16: {} + stack-trace@0.0.10: {} + stackback@0.0.2: {} standard-as-callback@2.1.0: {} @@ -12197,6 +14720,16 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svgo@4.0.0: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.1.0 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.4.3 + svix@1.76.1: dependencies: '@stablelib/base64': 1.0.1 @@ -12266,6 +14799,8 @@ snapshots: transitivePeerDependencies: - react-native-b4a + text-hex@1.0.0: {} + text-table@0.2.0: {} thenify-all@1.6.0: @@ -12311,12 +14846,22 @@ snapshots: dependencies: tldts-core: 7.0.19 + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.5 + + tmp@0.2.5: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 toidentifier@1.0.1: {} + toml@3.0.0: {} + + tomlify-j0.4@3.0.0: {} + tough-cookie@6.0.0: dependencies: tldts: 7.0.19 @@ -12329,10 +14874,16 @@ snapshots: tree-kill@1.2.2: {} + triple-beam@1.4.1: {} + ts-api-utils@1.4.3(typescript@5.9.3): dependencies: typescript: 5.9.3 + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-interface-checker@0.1.13: {} tsconfck@3.1.6(typescript@5.9.3): @@ -12429,6 +14980,8 @@ snapshots: ufo@1.6.1: {} + ulid@3.0.2: {} + ultrahtml@1.6.0: {} unbox-primitive@1.1.0: @@ -12469,6 +15022,8 @@ snapshots: dependencies: pathe: 2.0.3 + unicorn-magic@0.1.0: {} + unicorn-magic@0.3.0: {} unimport@5.5.0: @@ -12490,6 +15045,10 @@ snapshots: universalify@0.1.2: {} + unixify@1.0.0: + dependencies: + normalize-path: 2.1.1 + unpic@4.2.2: {} unplugin-utils@0.3.1: @@ -12504,7 +15063,7 @@ snapshots: picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 - unstorage@1.17.3(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2): + unstorage@1.17.3(@netlify/blobs@10.5.0)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -12515,6 +15074,7 @@ snapshots: ofetch: 1.5.1 ufo: 1.6.1 optionalDependencies: + '@netlify/blobs': 10.5.0 '@upstash/redis': 1.35.7 db0: 0.3.4 ioredis: 5.8.2 @@ -12559,6 +15119,10 @@ snapshots: 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@18.3.27)(react@18.3.1): dependencies: react: 18.3.1 @@ -12582,11 +15146,17 @@ snapshots: uuid@10.0.0: {} + uuid@11.1.0: {} + + uuid@13.0.0: {} + 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: {} + victory-vendor@36.9.2: dependencies: '@types/d3-array': 3.2.2 @@ -12604,7 +15174,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vinxi@0.5.8(@types/node@20.19.25)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6): + vinxi@0.5.8(@netlify/blobs@10.5.0)(@types/node@20.19.25)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2): dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) @@ -12625,7 +15195,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.12.9(@upstash/redis@1.35.7) + nitropack: 2.12.9(@netlify/blobs@10.5.0)(@upstash/redis@1.35.7) node-fetch-native: 1.6.7 path-to-regexp: 6.3.0 pathe: 1.1.2 @@ -12637,8 +15207,8 @@ snapshots: ufo: 1.6.1 unctx: 2.4.1 unenv: 1.10.0 - unstorage: 1.17.3(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2) - vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + unstorage: 1.17.3(@netlify/blobs@10.5.0)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2) + vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -12703,13 +15273,13 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript @@ -12725,7 +15295,7 @@ snapshots: lightningcss: 1.30.2 terser: 5.44.1 - vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6): + vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -12740,8 +15310,9 @@ snapshots: lightningcss: 1.30.2 terser: 5.44.1 tsx: 4.20.6 + yaml: 2.8.2 - vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6): + vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -12756,10 +15327,11 @@ snapshots: lightningcss: 1.30.2 terser: 5.44.1 tsx: 4.20.6 + yaml: 2.8.2 - vitefu@1.1.1(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)): + vitefu@1.1.1(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)): optionalDependencies: - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) vitest@1.6.1(@types/node@18.19.130)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1): dependencies: @@ -12796,10 +15368,10 @@ snapshots: - supports-color - terser - vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jiti@2.6.1)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6): + vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jiti@2.6.1)(jsdom@27.3.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)) + '@vitest/mocker': 4.0.15(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.15 '@vitest/runner': 4.0.15 '@vitest/snapshot': 4.0.15 @@ -12816,7 +15388,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -12839,6 +15411,8 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + web-streams-polyfill@3.3.3: {} + web-streams-polyfill@4.0.0-beta.3: {} web-worker@1.2.0: {} @@ -12927,6 +15501,26 @@ snapshots: dependencies: string-width: 7.2.0 + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.19.0: + 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 + word-wrap@1.2.5: {} workerd@1.20251202.0: @@ -12974,6 +15568,11 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + ws@8.18.0: {} ws@8.18.3: {} @@ -12989,6 +15588,11 @@ snapshots: xmlchars@2.2.0: {} + xss@1.0.15: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + y18n@5.0.8: {} yallist@3.1.1: {} @@ -12997,6 +15601,8 @@ snapshots: yallist@5.0.0: {} + yaml@2.8.2: {} + yargs-parser@21.1.1: {} yargs@17.7.2: @@ -13009,6 +15615,11 @@ 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.2: {} @@ -13060,6 +15671,8 @@ snapshots: zod@3.25.76: {} + zod@4.3.5: {} + zustand@5.0.8(@types/react@18.3.27)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): optionalDependencies: '@types/react': 18.3.27 diff --git a/public/_redirects b/public/_redirects index 7797f7c..d521b78 100644 --- a/public/_redirects +++ b/public/_redirects @@ -1 +1 @@ -/* /index.html 200 +/* /.netlify/functions/server 200 diff --git a/vite.config.ts b/vite.config.ts index bbe2adc..7659d8c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,6 +3,7 @@ import { tanstackStart } from '@tanstack/react-start/plugin/vite'; import viteReact from '@vitejs/plugin-react'; import tsconfigPaths from 'vite-tsconfig-paths'; import tailwindcss from '@tailwindcss/vite'; +import netlify from "@netlify/vite-plugin"; export default defineConfig({ server: { @@ -21,6 +22,7 @@ export default defineConfig({ ignoreConfigErrors: true, }), viteReact(), + netlify(), ], ssr: { noExternal: ['@tanstack/router-core'], From 095d096081f4b9960f2470d862c89ca08b78fb2e Mon Sep 17 00:00:00 2001 From: gov Date: Mon, 5 Jan 2026 17:21:07 -0500 Subject: [PATCH 46/48] chore: netlify preset --- netlify.toml | 3 --- package.json | 1 + pnpm-lock.yaml | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ vite.config.ts | 2 +- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/netlify.toml b/netlify.toml index d15d64f..fe33e82 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,6 +1,3 @@ [build] command = "pnpm build" publish = "dist/client" - -[functions] - directory = "dist/server" diff --git a/package.json b/package.json index 2ccad28..631f8a5 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "@fontsource-variable/inter": "^5.2.8", "@hookform/resolvers": "^3.9.0", "@netlify/vite-plugin": "^2.7.19", + "@netlify/vite-plugin-tanstack-start": "^1.2.6", "@opentelemetry/api": "^1.9.0", "@oslojs/crypto": "^1.0.1", "@radix-ui/react-avatar": "^1.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2a5f827..ae3f6e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: '@netlify/vite-plugin': specifier: ^2.7.19 version: 2.7.19(@netlify/api@14.0.12)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(rollup@4.53.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) + '@netlify/vite-plugin-tanstack-start': + specifier: ^1.2.6 + version: 1.2.6(@netlify/api@14.0.12)(@tanstack/react-start@1.139.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)))(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(rollup@4.53.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) '@opentelemetry/api': specifier: ^1.9.0 version: 1.9.0 @@ -1919,6 +1922,19 @@ packages: resolution: {integrity: sha512-5gxMWh/S7wr0uHKSTbMv4bjWmWSpwpeLYvErWeVNAPll5/QNFo9aWimMAUuh8ReLY3/fg92XAroVVu7+z27Snw==} engines: {node: ^18.14.0 || >=20} + '@netlify/vite-plugin-tanstack-start@1.2.6': + resolution: {integrity: sha512-/96ALjfuvkxJDF+9Xg5cx69oavS5Umwb9yKqPcKPH89nHhQUBS4Z7y0QpvMJIznHFE6EHUg/GYf4bS/nUtNmVQ==} + engines: {node: ^22.12.0 || >=24.0.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 + '@netlify/vite-plugin@2.7.19': resolution: {integrity: sha512-2EFGOqm3tThLTnPqOlPIt8BebP5pZVAAJtpW+eyPQixnyKZKXOd90U8sDowEKykXANMW9s49/5jcJBI+oXcSdA==} engines: {node: ^20.6.1 || >=22} @@ -9283,6 +9299,39 @@ snapshots: '@netlify/types@2.3.0': {} + '@netlify/vite-plugin-tanstack-start@1.2.6(@netlify/api@14.0.12)(@tanstack/react-start@1.139.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)))(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(rollup@4.53.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': + dependencies: + '@netlify/vite-plugin': 2.7.19(@netlify/api@14.0.12)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(rollup@4.53.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) + vite: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2) + optionalDependencies: + '@tanstack/react-start': 1.139.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2)) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/api' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - babel-plugin-macros + - bare-abort-controller + - db0 + - encoding + - idb-keyval + - ioredis + - react-native-b4a + - rollup + - supports-color + - uploadthing + '@netlify/vite-plugin@2.7.19(@netlify/api@14.0.12)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(rollup@4.53.3)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.2))': dependencies: '@netlify/dev': 4.8.7(@netlify/api@14.0.12)(@upstash/redis@1.35.7)(db0@0.3.4)(ioredis@5.8.2)(rollup@4.53.3) diff --git a/vite.config.ts b/vite.config.ts index 7659d8c..5bbd964 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,7 +3,7 @@ import { tanstackStart } from '@tanstack/react-start/plugin/vite'; import viteReact from '@vitejs/plugin-react'; import tsconfigPaths from 'vite-tsconfig-paths'; import tailwindcss from '@tailwindcss/vite'; -import netlify from "@netlify/vite-plugin"; +import netlify from '@netlify/vite-plugin-tanstack-start' export default defineConfig({ server: { From 73d2c2c5b2f5fcdfdbf6b109faf61adc4d56ecb2 Mon Sep 17 00:00:00 2001 From: gov Date: Mon, 5 Jan 2026 18:54:34 -0500 Subject: [PATCH 47/48] fix: add vite entry point for build --- vite.config.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/vite.config.ts b/vite.config.ts index 5bbd964..e0ea66f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,12 +3,18 @@ import { tanstackStart } from '@tanstack/react-start/plugin/vite'; import viteReact from '@vitejs/plugin-react'; import tsconfigPaths from 'vite-tsconfig-paths'; import tailwindcss from '@tailwindcss/vite'; -import netlify from '@netlify/vite-plugin-tanstack-start' +import netlify from '@netlify/vite-plugin-tanstack-start'; export default defineConfig({ server: { port: 1995, }, + build: { + manifest: true, + rollupOptions: { + input: './app/index.tsx', + }, + }, plugins: [ tanstackStart({ srcDirectory: '.', From 7b987a41a75a6e1046f37d339d0674eb5c72304a Mon Sep 17 00:00:00 2001 From: gov Date: Mon, 5 Jan 2026 18:57:38 -0500 Subject: [PATCH 48/48] chore: try server side config --- netlify.toml | 9 +++++++++ public/_redirects | 1 - vite.config.ts | 6 ------ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/netlify.toml b/netlify.toml index fe33e82..b3e9906 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,3 +1,12 @@ [build] command = "pnpm build" publish = "dist/client" + +[functions] + directory = "dist/server" + node_bundler = "esbuild" + +[[redirects]] + from = "/*" + to = "/.netlify/functions/server" + status = 200 diff --git a/public/_redirects b/public/_redirects index d521b78..e69de29 100644 --- a/public/_redirects +++ b/public/_redirects @@ -1 +0,0 @@ -/* /.netlify/functions/server 200 diff --git a/vite.config.ts b/vite.config.ts index e0ea66f..bc85b06 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -9,12 +9,6 @@ export default defineConfig({ server: { port: 1995, }, - build: { - manifest: true, - rollupOptions: { - input: './app/index.tsx', - }, - }, plugins: [ tanstackStart({ srcDirectory: '.',