diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 0000000..ab99165 --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,10 @@ +language: en-US +reviews: + path_filters: + - "!samples/**" + - "!uploads/**" + - "!.env*" + - "!playwright-report/**" + - "!test-results/**" + - "!**/*.zip" + - "!**/*.fit" diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8ba7b32 --- /dev/null +++ b/.env.example @@ -0,0 +1,11 @@ +# Backend only; never prefix these with NEXT_PUBLIC_. +LOADIQ_API_BASE_URL=http://127.0.0.1:3001 +LOADIQ_INTERNAL_API_KEY= +WORKOS_API_KEY= +WORKOS_CLIENT_ID= +WORKOS_COOKIE_PASSWORD= +NEXT_PUBLIC_WORKOS_REDIRECT_URI=http://localhost:3000/callback +# Two separate EU Sentry projects: backend and web. Empty disables monitoring. +SENTRY_DSN= +NEXT_PUBLIC_SENTRY_DSN= +# E2E flags are set only by scripts/e2e-server.mjs. Never configure in deployment. diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 0000000..e2be067 --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,3 @@ +#!/bin/sh +set -eu +corepack pnpm --ignore-workspace quality diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d0ad61b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: Frontend quality +on: + push: + pull_request: +permissions: + contents: read +jobs: + quality: + runs-on: ubuntu-latest + timeout-minutes: 20 + env: + NEXT_TELEMETRY_DISABLED: "1" + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + - run: corepack enable + - run: corepack pnpm@10.15.1 --ignore-workspace install --frozen-lockfile + - run: corepack pnpm --ignore-workspace quality + - run: corepack pnpm --ignore-workspace build + - run: corepack pnpm --ignore-workspace typecheck + - run: corepack pnpm --ignore-workspace exec playwright install --with-deps chromium + - run: corepack pnpm --ignore-workspace test:e2e diff --git a/.gitignore b/.gitignore index b87c7b7..41b739f 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,9 @@ next-env.d.ts # contentlayer .contentlayer + +/playwright-report/ +/test-results/ +.env +.env.* +!.env.example diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..de14fd9 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +ignore-workspace=true diff --git a/QUALITY.md b/QUALITY.md new file mode 100644 index 0000000..8889fc6 --- /dev/null +++ b/QUALITY.md @@ -0,0 +1,58 @@ +# Engineering quality — final review (2026-11-13) + +Keep these repositories separate. Use Node22 and the existing pnpm10.15.1 lockfile: +`corepack pnpm@10.15.1 --ignore-workspace install --frozen-lockfile`. +The pnpm lockfile is authoritative; the pre-existing frontend package-lock.json is not used by CI. +No dependencies or infrastructure were added in Task3.1. + +## Quality gates +`pnpm quality` runs ESLint and Prettier without fixing files. +Lint debt fingerprints include file, rule, message hash, source hash, severity and occurrence count. +New/changed findings, severity upgrades and increased counts fail. Fatal parser errors always fail. +Obsolete debt was pruned without accepting new findings. Baseline generation is forbidden on CI. +A review must approve any manual debt change; never regenerate a baseline to hide a failed PR. +Formatting exceptions apply only to exact unchanged hashes of old files. +The optional `.githooks/pre-commit` runs checks without modifying files; no hooksPath was set automatically. + +## Sentry diagnostics and privacy +Separate API/web projects must belong to an EU Sentry organization. Empty DSNs disable monitoring. +Server: SENTRY_DSN. Web browser: NEXT_PUBLIC_SENTRY_DSN (public DSN, never an API/auth secret). +Only HTTPS EU ingestion DSNs without password/query/fragment are accepted. +Events are reconstructed from an allowlist: generic message, approved error category, environment, +static operation, event ID/time and reviewed code locations with bounded line/column numbers. +`monitoring/source-files.json` lists approved repository paths. Review/update it when adding modules; +unlisted paths are dropped. Backend dist aliases and strictly named Next hashed chunks are supported. +Absolute prefixes, URL hosts/query strings, function names, original error messages, source context, +locals, user identities, cookies, headers, bodies, health/GPS data, extras and attachments are discarded. +Grouping uses Sentry's default sanitized-stack grouping plus operation/category, rather than one global bucket. +Handled ingestion failures and framework/browser error handlers now retain the original technical stack +through the sanitizer. No raw message or stack context is sent. Replay, tracing, logs and metrics are disabled. +Both actual SDK envelopes are tested through an in-memory transport; no network delivery is claimed. +Before enabling DSNs, configure server-side scrubbing, prevention of IP-address storage and IP-derived +geography scrubbing in Sentry. SDK scrubbing cannot control ingestion-side metadata. +Live Sentry delivery remains unverified until EU DSNs are configured. Hosted CI status is recorded in the feature pull request checks. + +## External services +GitHub Actions YAML was parsed and structurally validated locally. Feature branches run the same checks on GitHub; inspect the latest PR checks for the hosted result. +Actions are enabled (allowed_actions=all) on both repositories; no enablement change is needed. +No Garmin API credentials, personal data or WorkOS production credentials are required in CI. +There is no artifact upload. Playwright screenshots/video/traces are disabled. +CodeRabbit configuration excludes sensitive paths; installation status is unverified (API403). +Do not grant a new review app access to personal-data history without an owner decision. + +## Frontend checks +``` +pnpm quality +pnpm build +pnpm typecheck +pnpm exec playwright install chromium +pnpm test:e2e +``` +Playwright: 13 passing tests. Coverage includes dashboard/metric units/recommendations, limited historical data, +API errors, unauthenticated redirects, two-user isolation, production auth refusal, and useful private SDK diagnostics. +Build/typecheck and quality gates pass. Production build was verified with empty auth/Sentry credentials. +The development-only test adapter requires NODE_ENV=development, explicit mode+secret, exact fixture backend URL +and loopback host. Production builds/servers reject the flag and production auth still uses WorkOS. +Local Next4318 and fixture backend4319 use only fabricated users/data. Actual WorkOS login/callback is not verified. +Build and E2E run sequentially because both use .next. Historical lint is enforced by a separate mandatory gate, +not by Next build; no new lint fingerprints are accepted. No production login was weakened. diff --git a/README.md b/README.md index 128ec04..6f737dc 100644 --- a/README.md +++ b/README.md @@ -18,3 +18,7 @@ Data is used exclusively to generate personalized fitness insights for the user. Users may revoke access at any time by disconnecting their Garmin account. This application does not resell or redistribute Garmin user data. + +## Engineering quality + +See [QUALITY.md](QUALITY.md) for isolated database tests, CI, Playwright, lint debt and privacy-safe monitoring. diff --git a/app/app/error.tsx b/app/app/error.tsx new file mode 100644 index 0000000..800d7ab --- /dev/null +++ b/app/app/error.tsx @@ -0,0 +1,21 @@ +"use client"; +import { useEffect } from "react"; +import { reportFailure } from "@/lib/monitoring/sentry"; +export default function DashboardError({ + reset, + error, +}: { + reset: () => void; + error: Error; +}) { + useEffect(() => { + reportFailure(error); + }, [error]); + return ( +
+

Dashboard unavailable

+

Please try again later.

+ +
+ ); +} diff --git a/app/app/layout.tsx b/app/app/layout.tsx index 91ad7a6..0fc084d 100644 --- a/app/app/layout.tsx +++ b/app/app/layout.tsx @@ -1,5 +1,5 @@ import type { ReactNode } from "react"; -import { withAuth } from "@workos-inc/authkit-nextjs"; +import { currentUser } from "@/lib/current-user"; export const dynamic = "force-dynamic"; @@ -8,7 +8,7 @@ export default async function ProductLayout({ }: { children: ReactNode; }) { - await withAuth({ ensureSignedIn: true }); + await currentUser(); return children; } diff --git a/app/global-error.tsx b/app/global-error.tsx new file mode 100644 index 0000000..30ac6dd --- /dev/null +++ b/app/global-error.tsx @@ -0,0 +1,15 @@ +"use client"; +import { useEffect } from "react"; +import { reportFailure } from "@/lib/monitoring/sentry"; +export default function GlobalError({ error }: { error: Error }) { + useEffect(() => { + reportFailure(error); + }, [error]); + return ( + + +

LoadIQ is temporarily unavailable

+ + + ); +} diff --git a/app/layout.tsx b/app/layout.tsx index e443d25..6182a16 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,4 +1,5 @@ import "./css/style.css"; +import { Monitoring } from "@/components/monitoring"; import { Inter } from "next/font/google"; import localFont from "next/font/local"; @@ -57,6 +58,7 @@ export default function RootLayout({ +
{children}
diff --git a/components/monitoring.tsx b/components/monitoring.tsx new file mode 100644 index 0000000..01293b9 --- /dev/null +++ b/components/monitoring.tsx @@ -0,0 +1,18 @@ +"use client"; +import { useEffect } from "react"; +import { initializeMonitoring, reportFailure } from "@/lib/monitoring/sentry"; +export function Monitoring() { + useEffect(() => { + initializeMonitoring(process.env.NEXT_PUBLIC_SENTRY_DSN); + const onError = (event: ErrorEvent) => reportFailure(event.error); + const onRejection = (event: PromiseRejectionEvent) => + reportFailure(event.reason); + window.addEventListener("error", onError); + window.addEventListener("unhandledrejection", onRejection); + return () => { + window.removeEventListener("error", onError); + window.removeEventListener("unhandledrejection", onRejection); + }; + }, []); + return null; +} diff --git a/components/product/dashboard-page.tsx b/components/product/dashboard-page.tsx index f3fd92e..97ae7e8 100644 --- a/components/product/dashboard-page.tsx +++ b/components/product/dashboard-page.tsx @@ -1,9 +1,26 @@ import type { ReactNode } from "react"; -import { ArrowRight, CalendarRange, Download, Footprints, HeartPulse, Scale, ShieldAlert, TimerReset, Zap } from "lucide-react"; -import { signOut, withAuth } from "@workos-inc/authkit-nextjs"; +import { + ArrowRight, + CalendarRange, + Download, + Footprints, + HeartPulse, + Scale, + ShieldAlert, + TimerReset, + Zap, +} from "lucide-react"; +import { signOut } from "@workos-inc/authkit-nextjs"; +import { currentUser } from "@/lib/current-user"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import { getDashboardSummary, @@ -18,18 +35,21 @@ import { import { TrendPanel } from "./trend-panel"; export async function DashboardPage() { - const [{ user }, summary, timeline, recentActivity, recentImports] = await Promise.all([ - withAuth({ ensureSignedIn: true }), - getDashboardSummary(), - getDashboardTimeline("28d"), - getRecentActivity("14d"), - getRecentImports(5), - ]); + const [{ user }, summary, timeline, recentActivity, recentImports] = + await Promise.all([ + currentUser(), + getDashboardSummary(), + getDashboardTimeline("28d"), + getRecentActivity("14d"), + getRecentImports(5), + ]); const greetingName = user.firstName ?? user.email.split("@")[0]; - const activeStates = summary.daily.states.filter((state) => state.status !== "RESOLVED"); - const recommendationActions = summary.daily.recommendations.flatMap((recommendation) => - recommendation.payloadJson?.actions ?? [], + const activeStates = summary.daily.states.filter( + (state) => state.status !== "RESOLVED", + ); + const recommendationActions = summary.daily.recommendations.flatMap( + (recommendation) => recommendation.payloadJson?.actions ?? [], ); return ( @@ -77,17 +97,23 @@ export async function DashboardPage() { } label="Wearable days" - value={String(summary.weekly.summary.metrics.coverage.wearableDays)} + value={String( + summary.weekly.summary.metrics.coverage.wearableDays, + )} /> } label="Average steps" - value={formatNullable(summary.weekly.summary.metrics.activity.averageSteps)} + value={formatNullable( + summary.weekly.summary.metrics.activity.averageSteps, + )} /> } label="Sessions" - value={String(summary.weekly.summary.metrics.activitySessions.sessionCount)} + value={String( + summary.weekly.summary.metrics.activitySessions.sessionCount, + )} /> @@ -127,12 +153,14 @@ export async function DashboardPage() { Next actions

    - {summary.daily.summary.nextActions.slice(0, 3).map((action) => ( -
  • - - {action} -
  • - ))} + {summary.daily.summary.nextActions + .slice(0, 3) + .map((action) => ( +
  • + + {action} +
  • + ))}
@@ -143,7 +171,9 @@ export async function DashboardPage() { } - items={summary.weekly.highlights.slice(0, 4).map((highlight) => highlight.message)} + items={summary.weekly.highlights + .slice(0, 4) + .map((highlight) => highlight.message)} emptyMessage="Highlights will appear after enough recovery and activity data comes in." /> Trend Overview - Last {timeline.range.days} days of chart-ready normalized signals. + Last {timeline.range.days} days of chart-ready normalized + signals. @@ -196,7 +227,11 @@ export async function DashboardPage() { /> point.sleepDurationMin)} /> @@ -240,7 +275,9 @@ function InsightCard({
- {icon} + + {icon} + {title}
@@ -274,7 +311,8 @@ function RecentImports({ Recent Imports - Latest upload status plus {summary.imports.recentCount} import(s) in the last 7 days. + Latest upload status plus {summary.imports.recentCount} import(s) in + the last 7 days. @@ -292,12 +330,16 @@ function RecentImports({ {formatDateTime(entry.createdAt)}

- {entry.status} + + {entry.status} + {entry.error ? (

{entry.error}

) : null} - {index < imports.length - 1 ? : null} + {index < imports.length - 1 ? ( + + ) : null} )) )} @@ -319,7 +361,9 @@ function RecentActivity({ sessions }: { sessions: ActivitySessionRecord[] }) { {items.length === 0 ? ( -

No activity sessions available yet.

+

+ No activity sessions available yet. +

) : ( items.map((session, index) => (
@@ -336,9 +380,13 @@ function RecentActivity({ sessions }: { sessions: ActivitySessionRecord[] }) {

-

{session.durationMin ? `${session.durationMin} min` : "n/a"}

+

+ {session.durationMin ? `${session.durationMin} min` : "n/a"} +

- {session.caloriesBurned ? `${session.caloriesBurned} kcal` : "No calories"} + {session.caloriesBurned + ? `${session.caloriesBurned} kcal` + : "No calories"}

@@ -366,7 +414,9 @@ function StatPill({ {icon} {label} -

{value}

+

+ {value} +

); } @@ -386,7 +436,9 @@ function KeyDatum({ {icon} {label}

-

{value}

+

+ {value} +

); } @@ -396,7 +448,9 @@ function formatMetricFromTimeline( key: "weightKg" | "steps" | "sleepDurationMin" | "restingHr" | "stressScore", suffix?: string, ) { - const latest = [...timeline.points].reverse().find((point) => point[key] !== null)?.[key]; + const latest = [...timeline.points] + .reverse() + .find((point) => point[key] !== null)?.[key]; if (latest === undefined || latest === null) { return "No data"; @@ -405,7 +459,9 @@ function formatMetricFromTimeline( return suffix ? `${latest} ${suffix}` : String(latest); } -function mapSummaryStatus(status: DashboardSummaryResponse["daily"]["summary"]["status"]) { +function mapSummaryStatus( + status: DashboardSummaryResponse["daily"]["summary"]["status"], +) { if (status === "attention") { return "warning" as const; } diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..8a0a695 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,20 @@ +import { createRequire } from "node:module"; +import { dirname } from "node:path"; +import { FlatCompat } from "@eslint/eslintrc"; +const compat = new FlatCompat({ + baseDirectory: import.meta.dirname, + resolvePluginsRelativeTo: dirname( + createRequire(import.meta.url).resolve("eslint-config-next/package.json"), + ), +}); +export default [ + { + ignores: [ + ".next/**", + "node_modules/**", + "playwright-report/**", + "test-results/**", + ], + }, + ...compat.extends("next/core-web-vitals", "next/typescript"), +]; diff --git a/instrumentation.ts b/instrumentation.ts new file mode 100644 index 0000000..c741843 --- /dev/null +++ b/instrumentation.ts @@ -0,0 +1,8 @@ +export async function register() { + const { initializeMonitoring } = await import("./lib/monitoring/sentry"); + initializeMonitoring(process.env.SENTRY_DSN); +} +export async function onRequestError(error: unknown) { + const { reportFailure } = await import("./lib/monitoring/sentry"); + reportFailure(error); +} diff --git a/lib/current-user.ts b/lib/current-user.ts new file mode 100644 index 0000000..4c999fc --- /dev/null +++ b/lib/current-user.ts @@ -0,0 +1,24 @@ +import "server-only"; +import { withAuth } from "@workos-inc/authkit-nextjs"; +import { headers } from "next/headers"; +import { redirect } from "next/navigation"; +import { e2eEnabled } from "./e2e-mode"; +export async function currentUser() { + if (!e2eEnabled()) return withAuth({ ensureSignedIn: true }); + const input = await headers(); + if (!["127.0.0.1:4318", "localhost:4318"].includes(input.get("host") ?? "")) + redirect("/signin"); + const session = input.get("x-loadiq-e2e-session"); + const name = ["alice", "bob"].find( + (name) => session === `${process.env.LOADIQ_E2E_SECRET}:${name}`, + ); + if (!name) redirect("/signin"); + return { + user: { + id: `synthetic-${name}`, + email: `${name}@example.invalid`, + firstName: name, + lastName: "Fixture", + }, + }; +} diff --git a/lib/e2e-mode.ts b/lib/e2e-mode.ts new file mode 100644 index 0000000..596c8d5 --- /dev/null +++ b/lib/e2e-mode.ts @@ -0,0 +1,9 @@ +// Both checks are required. A production build rejects this flag in next.config.js. +export function e2eEnabled() { + return ( + process.env.NODE_ENV === "development" && + process.env.LOADIQ_E2E_MODE === "true" && + Boolean(process.env.LOADIQ_E2E_SECRET) && + process.env.LOADIQ_API_BASE_URL === "http://127.0.0.1:4319" + ); +} diff --git a/lib/loadiq-api.ts b/lib/loadiq-api.ts index 57ab246..ae748a3 100644 --- a/lib/loadiq-api.ts +++ b/lib/loadiq-api.ts @@ -1,6 +1,8 @@ import "server-only"; +import { headers as requestHeaders } from "next/headers"; +import { e2eEnabled } from "./e2e-mode"; -import { withAuth } from "@workos-inc/authkit-nextjs"; +import { currentUser } from "@/lib/current-user"; const INTERNAL_API_KEY_HEADER = "x-loadiq-internal-api-key"; const EXTERNAL_AUTH_ID_HEADER = "x-loadiq-external-auth-id"; @@ -150,9 +152,15 @@ function requireEnv(name: string) { } async function getApiHeaders() { - const { user } = await withAuth({ ensureSignedIn: true }); + const { user } = await currentUser(); return { + ...(e2eEnabled() + ? { + "x-loadiq-e2e-scenario": + (await requestHeaders()).get("x-loadiq-e2e-scenario") ?? "normal", + } + : {}), [INTERNAL_API_KEY_HEADER]: requireEnv("LOADIQ_INTERNAL_API_KEY"), [EXTERNAL_AUTH_ID_HEADER]: user.id, [USER_EMAIL_HEADER]: user.email, @@ -171,7 +179,9 @@ async function apiFetch(path: string) { }); if (!response.ok) { - throw new Error(`LoadIQ API request failed: ${response.status} ${response.statusText}`); + throw new Error( + `LoadIQ API request failed: ${response.status} ${response.statusText}`, + ); } return (await response.json()) as T; diff --git a/lib/monitoring/privacy.ts b/lib/monitoring/privacy.ts new file mode 100644 index 0000000..86093d1 --- /dev/null +++ b/lib/monitoring/privacy.ts @@ -0,0 +1,158 @@ +import sourceFiles from "./source-files.json"; + +type UnknownRecord = Record; +const record = (value: unknown): UnknownRecord => + value !== null && typeof value === "object" ? (value as UnknownRecord) : {}; +const categories = new Set([ + "Error", + "TypeError", + "RangeError", + "ReferenceError", + "SyntaxError", + "URIError", + "AbortError", + "PrismaClientKnownRequestError", + "PrismaClientValidationError", + "ServiceUnavailableException", + "BadGatewayException", +]); +const paths = new Set( + sourceFiles.flatMap((path) => [ + path, + ...(path.startsWith("src/") + ? [ + path.replace(/^src\//, "dist/").replace(/\.ts$/, ".js"), + "dist/" + path.replace(/\.ts$/, ".js"), + ] + : []), + ...(path.startsWith("app/") + ? [".next/server/" + path.replace(/\.tsx?$/, ".js")] + : []), + ]), +); + +function technicalFile(value: unknown): string | undefined { + if (typeof value !== "string") return undefined; + const clean = value.replace(/\\/g, "/").split(/[?#]/, 1)[0]; + // Output only a reviewed repository path, never an absolute prefix or runtime URL. + for (const path of Array.from(paths)) { + if (clean === path || clean.endsWith("/" + path)) return path; + if (path.startsWith("app/") && /\.tsx?$/.test(path)) { + const marker = "_next/static/chunks/" + path.replace(/\.tsx?$/, "") + "-"; + const index = clean.lastIndexOf("/" + marker); + const suffix = clean.startsWith(marker) + ? clean.slice(marker.length) + : index >= 0 + ? clean.slice(index + marker.length + 1) + : ""; + if (/^[a-f0-9]{8,64}\.js$/.test(suffix)) return marker + suffix; + } + } + const chunk = clean.match( + /(?:^|\/)((?:_next\/static|\.next\/server)\/chunks\/[0-9a-f-]{1,80}\.js)$/, + ); + return chunk?.[1]; +} +function position(value: unknown) { + return typeof value === "number" && + Number.isInteger(value) && + value > 0 && + value <= 10000000 + ? value + : undefined; +} +function frames(value: unknown) { + return (Array.isArray(value) ? value : []).slice(-40).flatMap((raw) => { + const frame = record(raw); + const filename = technicalFile(frame.filename); + return filename + ? [ + { + filename, + lineno: position(frame.lineno), + colno: position(frame.colno), + in_app: true, + }, + ] + : []; + }); +} + +// Reconstruct events. Retain only static categories and reviewed code locations. +export function scrubEvent< + T extends { + event_id?: string; + timestamp?: number; + platform?: string; + environment?: string; + }, +>(event: T): T { + const input = record(event); + const candidate = record(input.tags).operation; + const operation = + typeof candidate === "string" && + ["garmin_sync", "import_processing", "unhandled", "frontend"].includes( + candidate, + ) + ? candidate + : "unhandled"; + const values = record(input.exception).values; + const exceptions = ( + Array.isArray(values) && values.length ? values.slice(0, 3) : [{}] + ).map((raw) => { + const error = record(raw); + const type = + typeof error.type === "string" && categories.has(error.type) + ? error.type + : "Error"; + const safeFrames = frames(record(error.stacktrace).frames); + return { + type, + value: "Application operation failed", + ...(safeFrames.length ? { stacktrace: { frames: safeFrames } } : {}), + }; + }); + const directFrames = frames(record(input.stacktrace).frames); + return { + event_id: + typeof event.event_id === "string" && + /^[a-f0-9]{32}$/.test(event.event_id) + ? event.event_id + : undefined, + timestamp: + typeof event.timestamp === "number" && Number.isFinite(event.timestamp) + ? event.timestamp + : undefined, + platform: "javascript", + environment: ["production", "development", "test"].includes( + event.environment ?? "", + ) + ? event.environment + : undefined, + level: "error", + message: "LoadIQ application failure (details intentionally withheld)", + exception: { values: exceptions }, + ...(directFrames.length ? { stacktrace: { frames: directFrames } } : {}), + fingerprint: ["{{ default }}", operation, exceptions[0].type], + tags: { operation }, + } as unknown as T; +} + +export function euDsn(dsn: string | undefined): string | undefined { + if (!dsn) return undefined; + try { + const url = new URL(dsn); + if ( + url.protocol === "https:" && + /^o[0-9]+\.ingest\.de\.sentry\.io$/.test(url.hostname) && + !url.password && + !url.search && + !url.hash && + /^\/[0-9]+$/.test(url.pathname) + ) + return dsn; + } catch { + /* Invalid configuration remains disabled. */ + } + return undefined; +} diff --git a/lib/monitoring/sentry.ts b/lib/monitoring/sentry.ts new file mode 100644 index 0000000..30bfbb5 --- /dev/null +++ b/lib/monitoring/sentry.ts @@ -0,0 +1,50 @@ +import * as Sentry from "@sentry/nextjs"; +import { euDsn, scrubEvent } from "./privacy"; +export function initializeMonitoring(dsn: string | undefined) { + const verified = euDsn(dsn); + if (!verified || process.env.LOADIQ_E2E_MODE === "true") return; + Sentry.init(monitoringOptions(verified)); +} +export function reportFailure(error?: unknown) { + Sentry.captureException( + error instanceof Error ? error : new Error("LoadIQ application failure"), + { + tags: { operation: "frontend" }, + }, + ); +} + +export function monitoringOptions( + dsn: string, +): NonNullable[0]> { + return { + dsn, + environment: + process.env.NODE_ENV === "production" ? "production" : "development", + defaultIntegrations: false, + tracePropagationTargets: [], + maxBreadcrumbs: 0, + dataCollection: { + graphQL: { document: false, variables: false }, + genAI: { inputs: false, outputs: false }, + mcp: { inputs: false, outputs: false }, + userInfo: false, + cookies: false, + httpHeaders: false, + httpBodies: [], + urlQueryParams: false, + databaseQueryData: false, + queues: false, + stackFrameVariables: false, + frameContextLines: 0, + }, + beforeSendLog: () => null, + beforeSendMetric: () => null, + tracesSampleRate: 0, + + beforeSend: (event, hint) => { + hint.attachments = []; + return scrubEvent(event); + }, + }; +} diff --git a/lib/monitoring/source-files.json b/lib/monitoring/source-files.json new file mode 100644 index 0000000..1840799 --- /dev/null +++ b/lib/monitoring/source-files.json @@ -0,0 +1,45 @@ +[ + "app/(auth)/layout.tsx", + "app/(auth)/reset-password/page.tsx", + "app/(auth)/signin/route.ts", + "app/(auth)/signup/route.ts", + "app/(default)/contact/page.tsx", + "app/(default)/disclaimer/page.tsx", + "app/(default)/layout.tsx", + "app/(default)/page.tsx", + "app/(default)/privacy/page.tsx", + "app/(default)/terms/page.tsx", + "app/api/hello/route.ts", + "app/app/error.tsx", + "app/app/layout.tsx", + "app/app/page.tsx", + "app/callback/route.ts", + "app/global-error.tsx", + "app/layout.tsx", + "components/cta.tsx", + "components/features.tsx", + "components/hero-home.tsx", + "components/legal/legal-page.tsx", + "components/modal-video.tsx", + "components/monitoring.tsx", + "components/page-illustration.tsx", + "components/product/dashboard-page.tsx", + "components/product/trend-panel.tsx", + "components/providers/aos-provider.tsx", + "components/spotlight.tsx", + "components/testimonials.tsx", + "components/ui/badge.tsx", + "components/ui/button.tsx", + "components/ui/card.tsx", + "components/ui/footer.tsx", + "components/ui/header.tsx", + "components/ui/logo.tsx", + "components/ui/separator.tsx", + "components/workflows.tsx", + "lib/current-user.ts", + "lib/e2e-mode.ts", + "lib/loadiq-api.ts", + "lib/monitoring/privacy.ts", + "lib/monitoring/sentry.ts", + "lib/utils.ts" +] diff --git a/middleware.ts b/middleware.ts index c80be83..65ba3b8 100644 --- a/middleware.ts +++ b/middleware.ts @@ -1,7 +1,17 @@ import { authkitMiddleware } from "@workos-inc/authkit-nextjs"; +import { NextResponse } from "next/server"; +import { e2eEnabled } from "./lib/e2e-mode"; import type { NextFetchEvent, NextRequest } from "next/server"; -export default function middleware(request: NextRequest, event: NextFetchEvent) { +export default function middleware( + request: NextRequest, + event: NextFetchEvent, +) { + if ( + e2eEnabled() && + ["127.0.0.1", "localhost"].includes(request.nextUrl.hostname) + ) + return NextResponse.next(); return authkitMiddleware({ redirectUri: process.env.NEXT_PUBLIC_WORKOS_REDIRECT_URI ?? diff --git a/next.config.js b/next.config.js index 658404a..1d0f2d4 100644 --- a/next.config.js +++ b/next.config.js @@ -1,4 +1,15 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; +if ( + process.env.NODE_ENV === "production" && + process.env.LOADIQ_E2E_MODE === "true" +) { + throw new Error( + "E2E authentication is forbidden in production builds and servers", + ); +} +const nextConfig = { + // The separate quality gate rejects new findings while tracking the existing backlog. + eslint: { ignoreDuringBuilds: true }, +}; module.exports = nextConfig; diff --git a/package.json b/package.json index 5f8cdec..5e98803 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,17 @@ "dev": "next dev --turbopack", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "node scripts/check-quality.mjs", + "quality": "node scripts/check-quality.mjs && node scripts/check-format.mjs", + "lint:all": "eslint app components lib middleware.ts", + "typecheck": "tsc --noEmit --incremental false", + "test:e2e": "playwright test", + "format:check": "node scripts/check-format.mjs" }, "dependencies": { "@headlessui/react": "^2.2.0", "@radix-ui/react-slot": "^1.2.4", + "@sentry/nextjs": "^11.12.0", "@types/node": "^22.13.0", "@types/react": "19.0.8", "@types/react-dom": "19.0.3", @@ -26,10 +32,15 @@ "typescript": "^5.7.3" }, "devDependencies": { + "@eslint/eslintrc": "^3.3.7", + "@playwright/test": "^1.65.0", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/postcss": "^4.0.3", "@types/aos": "^3.0.7", + "eslint": "^9.39.5", + "eslint-config-next": "15.2.8", "postcss": "^8.5.1", + "prettier": "^3.10.1", "tailwindcss": "^4.0.3" }, "packageManager": "pnpm@10.15.1+sha512.34e538c329b5553014ca8e8f4535997f96180a1d0f614339357449935350d924e22f8614682191264ec33d1462ac21561aff97f6bb18065351c162c7e8f6de67" diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..5556740 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from "@playwright/test"; +export default defineConfig({ + testDir: "./tests", + testMatch: "**/*.spec.ts", + fullyParallel: false, + workers: 1, + retries: 0, + timeout: 60000, + reporter: "list", + use: { + baseURL: "http://127.0.0.1:4318", + browserName: "chromium", + trace: "off", + screenshot: "off", + video: "off", + }, + webServer: { + command: "node scripts/e2e-server.mjs", + url: "http://127.0.0.1:4318", + reuseExistingServer: false, + timeout: 180000, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b8ca7c..93be9bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@radix-ui/react-slot': specifier: ^1.2.4 version: 1.2.4(@types/react@19.0.8)(react@19.2.3) + '@sentry/nextjs': + specifier: ^11.12.0 + version: 11.12.0(next@15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) '@types/node': specifier: ^22.13.0 version: 22.13.0 @@ -25,7 +28,7 @@ importers: version: 19.0.3(@types/react@19.0.8) '@workos-inc/authkit-nextjs': specifier: ^3.0.0 - version: 3.0.0(next@15.2.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.7.3) + version: 3.0.0(next@15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.7.3) aos: specifier: 3.0.0-beta.6 version: 3.0.0-beta.6 @@ -40,7 +43,7 @@ importers: version: 1.7.0(react@19.2.3) next: specifier: 15.2.8 - version: 15.2.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: 19.2.3 version: 19.2.3 @@ -54,6 +57,12 @@ importers: specifier: ^5.7.3 version: 5.7.3 devDependencies: + '@eslint/eslintrc': + specifier: ^3.3.7 + version: 3.3.7 + '@playwright/test': + specifier: ^1.65.0 + version: 1.65.0 '@tailwindcss/forms': specifier: ^0.5.10 version: 0.5.10(tailwindcss@4.0.3) @@ -63,9 +72,18 @@ importers: '@types/aos': specifier: ^3.0.7 version: 3.0.7 + eslint: + specifier: ^9.39.5 + version: 9.39.5(jiti@2.4.2) + eslint-config-next: + specifier: 15.2.8 + version: 15.2.8(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3) postcss: specifier: ^8.5.1 version: 8.5.1 + prettier: + specifier: ^3.10.1 + version: 3.10.1 tailwindcss: specifier: ^4.0.3 version: 4.0.3 @@ -79,6 +97,44 @@ packages: '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.3': + resolution: {integrity: sha512-R76UKbvsqI68DJJVTVyqFKqU98CN4+B+acxNfEA2IFarSzP0SjtKf/3+fFiXzTyv5Fj3PxLkGHe2wnVWWMxobQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.7': + resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.5': + resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.6.9': resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} @@ -107,6 +163,26 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.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} @@ -212,9 +288,18 @@ packages: cpu: [x64] os: [win32] + '@isaacs/nonrecursive-glob-match@1.1.0': + resolution: {integrity: sha512-GPm/Dbvk5RLmhRnxXIa7nTpK0xtl4E0wj0MslsuNiJ1FIROU+2+9lgUC/dgF7Ey4QCWhfEsgxilMRMCdHPfDfw==} + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + '@next/env@15.2.8': resolution: {integrity: sha512-TaEsAki14R7BlgywA05t2PFYfwZiNlGUHyIQHVyloXX3y+Dm0HUITe5YwTkjtuOQuDhuuLotNEad4VtnmE11Uw==} + '@next/eslint-plugin-next@15.2.8': + resolution: {integrity: sha512-RZzpLUhsoVH322lj3Nf/s3oyHh9+cqvKGifMUE9bcTyIUtsQ+WUrwH7y9rCxr5s22V5YLsLzBD02yT37vwPemg==} + '@next/swc-darwin-arm64@15.2.5': resolution: {integrity: sha512-4OimvVlFTbgzPdA0kh8A1ih6FN9pQkL4nPXGqemEYgk+e7eQhsst/p35siNNqA49eQA6bvKZ1ASsDtu9gtXuog==} engines: {node: '>= 10'} @@ -263,6 +348,148 @@ packages: cpu: [x64] os: [win32] + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@opentelemetry/api@1.10.0': + resolution: {integrity: sha512-lMkyes8iHrG+mk6WH7X70MdCLI2RS0FwNBY1PyQ8UemaijE2m5mv5A0Niy3HtbYTFrgkUEQjFMXmSAk2hQDuPQ==} + engines: {node: '>=8.0.0'} + + '@oxc-parser/binding-android-arm-eabi@0.152.0': + resolution: {integrity: sha512-393VtirINkae4XHBTkq/yQxhOwEr4V+r0et37P2fp+sYZSdYgZTRDPo5Um8vBh0QjMZ+RmaMy4PP0qwr4cTMwA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.152.0': + resolution: {integrity: sha512-iYFcExATJNZ0rZj0o02THbD1Nc9jAW0nVgIQPee6ejbSASpbZXlIMw8jxtpzaG14JQTWwGSZ6U5dEtRJXE6V3Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.152.0': + resolution: {integrity: sha512-fnU+DfUzi5/rFy0LzmipYRz06PAUUkOS8kCJQ3Eg6oqlunC1XZXoffFqxmdL51RmcbYtUG3P8DVG1U5fckoa2A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.152.0': + resolution: {integrity: sha512-Y3U2okryWTs7hDld6UhjJwLNf8/do+x4g4C+1U5SiGwrTLwbO83WJYJA8+l9iFSilWBgnfpd/+U76tfeNxUHzA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.152.0': + resolution: {integrity: sha512-XkhkRrrPffEw+ZLv/d/5pEni0buxinm/E/N6fLbJCunD1DBbeCTtVP23ESV+4CWCWdSz397asks1ViGslpmWiQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.152.0': + resolution: {integrity: sha512-MLzsRRbdfmdzo6JEhbC1yKU9ItfvM8tEf18HM32jCiNYZEz6J3bRBRl3cTkKR0vBdrk9ZVlcARXtwHccs+epDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.152.0': + resolution: {integrity: sha512-HHerTEJz7Iy10Ji6BGsk4gqG6PU0UzFuBu91jIEOX89FnrI5ECWSEr7BLpkYQhp7U0QFtMnBhNfQKI0hYZK78w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.152.0': + resolution: {integrity: sha512-9Bb8GyzZ2uSLzRDZ27usaKokr07mxiBe2dDF5b6bd2janmaJTT1gL51UfP7AU30yFiXrJvcRyFKREAgKwZYs0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.152.0': + resolution: {integrity: sha512-om7iDMUroI74A/lfRRWY9/Ev3VWrVsrUZ4tyvyh8raBey/sdcfyAD7tYWc+iykAiotnmftyKTpUKFr1QnaBrAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-ppc64-gnu@0.152.0': + resolution: {integrity: sha512-Lf1OL2lMTqwDMFC6jnRb30B+WYHKV0XT+bPHcFM6xHtNVwxpobiTzUIvKH6a0LWpvfwyru8Yu6zCGHqqFHH+gg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.152.0': + resolution: {integrity: sha512-BYWSMQK+YJ9ZILStPcmmiSVq8KEG9Qdq/c4BHPC3rUEq/fEDCVjUIwdj5ZzjgZ9P9is9PKu0tcAXzq1ZXg4urQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-musl@0.152.0': + resolution: {integrity: sha512-d2LqHNNNqdH185sRK5dPKWZu201JrNu9/CRFuVEuT+ht7n/QaVblEMWT9MALQPrDWYvhG10P+NSKJFquDWZ09w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.152.0': + resolution: {integrity: sha512-8gBeHt5rA/8+pKhHl+zLggfa3L/V/L2at96p7ty6pBE7id6lFO19nFUc15u2PcjC4OYeYK465MKy1fhhbpFIGw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.152.0': + resolution: {integrity: sha512-ltgrSF6L+yPTVsIdaAyqKq3zTqzj/1VlNbxWZuxAe8flR3sWdyNsKvdXukoO8/ucJbLickhmieRBge+o/e8Ugw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.152.0': + resolution: {integrity: sha512-LcMp6BvrBnewSfdkLHoSqidhoAq4syKOTBV5TYHWd+2VnGkfD/nPRRVIzTBt/Lkbt7pfOFDGtkiTntFS0p6sQQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-openharmony-arm64@0.152.0': + resolution: {integrity: sha512-jbhoMCslVxzRCRNQ8TSHxjYdSKRvk8O6ciLVDkahJvmyHDzBqba/bMQHM6ULKj/rgHNNbSzlIiakdx8SEfkJzA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-win32-arm64-msvc@0.152.0': + resolution: {integrity: sha512-JZYVlhv36mr/nertnRB7vchJECOBb1Lz6lltalILsB+o9M/is+H6BEDRLQKdqA4JKs6NjJszo46+iM5sfwj6jQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.152.0': + resolution: {integrity: sha512-1X9oganvVsunRH0lH10UU05N+H9atpX6WsOybByUjwnfcd3h/0tYwvuv16XuHglrIUOnxV2TodbLVEwwafd64g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.152.0': + resolution: {integrity: sha512-sw0M80/dn9rcpu+Rqqph/C+MjvDDce6MlXmFjsNQtPEymha0eJy3ml6+foSUTqFfpDIDyHZZ4eoJ43IoMe8bJw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.152.0': + resolution: {integrity: sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==} + + '@playwright/test@1.65.0': + resolution: {integrity: sha512-iGURLGuKDLakSEl7Pgfv8h7f+XLT+V861Wfhz0zlEl5nyFuKUopdkFBPKqTllTUp06aOwPuH8iuUEb3yp3MpbQ==} + engines: {node: '>=20'} + hasBin: true + '@radix-ui/react-compose-refs@1.1.2': resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: @@ -315,6 +542,238 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@rollup/plugin-commonjs@28.0.1': + resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.5.1': + resolution: {integrity: sha512-P9ZvnfouRu4MSC+ilERaw6FmZs8zqKhpHxEs4aGDGWQAMzQGXnhvCSvoNwokfNvdt7t3Y5Y4p6gStQgezeIqug==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.68.3': + resolution: {integrity: sha512-mqfypgH/liYjaSCoPI4erckUcROgZtmFUUmyOJ05oyayi/tVqOEYAzWP7ufqCoCT3xB31Fw4XIVO/jX42hYvKA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.68.3': + resolution: {integrity: sha512-5tY+GC/1gpt79cKS2DQzu6iD824j6BmI4q5Zb6qftZ4kWqIQmvR3DD4eJ2Gclu6/nVMYDk2IVpqxypWOiAuWJg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-x64@4.68.3': + resolution: {integrity: sha512-nDBcQ/o3PMmGxmAzGBJFn+n1rb83Va9WSdFIq1AHmlEF3tuibVsyJ3kG5x13r7VIy6WI8SvzCdHVNSlSDIdj8w==} + cpu: [x64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.68.3': + resolution: {integrity: sha512-dra5zl0QWKkIkaMgNDNPC19gkMlPAfAf41yWlkGztXMIvUQrX9XWZFQRw7abhH3nks+XZGQpybINAxT2pKdFew==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.68.3': + resolution: {integrity: sha512-xo5xeo/AjEB/ArzQjGn0JRDZuybZicQ5O3VPfko6ocH1li/qNrN4p5+R/WgjavzRz6UwAOaqsau7VvRQA6i6AA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.68.3': + resolution: {integrity: sha512-zdckkcxHDEEKyDbC1t21DeaaiKGymxbkBU9c3zyfaaz+8N96ItJw4nmzHhZF+Mukgt906fnf2tsc90pVyStuHA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.68.3': + resolution: {integrity: sha512-9oXqI7g/ycEz7TyicdGBC4sL6PfWMXAx8u15f/nd7lYkCLJd8U8VdBfbpc4SSnRBU/e7aPALve3mhzasGDeCYg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.68.3': + resolution: {integrity: sha512-hbgT4NlaOELE3D5UUzSqF+OFgwz4Scvo2SQD9nZJUFjdIsg9Kg3FabQauUxkHKY9N5yjNXfXRRmiKNN4JpLmFA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.68.3': + resolution: {integrity: sha512-yECcXZ/Bl+JVRhLFgld42rYrXgPdE0LtySGAmmmH6OtkaJM17A4cWG/eCzDymMVb52/jZjW0R54YrTHj4xXlSA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.68.3': + resolution: {integrity: sha512-q4Q4/B7wyqM+TFqY5tJYQlaz5+ksGopcRmMeMdu4q6eaPK7N1PymTjIaH5LL32mMJBqIzpRof7BhlYLim5JgNQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.68.3': + resolution: {integrity: sha512-Ich3TGl/7GqhQ6G6jVPzgGQGJjd3E5hECxSVanPYchy6Vwcq+WI8wG/gmEMilHNy+ZYCR6U8EN50EejG3TaIgw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.68.3': + resolution: {integrity: sha512-URBmOhwv4Y0Hi5Hhxc3cmqZLtQlx55DOs5PUhhITDC3zu0qwAfhcNAFAIwAhOUdA6NFVEck07CNZX6cBEs1vTg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.68.3': + resolution: {integrity: sha512-PTdJXuZplRyaE3ECArlbZubI2LlUHWm0oCipCexnE/8LM+L7qIqUiNbU0piBxt46EB5zxXX+cpmDvHX4Z3WwcQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.68.3': + resolution: {integrity: sha512-IlSQPDExSm9YdtrWeZIHj87GPXI9lYygRvHVwQ1o9t91JHIiB2CihrvNIASpc/zI28atqm04jS3proaQuaJMww==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.68.3': + resolution: {integrity: sha512-O2ssyDcBTZkH5v2P/9ZaXJreL0hCKvUA5UwuHn0jCKeMLKi4GhspZJ1I5FT5QsHtJ/dPx4pup7pg/Lw0emeY0Q==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.68.3': + resolution: {integrity: sha512-fesqagxcnc87lH2+aBWne/tFCmQVIGH+YezjY1wQwbUODuTBBlhHoyxju6umwn8LnjHVanjpoeaQdLsXP8JQSQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.68.3': + resolution: {integrity: sha512-+fZiTeHV/1fy/14dRqE4thjYwUOABL6qQjxElOEQg2oHLkCamO8dxhHphVgD4+pFxtVEUIWxsGVduPtwnAlvbg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.68.3': + resolution: {integrity: sha512-pfn4Zd9Ic3lEaSwW3GsQhTIDd7929C+eiEkOutsSCT2IHD6rDLblwmMQkgeGOso0oDo9Jk/ERtFdtFr9ElLs+g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.68.3': + resolution: {integrity: sha512-eUXzaeNQbKXKNqseL3g/usUqOPmRu+DbQsvwr9MXMdV+VQFUNb9bcWSNAAs/TRV95PCbFK46kLzHEOhFSzujsg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.68.3': + resolution: {integrity: sha512-s6EclDWmk6zvIfk1yixgYthk7xHNx0xu5cEF5RDpS4IHNTpfswRX6xOXVG5cHF5xWn0B6EpDGARhPQ520KTlsA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.68.3': + resolution: {integrity: sha512-G2xnmxGnU8XHLwtjnnXNRcLrub+Af3nm9VQ1QzL2aEiAL7woBdRgTCZBslJl8umA+YMqdEFpUh9kJB/Vyzk2wQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.68.3': + resolution: {integrity: sha512-Y/4tApNVrMUYWbAHsyRWJgwuuJOfhTNhA2B04Xpa6+G9btkPZ9kU3XagUKzPTwF3hg36NpQk748JsnoTVho67Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.68.3': + resolution: {integrity: sha512-ADb1Uz2MNM0sxVpAlMNdQG16Hw4sgW1aqVL7NeqBMpcZeiHb192d7W6shZdMQs33D+w9ihDYBBPsYqqc4MlD8w==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@rushstack/eslint-patch@1.16.1': + resolution: {integrity: sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==} + + '@sentry/browser-utils@11.12.0': + resolution: {integrity: sha512-OttAHqf557R1gfLQRqb/dpGUK1UQd21qkeeN0KA/ThuymYXTNY+qTpJIOqmzgpk6fOmE922mTT6xmnMEiGYZBQ==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + + '@sentry/browser@11.12.0': + resolution: {integrity: sha512-oiSs0ZZQGVLVLASxTk/Z+MW4cGOHhC65IKc3B//M54eaZEa4p6JqP2DM++ta4IqDQx8+lSD6+TglAIsHBdSyVQ==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + + '@sentry/bundler-plugins@11.12.0': + resolution: {integrity: sha512-7vBXoHMoYKjYu08anYv5I0nplSWOfQyl7BqV0VOrLxEtGoOpk1+DxL2dyBiaWoAtISkaqJEV/ft813OsCGuuMg==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + peerDependencies: + rollup: '>=3.2.0' + webpack: '>=5.1.0' + peerDependenciesMeta: + rollup: + optional: true + webpack: + optional: true + + '@sentry/cloudflare@11.12.0': + resolution: {integrity: sha512-m/nls+rx8NTCfxqgIMsw57lit5Rbo8VKbbrGDEZF65qsG12uV7wORDrUV6PnGi/MCjXx1Cc+tfdc90ljAlamwQ==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + peerDependencies: + '@cloudflare/workers-types': ^4.x || ^5.x + vite: ^6.1.0 || ^7.0.0 || ^8.0.0 + wrangler: ^4.x + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + vite: + optional: true + wrangler: + optional: true + + '@sentry/conventions@0.32.0': + resolution: {integrity: sha512-WkSQcDhUUsz1SwxR23LpmyPKba+dgxxiH0DWV4VSM9yaAvhhl87ppW2Ts3g4piIKCVflc31aJeWy+biUbYfsMQ==} + engines: {node: '>=14'} + + '@sentry/core@11.12.0': + resolution: {integrity: sha512-HKER7EcRpPPgC8mLRe5BzP6njfRYFZ53BFLZxVp1whWbY6lp/b2mvTBk4q6+rKsUFhLhRDsd6jL8y/8ddEWv6A==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + + '@sentry/feedback@11.12.0': + resolution: {integrity: sha512-vYOIeby3tVoKZ/q70D1NJ48D4APMVcojyvCjlaZkFOQR6DIEsOjF/uC9MkhnCP3cpa4oADdMatsIpkhlPM+qng==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + + '@sentry/nextjs@11.12.0': + resolution: {integrity: sha512-IFmUbw8J+hrJTN3SoFG+CilZ8kMiRpA7G2Or8frCER3kfB+ZxkYJdYf0PJf/OMd0xKmSyfAozcqXJAfkEXIHIw==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + peerDependencies: + next: ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0 + + '@sentry/node@11.12.0': + resolution: {integrity: sha512-MNSZDOd92Twrq5Z4ZAkxZdIfhr3YGytFb1T+vh5bNXVHkqByWpI/P2VtTSrzBR4Pi1IDRMz0i8t/OWNOsuAuBg==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + + '@sentry/opentelemetry@11.12.0': + resolution: {integrity: sha512-oWJwUdc2OSSvyOPXn/E1nWkC3GV5KNTWfR5prbw/0XxlKJepdlBsW19y+FAE9n3QznZ52aMZmetWEAFMsPJ0KQ==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + + '@sentry/react@11.12.0': + resolution: {integrity: sha512-tNr2yyfj//7Wrn0scoauR8D9FG93PWSRPQakWuvlVXGIXEAx/pwVkOjWYKUD1Xhyo8Hbvu5f6ddQ0+StsL3zyw==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + peerDependencies: + react: 17.x || 18.x || 19.x + react-router: 6.x || 7.x || 8.x + peerDependenciesMeta: + react-router: + optional: true + + '@sentry/replay-canvas@11.12.0': + resolution: {integrity: sha512-kx9Q3TY8pMp0b12fpcR0tziGoEW7Z8PpFKncmzD9XYWE3YzMt//B+cjkR+vmmZSUVxOuQATYDFp9c1jRTnbrug==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + + '@sentry/replay@11.12.0': + resolution: {integrity: sha512-SF1064TKmOvIQTKo8WelVB34IZWtYtrflInsydPeB9jMTpy2iE3LqKRizDJr3YivjMUPDgIGn67b+0kaxiwQ4g==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + + '@sentry/server-runtime-injection@11.12.0': + resolution: {integrity: sha512-fAZjCFyEfhvyfEdbav0/X13Yqbom5Ka1+hG0Nyl6bd7GxkQIWd68unSIw/Rvzfj/DSO8A1JidezST3D6omALkw==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + + '@sentry/server-utils@11.12.0': + resolution: {integrity: sha512-gAP5FLhXSiMs9vsU7guc54QNY1OzUJmhqyXMjhiP4SYlhQltoKtipcyo8pFWVsmylIzIkA8e2eGR6e0YA6YF3A==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + + '@sentry/vercel-edge@11.12.0': + resolution: {integrity: sha512-+s+XyGtncoeQQd0f1hjdXbjIORcAt5IdhmcV1mz0vwBlyilfq3bB40bCg1j91g2L4xTlVmTm01X2ofGeKkZuew==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} + '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -414,6 +873,15 @@ packages: '@types/aos@3.0.7': resolution: {integrity: sha512-sEhyFqvKauUJZDbvAB3Pggynrq6g+2PS4XB3tmUr+mDL1gfDJnwslUC4QQ7/l8UD+LWpr3RxZVR/rHoZrLqZVg==} + '@types/estree@1.0.10': + resolution: {integrity: sha512-lTyOMnOcmRBzdCv6/4zUZCrEhV0xrqQiUZBZtVcbmLHBXKLnN8q89v/wKRF/Q0HbwVsqbIG3o5HDoFl9sduM+g==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/node@22.13.0': resolution: {integrity: sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==} @@ -425,674 +893,3269 @@ packages: '@types/react@19.0.8': resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} - '@workos-inc/authkit-nextjs@3.0.0': - resolution: {integrity: sha512-9qER/fIlxGw0gfkBOcHh9Vi9LMBSq9zVsrJReQ6xbd08Ulz9QcrRDxOvs6CX6xitZjxrQKUwkWi0yH1vwUlhVA==} + '@typescript-eslint/eslint-plugin@8.72.2': + resolution: {integrity: sha512-222PKFXKihmFpi/pS5njoBgdAqsPhj2/GBmFbrNw8Tq8gEG9Sv+kSlKFy4u2q+mJv9ZzJgM2Gkv/bUzRZwZw5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - next: ^13.5.9 || ^14.2.26 || ^15.2.3 || ^16 - react: ^18.0 || ^19.0.0 - react-dom: ^18.0 || ^19.0.0 + '@typescript-eslint/parser': ^8.72.2 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@workos-inc/node@8.10.0': - resolution: {integrity: sha512-3UqtU+QqITkQy77UZJumrZxb+4FcUjxgHfC4c186Q0rzSNDZ7YF7iNLWN7QB/q/26KbtgHlEpFS9GX75wUxSEQ==} - engines: {node: '>=20.15.0'} + '@typescript-eslint/parser@8.72.2': + resolution: {integrity: sha512-llP+T1YuJOLlxEciP6OyQGtz5SMxyn+9LA2BvZw5RmToGVa1y4beEDVQL6Gje7T5WFYh19WREjDCN9Ev4gm5AA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - aos@3.0.0-beta.6: - resolution: {integrity: sha512-VLWrpq8bfAWcetynVHMMrqdC+89Qq/Ym6UBJbHB4crIwp3RR8uq1dNGgsFzoDl03S43rlVMK+na3r5+oUCZsYw==} + '@typescript-eslint/project-service@8.72.2': + resolution: {integrity: sha512-6y5dLTZdHhI8Eh3yIQ/bfQhRKwn5e+TpJj64o18Cngc0iW/BCrVvrr6zGYqXPnYH31u6YXAYiFh0+qxX5mybJw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + '@typescript-eslint/scope-manager@8.72.2': + resolution: {integrity: sha512-iIoMJ6/8c1/QpFNyFjU0d1YzPco4MsZjQw0k3V+vfzNWAFmUmvhlyMoYEoYYDQZXc+J6Gi1X5XcxlzW2taIIGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - caniuse-lite@1.0.30001696: - resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==} + '@typescript-eslint/tsconfig-utils@8.72.2': + resolution: {integrity: sha512-+h3iCgZXuTNtoLXcnnjP12ZUHLMqoUcIHPfQrFEXTUqvb9dF8QK9b5nv5VtSo5fLkdHuks8ehbTzZj3rImAm9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - class-variance-authority@0.7.1: - resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + '@typescript-eslint/type-utils@8.72.2': + resolution: {integrity: sha512-STfkR38qIdhfkLpgtXnUjAzsNy4xouqiBO0lrVc/Wpk9Kem5/aHXUx1J8dGC16zpdYN1+yc2ILQ28er1kXX7ag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - classlist-polyfill@1.2.0: - resolution: {integrity: sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==} + '@typescript-eslint/types@8.72.2': + resolution: {integrity: sha512-Xfn37OLZx03+PCU7qWx9DTv2FCRh1E6fk2+wONeNY15HXIwtcwuveaSwVpGAUptkNmPQegRxW5JyRel9T7wrog==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + '@typescript-eslint/typescript-estree@8.72.2': + resolution: {integrity: sha512-pQEGqIK/cqEvKivVWaFLYpe7XYejFxfuAOi4mu1oAWFvIo36aRHI9esRFTUxcIy/z8N482RJyH+LpZB0ZIU7Ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} + '@typescript-eslint/utils@8.72.2': + resolution: {integrity: sha512-hv3eRYbpPbbpezuax1EfGrzpa3C4ySgNZkPUkLOWOAjU8HsOKowEDAr8C7nsNl1C+SBSKDpvno6VKHnlhvp9iA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + '@typescript-eslint/visitor-keys@8.72.2': + resolution: {integrity: sha512-NAGrjn0Pitjqzq/GkgMC4kBYm233PQ8GffyQ9+kTA3AlNQYEzOf25EIM02BAHZv5FRJSpHpJk+OGUxVkOB93GQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + '@unrs/resolver-binding-android-arm-eabi@1.13.0': + resolution: {integrity: sha512-60E5mvmIiW+i1E/HYeSX4iE4A8s9NJSGYPu7UM0DJght1c2tTkWwuyDyAwzsEXhKM/XbbndfnTiXdfrf27d2hw==} + cpu: [arm] + os: [android] - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + '@unrs/resolver-binding-android-arm64@1.13.0': + resolution: {integrity: sha512-qlh/JR3Tuy1cJ7xtf5pR4ykvLiK6os7X7EL2+zXZbrVc/s+yB8DoFdQrCAW9/a2TOxPVbR7QVNpkPWh7UWIsEQ==} + cpu: [arm64] + os: [android] - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} + '@unrs/resolver-binding-darwin-arm64@1.13.0': + resolution: {integrity: sha512-yynnnnJXUC99WeD1GfvuXPKsKNfvgzGYC2eRayFnUfsHVROjqrbFOkFQLZiSx1H8+PLy5BzU8vqyPyLqbRfeBQ==} + cpu: [arm64] + os: [darwin] - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + '@unrs/resolver-binding-darwin-x64@1.13.0': + resolution: {integrity: sha512-t8PXE0Ip9tmGyhRlfVsnEbzGM5iSvJIeNIXciUACjzpg0mmPs13fGv2x7W8sBa0S8zbIiohxKXS9fL/LXW/ERQ==} + cpu: [x64] + os: [darwin] - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + '@unrs/resolver-binding-freebsd-x64@1.13.0': + resolution: {integrity: sha512-qdtl9GDWDoDx6rhzF4RU5SJutV3lcLOiTiyqD6nBxYfEO6lAgLNukfrA+HJ2u2OiyWvV8JW5iEWD3LoONw7lYA==} + cpu: [x64] + os: [freebsd] - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true + '@unrs/resolver-binding-linux-arm-gnueabihf@1.13.0': + resolution: {integrity: sha512-VrMUVwdrScTarsh4B6aUhTtziUavSlglo4Hi8XZ6CpAe4+j3nquY+XoP+tYkiSBDsXZ8386ne4pv4YYYBNi02w==} + cpu: [arm] + os: [linux] - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} + '@unrs/resolver-binding-linux-arm-musleabihf@1.13.0': + resolution: {integrity: sha512-zSbTVwaxiTC+zYJ9xVNTC6c+BYO/kOV/odcTI3bHuFFXa+XmjLoUkb/8UxsZeU5YF4K000m17wrXoTblNWuzOg==} + cpu: [arm] + os: [linux] - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} - engines: {node: '>=10.13.0'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - iron-session@8.0.4: - resolution: {integrity: sha512-9ivNnaKOd08osD0lJ3i6If23GFS2LsxyMU8Gf/uBUEgm8/8CC1hrrCHFDpMo3IFbpBgwoo/eairRsaD3c5itxA==} - - iron-webcrypto@1.2.1: - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - - is-arrayish@0.3.4: - resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - - jose@5.10.0: - resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + '@unrs/resolver-binding-linux-arm64-gnu@1.13.0': + resolution: {integrity: sha512-Z/Rax87moZHsuvJ8awdfP+zrMlsCt3d7mggUPIiPe32KpeagimyzJWnZSMQoV67an9uVQghyh92Pc0VprITnYA==} + cpu: [arm64] + os: [linux] - lightningcss-darwin-arm64@1.29.1: - resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} - engines: {node: '>= 12.0.0'} + '@unrs/resolver-binding-linux-arm64-musl@1.13.0': + resolution: {integrity: sha512-oUzXz8hNvFLNEAag8lBKJe1euiV2dmGHAR+eQ5fNpsZO0F1K7IMRb4J6pqYsd7uLMRQNPiu5A1WKUJHbFLWbbw==} cpu: [arm64] - os: [darwin] + os: [linux] - lightningcss-darwin-x64@1.29.1: - resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] + '@unrs/resolver-binding-linux-loong64-gnu@1.13.0': + resolution: {integrity: sha512-BxhGYvZBg0YrvNOeSEGR3eNklwXYy0mUJk7oeGJvZoQMKM68zYvbbf52+fQI3Le4X0fW276FTKIoTwjpMob80A==} + cpu: [loong64] + os: [linux] - lightningcss-freebsd-x64@1.29.1: - resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] + '@unrs/resolver-binding-linux-loong64-musl@1.13.0': + resolution: {integrity: sha512-nZcIuup9Ar3gAlqoZfX/KW6x83TMI11tLpCjldZG5M1KeY8qNUPNJJ71+sPvG8HMBpoh+ix1pAm5gkMFvcSAcQ==} + cpu: [loong64] + os: [linux] - lightningcss-linux-arm-gnueabihf@1.29.1: - resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} - engines: {node: '>= 12.0.0'} - cpu: [arm] + '@unrs/resolver-binding-linux-ppc64-gnu@1.13.0': + resolution: {integrity: sha512-AG6AgdDrkRNjAPwD/cftFJGgZUWCiJX+E8vpYCDEnwFHLTHZ7ppBiU6/vyPPwrfjcPUPQCDbbxE/eZUXsx49jQ==} + cpu: [ppc64] os: [linux] - lightningcss-linux-arm64-gnu@1.29.1: - resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] + '@unrs/resolver-binding-linux-riscv64-gnu@1.13.0': + resolution: {integrity: sha512-6vOqYGcAmzpRWpUURWutzvpf1qJ6eOu5cfYObdtPJnzZ0+Kw4cw+ZkZJqIYEh8fPuTBwSYDL/FwlUhma1G/JVQ==} + cpu: [riscv64] os: [linux] - lightningcss-linux-arm64-musl@1.29.1: - resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] + '@unrs/resolver-binding-linux-riscv64-musl@1.13.0': + resolution: {integrity: sha512-4HeIn0S2KVUowK0A+EweXrDvZ8CKHEfTtif0kx9vt3ORNsqcXNFFIFnHE0tizma3/Gt5OGrU2ovYNuj+D/bN4g==} + cpu: [riscv64] os: [linux] - lightningcss-linux-x64-gnu@1.29.1: - resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} - engines: {node: '>= 12.0.0'} + '@unrs/resolver-binding-linux-s390x-gnu@1.13.0': + resolution: {integrity: sha512-JfkvqY7NZbxyhexLE+g6Z8Hsx4utHOGaVazAVghPiBn8Upw2iERZPpKYnW1FBVU4WStv/BiIsoK/Muke0E7asA==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.13.0': + resolution: {integrity: sha512-iwjLeVdZo/8v5OKAeRIC+4VQV045t1EPZr5B/AVLgUQ04IdtNthWzg6not2cNjZgH2gHpSf4fOXMmN83aLO1FA==} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.29.1: - resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} - engines: {node: '>= 12.0.0'} + '@unrs/resolver-binding-linux-x64-musl@1.13.0': + resolution: {integrity: sha512-TOh1fqOjyq1OPoht3BDLd7Y+HeMJRwd5g2VNmCQclknEbjp4py5GFRmT4L/rOybF5Af8q0LT9zHs2WGkwlqtrw==} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.29.1: - resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} - engines: {node: '>= 12.0.0'} + '@unrs/resolver-binding-openharmony-arm64@1.13.0': + resolution: {integrity: sha512-3T2MNtF2dd1yjaXCVqrsi+/3VZeksEzU1hygPzqqkBLVVjn+2iJzXEkxxCKIVFrWnpmEbazeHJp/ruYD0RUVWA==} + cpu: [arm64] + os: [openharmony] + + '@unrs/resolver-binding-win32-arm64-msvc@1.13.0': + resolution: {integrity: sha512-hKWfSLiN3L4cIxg0jrpyP/66AXLTcyD37jmSn//rGdOUYGlizYxTEFdJ+GZbp2NnaML3YS/A73nCysze8FaJdg==} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.29.1: - resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} - engines: {node: '>= 12.0.0'} - cpu: [x64] + '@unrs/resolver-binding-win32-ia32-msvc@1.13.0': + resolution: {integrity: sha512-N4gDKkDoiyIQEcn3vTqe2ksRxUAtBvQ8c5TiT+WonSa6FHgCAY5+RggnZ134hXJoRj57JEjv4/m+i/pAKHWrTQ==} + cpu: [ia32] os: [win32] - lightningcss@1.29.1: - resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} - engines: {node: '>= 12.0.0'} + '@unrs/resolver-binding-win32-x64-msvc@1.13.0': + resolution: {integrity: sha512-DpLMlAqlrk4zBVK3DiDjwKD0oq7pZNy+8BiIBRuByqb6dm5jsdoLMhIiyh/xR7+WejaW/1Ui+XgbgMNa4+zWJg==} + cpu: [x64] + os: [win32] - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + '@workos-inc/authkit-nextjs@3.0.0': + resolution: {integrity: sha512-9qER/fIlxGw0gfkBOcHh9Vi9LMBSq9zVsrJReQ6xbd08Ulz9QcrRDxOvs6CX6xitZjxrQKUwkWi0yH1vwUlhVA==} + peerDependencies: + next: ^13.5.9 || ^14.2.26 || ^15.2.3 || ^16 + react: ^18.0 || ^19.0.0 + react-dom: ^18.0 || ^19.0.0 - lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + '@workos-inc/node@8.10.0': + resolution: {integrity: sha512-3UqtU+QqITkQy77UZJumrZxb+4FcUjxgHfC4c186Q0rzSNDZ7YF7iNLWN7QB/q/26KbtgHlEpFS9GX75wUxSEQ==} + engines: {node: '>=20.15.0'} - lucide-react@1.7.0: - resolution: {integrity: sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg==} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - mini-svg-data-uri@1.4.4: - resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + acorn@8.19.0: + resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==} + engines: {node: '>=0.4.0'} hasBin: true - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - next@15.2.8: - resolution: {integrity: sha512-pe2trLKZTdaCuvNER0S9Wp+SP2APf7SfFmyUP9/w1SFA2UqmW0u+IsxCKkiky3n6um7mryaQIlgiDnKrf1ZwIw==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + aos@3.0.0-beta.6: + resolution: {integrity: sha512-VLWrpq8bfAWcetynVHMMrqdC+89Qq/Ym6UBJbHB4crIwp3RR8uq1dNGgsFzoDl03S43rlVMK+na3r5+oUCZsYw==} - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} - postcss@8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} - engines: {node: ^10 || ^12 || >=14} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} - react-dom@19.2.3: - resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} - peerDependencies: - react: ^19.2.3 + array-includes@3.2.0: + resolution: {integrity: sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==} + engines: {node: '>= 0.4'} - react@19.2.3: - resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} - engines: {node: '>=0.10.0'} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.14.0: + resolution: {integrity: sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==} + engines: {node: '>=4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + brace-expansion@1.1.22: + resolution: {integrity: sha512-CKLDTuSsN0+r1ThM0WkzzBI7dnPI6xEGfa/JnVYIK9JNBA1N1NyPwXVHor//NKD/y3sDxp764sZdLhFK7pH8XQ==} + + brace-expansion@5.0.13: + resolution: {integrity: sha512-Vh3dmFbc4wZeox7M9I/0L9GfFd83Su4+yCck/OF9Gi/P/dAHn0RT7X4K9R7gMNMhDck3DvhR6QXsnQdjjgwNvQ==} + engines: {node: 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001696: + resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - hasBin: true - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - simple-swizzle@0.2.4: - resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + classlist-polyfill@1.2.0: + resolution: {integrity: sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} - styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + supports-color: '*' peerDependenciesMeta: - '@babel/core': + supports-color: optional: true - babel-plugin-macros: + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: optional: true - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - tailwind-merge@3.5.0: - resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} - tailwindcss@4.0.3: - resolution: {integrity: sha512-ImmZF0Lon5RrQpsEAKGxRvHwCvMgSC4XVlFRqmbzTEDb/3wvin9zfEZrMwgsa3yqBbPqahYcVI6lulM2S7IZAA==} + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} - engines: {node: '>=14.17'} - hasBin: true + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + engines: {node: '>=10.13.0'} + + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.4.0: + resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} + engines: {node: '>= 0.4'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-next@15.2.8: + resolution: {integrity: sha512-sTk5l0ASdfv9upHwTS0Z98NPfNXAHwVsTNyZaS47rCLkrFQiAzrLowYDLxpZ80SkPZAnzW0Yzw64+AgsRthsMg==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-import-resolver-node@0.3.10: + resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} + + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.14.0: + resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + 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-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@9.39.5: + resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.14.3: + resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@14.0.6: + resolution: {integrity: sha512-OwXjVP2svY5EyLY75Vek96C8qK43gqrt4xsZ+qSILdnaEiJPXkd62mcfUSNx/TQErQRdu5uM5kF67sfONragKw==} + engines: {node: 18 || 20 || >=22} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.14: + resolution: {integrity: sha512-wCBiZ77u1tuWde6G/nfOtLaCTYcFDU5yCzARzK10y+rLhzYoL7a7yEemcopcc2Mzow7gZOIjnV2ym1NYmdiJOQ==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + iron-session@8.0.4: + resolution: {integrity: sha512-9ivNnaKOd08osD0lJ3i6If23GFS2LsxyMU8Gf/uBUEgm8/8CC1hrrCHFDpMo3IFbpBgwoo/eairRsaD3c5itxA==} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.18.0: + resolution: {integrity: sha512-qyax9fgaKOEC4qK8WZn7Q4IcoZC9RC1O1fFxRcRTq/oMMkWT/uXpqpXa12kzWR409zAt1drYN9N9BO26UmBCmw==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-darwin-arm64@1.29.1: + resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.1: + resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.1: + resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.1: + resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.1: + resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.1: + resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.1: + resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.1: + resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.1: + resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.1: + resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.1: + resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} + engines: {node: '>= 12.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} + + lucide-react@1.7.0: + resolution: {integrity: sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magic-string@1.4.5: + resolution: {integrity: sha512-oLLC2+YvQUfAa+vxoufE/yc1icb87M9iXIRqAoR/2EhE/8cb3SF/+Gi0c2By1B+5Vz2e2vQtUvHiu1+63Znh+w==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + minimatch@11.0.8: + resolution: {integrity: sha512-nFQuYSTVrGvysVBps5Ih+0BdnYFN/Cj3C816r6+p7yK+FHrVLGE4O4N9AFwykrlNlvM2HYt+Rad1Uiro6h88Ig==} + engines: {node: 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.3.8: + resolution: {integrity: sha512-dHbDC5V1g/EI8OLEtL4Iuwbu0fgzmyykxenn2KnlsX9XdhTXL3gWnfbbP+ab+oUcgV6CFpb8QGyQt/ZXA0UXig==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next@15.2.8: + resolution: {integrity: sha512-pe2trLKZTdaCuvNER0S9Wp+SP2APf7SfFmyUP9/w1SFA2UqmW0u+IsxCKkiky3n6um7mryaQIlgiDnKrf1ZwIw==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} + engines: {node: '>= 0.4'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} + engines: {node: '>= 0.4'} + + oxc-parser@0.152.0: + resolution: {integrity: sha512-ZztsZgaCWmPeKYMdoTT5e0oV/oxD1NeLWNR3kAtr/G707cUPYaaozRlVDHLCGnszHJRszN9mJwmPNpqgwloC0A==} + engines: {node: ^20.19.0 || >=22.12.0} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@3.0.0: + resolution: {integrity: sha512-1pTbQqH1wIwMi/eleQ5leFTTCkzFsPcgXNjwOA8YGGW/W4/kHT3dssE7Z6NH+zuqNLOzOB0uaD61yl7cAcVhgg==} + engines: {node: 18 || 20 || >=22} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + playwright-core@1.65.0: + resolution: {integrity: sha512-vNSKgH6YqtN7cdT/L334zo0a+YwkrpicyrHJlWWPIm/Q+Nn2SWInil01oT0mbu96U4GgoRtCYQD9CzJQgju+lA==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.65.0: + resolution: {integrity: sha512-F3AMWcR44qMBt4kq+6Kb6mX7bjGXshktKFOPULd7reED6ZJWevjbNRqysP7q+AATE9kdPEZBibex1BYsvpVoeA==} + engines: {node: '>=20'} + hasBin: true + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.10.1: + resolution: {integrity: sha512-70vp3ZUYoPlFbF9uiTdXHUUCGEIp7d4+6p+8DYbkm2jP7x/3i/paXVF6dopSI3zd/CEitrZN1rc4i85xWmmXlg==} + engines: {node: '>=14'} + hasBin: true + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} + peerDependencies: + react: ^19.2.3 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.68.3: + resolution: {integrity: sha512-wd2gavj7CEQv52rdcVqfUupO/KPIKcoJKxyFWl4cOqYZGMQEOSijJRkliz0dRa7gpkj/h4TRqyWa+dJJi6T0OA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.2: + resolution: {integrity: sha512-GYrCADwpu6yV5OAvchkQ27Z5wwMxWAEMg5NNWjyHh/5DboFFqbdbvYNIvZouQpxXyeMPoTOh0vdPYKlf0ZswdQ==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + sentry@0.49.0: + resolution: {integrity: sha512-9tjS0jTx5FQzhwAGhpcnwvqE0MlQiwJtunsIUNqGkw6E9CBOMbijlamIDUqvZTDtJAveVwa9L5ziP44bOJUzcQ==} + engines: {node: '>=20.0'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.1.0: + resolution: {integrity: sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwind-merge@3.5.0: + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + + tailwindcss@4.0.3: + resolution: {integrity: sha512-ImmZF0Lon5RrQpsEAKGxRvHwCvMgSC4XVlFRqmbzTEDb/3wvin9zfEZrMwgsa3yqBbPqahYcVI6lulM2S7IZAA==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.5: + resolution: {integrity: sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + engines: {node: '>= 0.4'} + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unrs-resolver@1.13.0: + resolution: {integrity: sha512-mcPQo9Vm6kXd84d/WqMiYBi2CcA57QHBX/ev5PoUEb8b2oQzUvJ6xYsfseQblnCncgnVmCZGWiFwK7KkS5JZJA==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + valibot@1.3.1: + resolution: {integrity: sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + web-vitals@6.2.3: + resolution: {integrity: sha512-Dmy+vdO1UPMqXiAtZSNayhl4f794Bxfd94W4HIj2HlYtczEQfEOon969memlcpcHrTuOKLa5baFjX7WbgmOq+A==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.24: + resolution: {integrity: sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.5(jiti@2.4.2))': + dependencies: + eslint: 9.39.5(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.3': {} + + '@eslint/config-array@0.21.2': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.7': + dependencies: + ajv: 6.15.0 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.3.2 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.5': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@floating-ui/react@0.26.28(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@floating-ui/utils': 0.2.9 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.9': {} + + '@headlessui/react@2.2.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-aria/focus': 3.19.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-aria/interactions': 3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-virtual': 3.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.7.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@isaacs/nonrecursive-glob-match@1.1.0': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@next/env@15.2.8': {} + + '@next/eslint-plugin-next@15.2.8': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@15.2.5': + optional: true + + '@next/swc-darwin-x64@15.2.5': + optional: true + + '@next/swc-linux-arm64-gnu@15.2.5': + optional: true + + '@next/swc-linux-arm64-musl@15.2.5': + optional: true + + '@next/swc-linux-x64-gnu@15.2.5': + optional: true + + '@next/swc-linux-x64-musl@15.2.5': + optional: true + + '@next/swc-win32-arm64-msvc@15.2.5': + optional: true + + '@next/swc-win32-x64-msvc@15.2.5': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.3 + + '@nolyfill/is-core-module@1.0.39': {} + + '@opentelemetry/api@1.10.0': {} + + '@oxc-parser/binding-android-arm-eabi@0.152.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.152.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.152.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.152.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.152.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.152.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.152.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.152.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.152.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.152.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.152.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.152.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.152.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.152.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.152.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.152.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.152.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.152.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.152.0': + optional: true + + '@oxc-project/types@0.152.0': {} + + '@playwright/test@1.65.0': + dependencies: + playwright: 1.65.0 + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.0.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.0.8 + + '@radix-ui/react-slot@1.2.4(@types/react@19.0.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.0.8 + + '@react-aria/focus@3.19.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@react-aria/interactions': 3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-aria/utils': 3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-types/shared': 3.27.0(react@19.2.3) + '@swc/helpers': 0.5.15 + clsx: 2.1.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@react-aria/interactions@3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@react-aria/ssr': 3.9.7(react@19.2.3) + '@react-aria/utils': 3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-types/shared': 3.27.0(react@19.2.3) + '@swc/helpers': 0.5.15 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@react-aria/ssr@3.9.7(react@19.2.3)': + dependencies: + '@swc/helpers': 0.5.15 + react: 19.2.3 + + '@react-aria/utils@3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@react-aria/ssr': 3.9.7(react@19.2.3) + '@react-stately/utils': 3.10.5(react@19.2.3) + '@react-types/shared': 3.27.0(react@19.2.3) + '@swc/helpers': 0.5.15 + clsx: 2.1.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@react-stately/utils@3.10.5(react@19.2.3)': + dependencies: + '@swc/helpers': 0.5.15 + react: 19.2.3 + + '@react-types/shared@3.27.0(react@19.2.3)': + dependencies: + react: 19.2.3 + + '@rollup/plugin-commonjs@28.0.1(rollup@4.68.3)': + dependencies: + '@rollup/pluginutils': 5.5.1(rollup@4.68.3) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.7) + is-reference: 1.2.1 + magic-string: 0.30.21 + picomatch: 4.0.7 + optionalDependencies: + rollup: 4.68.3 + + '@rollup/pluginutils@5.5.1(rollup@4.68.3)': + dependencies: + '@types/estree': 1.0.10 + estree-walker: 2.0.2 + picomatch: 4.0.7 + optionalDependencies: + rollup: 4.68.3 + + '@rollup/rollup-android-arm-eabi@4.68.3': + optional: true + + '@rollup/rollup-android-arm64@4.68.3': + optional: true + + '@rollup/rollup-android-x64@4.68.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.68.3': + optional: true + + '@rollup/rollup-darwin-x64@4.68.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.68.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.68.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.68.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.68.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.68.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.68.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.68.3': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.68.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.68.3': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.68.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.68.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.68.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.68.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.68.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.68.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.68.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.68.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.68.3': + optional: true + + '@rtsao/scc@1.1.0': {} + + '@rushstack/eslint-patch@1.16.1': {} + + '@sentry/browser-utils@11.12.0': + dependencies: + '@sentry/conventions': 0.32.0 + '@sentry/core': 11.12.0 + web-vitals: 6.2.3 + + '@sentry/browser@11.12.0': + dependencies: + '@sentry/browser-utils': 11.12.0 + '@sentry/conventions': 0.32.0 + '@sentry/core': 11.12.0 + '@sentry/feedback': 11.12.0 + '@sentry/replay': 11.12.0 + '@sentry/replay-canvas': 11.12.0 + + '@sentry/bundler-plugins@11.12.0(rollup@4.68.3)': + dependencies: + '@sentry/core': 11.12.0 + dotenv: 17.4.2 + glob: 14.0.6 + magic-string: 1.4.5 + oxc-parser: 0.152.0 + sentry: 0.49.0 + optionalDependencies: + rollup: 4.68.3 + + '@sentry/cloudflare@11.12.0': + dependencies: + '@opentelemetry/api': 1.10.0 + '@sentry/conventions': 0.32.0 + '@sentry/core': 11.12.0 + '@sentry/opentelemetry': 11.12.0(@opentelemetry/api@1.10.0) + '@sentry/server-utils': 11.12.0 + magic-string: 0.30.21 + + '@sentry/conventions@0.32.0': {} + + '@sentry/core@11.12.0': + dependencies: + '@sentry/conventions': 0.32.0 + + '@sentry/feedback@11.12.0': + dependencies: + '@sentry/core': 11.12.0 + + '@sentry/nextjs@11.12.0(next@15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)': + dependencies: + '@opentelemetry/api': 1.10.0 + '@rollup/plugin-commonjs': 28.0.1(rollup@4.68.3) + '@sentry/browser-utils': 11.12.0 + '@sentry/bundler-plugins': 11.12.0(rollup@4.68.3) + '@sentry/cloudflare': 11.12.0 + '@sentry/conventions': 0.32.0 + '@sentry/core': 11.12.0 + '@sentry/node': 11.12.0(rollup@4.68.3) + '@sentry/opentelemetry': 11.12.0(@opentelemetry/api@1.10.0) + '@sentry/react': 11.12.0(react@19.2.3) + '@sentry/server-runtime-injection': 11.12.0 + '@sentry/server-utils': 11.12.0 + '@sentry/vercel-edge': 11.12.0 + next: 15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + rollup: 4.68.3 + stacktrace-parser: 0.1.11 + transitivePeerDependencies: + - '@cloudflare/workers-types' + - react + - react-router + - vite + - webpack + - wrangler + + '@sentry/node@11.12.0(rollup@4.68.3)': + dependencies: + '@opentelemetry/api': 1.10.0 + '@sentry/bundler-plugins': 11.12.0(rollup@4.68.3) + '@sentry/conventions': 0.32.0 + '@sentry/core': 11.12.0 + '@sentry/opentelemetry': 11.12.0(@opentelemetry/api@1.10.0) + '@sentry/server-runtime-injection': 11.12.0 + '@sentry/server-utils': 11.12.0 + transitivePeerDependencies: + - rollup + - webpack + + '@sentry/opentelemetry@11.12.0(@opentelemetry/api@1.10.0)': + dependencies: + '@opentelemetry/api': 1.10.0 + '@sentry/conventions': 0.32.0 + '@sentry/core': 11.12.0 + + '@sentry/react@11.12.0(react@19.2.3)': + dependencies: + '@sentry/browser': 11.12.0 + '@sentry/conventions': 0.32.0 + '@sentry/core': 11.12.0 + react: 19.2.3 + + '@sentry/replay-canvas@11.12.0': + dependencies: + '@sentry/core': 11.12.0 + '@sentry/replay': 11.12.0 + + '@sentry/replay@11.12.0': + dependencies: + '@sentry/browser-utils': 11.12.0 + '@sentry/core': 11.12.0 + + '@sentry/server-runtime-injection@11.12.0': + dependencies: + '@sentry/core': 11.12.0 + '@sentry/server-utils': 11.12.0 + + '@sentry/server-utils@11.12.0': + dependencies: + '@opentelemetry/api': 1.10.0 + '@sentry/conventions': 0.32.0 + '@sentry/core': 11.12.0 + + '@sentry/vercel-edge@11.12.0': + dependencies: + '@opentelemetry/api': 1.10.0 + '@sentry/core': 11.12.0 + '@sentry/server-utils': 11.12.0 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/forms@0.5.10(tailwindcss@4.0.3)': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 4.0.3 + + '@tailwindcss/node@4.0.3': + dependencies: + enhanced-resolve: 5.18.0 + jiti: 2.4.2 + tailwindcss: 4.0.3 + + '@tailwindcss/oxide-android-arm64@4.0.3': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.0.3': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.0.3': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.0.3': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.0.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.0.3': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.0.3': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.0.3': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.0.3': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.0.3': + optional: true + + '@tailwindcss/oxide@4.0.3': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.0.3 + '@tailwindcss/oxide-darwin-arm64': 4.0.3 + '@tailwindcss/oxide-darwin-x64': 4.0.3 + '@tailwindcss/oxide-freebsd-x64': 4.0.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.0.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.0.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.0.3 + '@tailwindcss/oxide-linux-x64-musl': 4.0.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.0.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.0.3 + + '@tailwindcss/postcss@4.0.3': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.0.3 + '@tailwindcss/oxide': 4.0.3 + lightningcss: 1.29.1 + postcss: 8.5.1 + tailwindcss: 4.0.3 + + '@tanstack/react-virtual@3.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/virtual-core': 3.12.0 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@tanstack/virtual-core@3.12.0': {} + + '@types/aos@3.0.7': {} + + '@types/estree@1.0.10': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/node@22.13.0': + dependencies: + undici-types: 6.20.0 + + '@types/react-dom@19.0.3(@types/react@19.0.8)': + dependencies: + '@types/react': 19.0.8 + + '@types/react@19.0.8': + dependencies: + csstype: 3.1.3 + + '@typescript-eslint/eslint-plugin@8.72.2(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.3 + '@typescript-eslint/parser': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.72.2 + '@typescript-eslint/type-utils': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.72.2 + eslint: 9.39.5(jiti@2.4.2) + ignore: 7.0.14 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.72.2 + '@typescript-eslint/types': 8.72.2 + '@typescript-eslint/typescript-estree': 8.72.2(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.72.2 + debug: 4.4.3 + eslint: 9.39.5(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.72.2(typescript@5.7.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.72.2(typescript@5.7.3) + '@typescript-eslint/types': 8.72.2 + debug: 4.4.3 + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.72.2': + dependencies: + '@typescript-eslint/types': 8.72.2 + '@typescript-eslint/visitor-keys': 8.72.2 + + '@typescript-eslint/tsconfig-utils@8.72.2(typescript@5.7.3)': + dependencies: + typescript: 5.7.3 + + '@typescript-eslint/type-utils@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 8.72.2 + '@typescript-eslint/typescript-estree': 8.72.2(typescript@5.7.3) + '@typescript-eslint/utils': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3) + debug: 4.4.3 + eslint: 9.39.5(jiti@2.4.2) + ts-api-utils: 2.5.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.72.2': {} + + '@typescript-eslint/typescript-estree@8.72.2(typescript@5.7.3)': + dependencies: + '@typescript-eslint/project-service': 8.72.2(typescript@5.7.3) + '@typescript-eslint/tsconfig-utils': 8.72.2(typescript@5.7.3) + '@typescript-eslint/types': 8.72.2 + '@typescript-eslint/visitor-keys': 8.72.2 + debug: 4.4.3 + minimatch: 10.2.6 + semver: 7.7.3 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.72.2 + '@typescript-eslint/types': 8.72.2 + '@typescript-eslint/typescript-estree': 8.72.2(typescript@5.7.3) + eslint: 9.39.5(jiti@2.4.2) + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.72.2': + dependencies: + '@typescript-eslint/types': 8.72.2 + eslint-visitor-keys: 5.0.1 + + '@unrs/resolver-binding-android-arm-eabi@1.13.0': + optional: true + + '@unrs/resolver-binding-android-arm64@1.13.0': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.13.0': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.13.0': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-loong64-gnu@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-loong64-musl@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.13.0': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.13.0': + optional: true + + '@unrs/resolver-binding-openharmony-arm64@1.13.0': + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.13.0': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.13.0': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.13.0': + optional: true + + '@workos-inc/authkit-nextjs@3.0.0(next@15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.7.3)': + dependencies: + '@workos-inc/node': 8.10.0 + iron-session: 8.0.4 + jose: 5.10.0 + next: 15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + path-to-regexp: 6.3.0 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + valibot: 1.3.1(typescript@5.7.3) + transitivePeerDependencies: + - typescript + + '@workos-inc/node@8.10.0': {} + + acorn-jsx@5.3.2(acorn@8.19.0): + dependencies: + acorn: 8.19.0 + + acorn@8.19.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + aos@3.0.0-beta.6: + dependencies: + classlist-polyfill: 1.2.0 + lodash.debounce: 4.0.8 + lodash.throttle: 4.1.1 + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.2.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + ast-types-flow@0.0.8: {} + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.14.0: {} + + axobject-query@4.1.0: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + brace-expansion@1.1.22: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@5.0.13: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001696: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + classlist-polyfill@1.2.0: {} + + client-only@0.0.1: {} + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + optional: true + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + cookie@0.7.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + detect-libc@1.0.3: {} + + detect-libc@2.1.2: + optional: true + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 - uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + dotenv@17.4.2: {} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 - valibot@1.3.1: - resolution: {integrity: sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg==} - peerDependencies: - typescript: '>=5' - peerDependenciesMeta: - typescript: - optional: true + emoji-regex@9.2.2: {} -snapshots: + enhanced-resolve@5.18.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 - '@alloc/quick-lru@5.2.0': {} + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 - '@emnapi/runtime@1.7.1': + es-abstract@1.24.2: dependencies: - tslib: 2.8.1 - optional: true + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.2 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.5 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.24 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.4.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + math-intrinsics: 1.1.0 + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 - '@floating-ui/core@1.6.9': + es-set-tostringtag@2.1.0: dependencies: - '@floating-ui/utils': 0.2.9 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 - '@floating-ui/dom@1.6.13': + es-shim-unscopables@1.1.0: dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/utils': 0.2.9 + hasown: 2.0.4 - '@floating-ui/react-dom@2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + es-to-primitive@1.3.4: dependencies: - '@floating-ui/dom': 1.6.13 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 - '@floating-ui/react@0.26.28(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + escape-string-regexp@4.0.0: {} + + eslint-config-next@15.2.8(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@floating-ui/utils': 0.2.9 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - tabbable: 6.2.0 + '@next/eslint-plugin-next': 15.2.8 + '@rushstack/eslint-patch': 1.16.1 + '@typescript-eslint/eslint-plugin': 8.72.2(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.39.5(jiti@2.4.2) + eslint-import-resolver-node: 0.3.10 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.4.2)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.5(jiti@2.4.2)) + eslint-plugin-react: 7.37.5(eslint@9.39.5(jiti@2.4.2)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.5(jiti@2.4.2)) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color - '@floating-ui/utils@0.2.9': {} + eslint-import-resolver-node@0.3.10: + dependencies: + debug: 3.2.7 + is-core-module: 2.18.0 + resolve: 2.0.0-next.7 + transitivePeerDependencies: + - supports-color - '@headlessui/react@2.2.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.4.2)): dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@react-aria/focus': 3.19.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@react-aria/interactions': 3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-virtual': 3.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3 + eslint: 9.39.5(jiti@2.4.2) + get-tsconfig: 4.14.3 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.17 + unrs-resolver: 1.13.0 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.4.2)) + transitivePeerDependencies: + - supports-color - '@img/sharp-darwin-arm64@0.33.5': + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.4.2)): + dependencies: + debug: 3.2.7 optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 - optional: true + '@typescript-eslint/parser': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.39.5(jiti@2.4.2) + eslint-import-resolver-node: 0.3.10 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.4.2)) + transitivePeerDependencies: + - supports-color - '@img/sharp-darwin-x64@0.33.5': + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.4.2)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.2.0 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.39.5(jiti@2.4.2) + eslint-import-resolver-node: 0.3.10 + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.4.2)) + hasown: 2.0.4 + is-core-module: 2.18.0 + is-glob: 4.0.3 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.2 + string.prototype.trimend: 1.0.10 + tsconfig-paths: 3.15.0 optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 - optional: true + '@typescript-eslint/parser': 8.72.2(eslint@9.39.5(jiti@2.4.2))(typescript@5.7.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color - '@img/sharp-libvips-darwin-arm64@1.0.4': - optional: true + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.5(jiti@2.4.2)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.2.0 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.14.0 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.39.5(jiti@2.4.2) + hasown: 2.0.4 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-react-hooks@5.2.0(eslint@9.39.5(jiti@2.4.2)): + dependencies: + eslint: 9.39.5(jiti@2.4.2) - '@img/sharp-libvips-darwin-x64@1.0.4': - optional: true + eslint-plugin-react@7.37.5(eslint@9.39.5(jiti@2.4.2)): + dependencies: + array-includes: 3.2.0 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.4.0 + eslint: 9.39.5(jiti@2.4.2) + estraverse: 5.3.0 + hasown: 2.0.4 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.5 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.7 + semver: 6.3.2 + string.prototype.matchall: 4.1.0 + string.prototype.repeat: 1.0.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 - '@img/sharp-libvips-linux-arm64@1.0.4': - optional: true + eslint-visitor-keys@3.4.3: {} - '@img/sharp-libvips-linux-arm@1.0.5': - optional: true + eslint-visitor-keys@4.2.1: {} - '@img/sharp-libvips-linux-s390x@1.0.4': - optional: true + eslint-visitor-keys@5.0.1: {} - '@img/sharp-libvips-linux-x64@1.0.4': - optional: true + eslint@9.39.5(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.3 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.7 + '@eslint/js': 9.39.5 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.10 + ajv: 6.15.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - optional: true + espree@10.4.0: + dependencies: + acorn: 8.19.0 + acorn-jsx: 5.3.2(acorn@8.19.0) + eslint-visitor-keys: 4.2.1 - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - optional: true + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 - '@img/sharp-linux-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 - optional: true + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 - '@img/sharp-linux-arm@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 - optional: true + estraverse@5.3.0: {} - '@img/sharp-linux-s390x@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 - optional: true + estree-walker@2.0.2: {} - '@img/sharp-linux-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 - optional: true + esutils@2.0.3: {} - '@img/sharp-linuxmusl-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - optional: true + fast-deep-equal@3.1.3: {} - '@img/sharp-linuxmusl-x64@0.33.5': + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.20.3: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - optional: true + picomatch: 4.0.7 - '@img/sharp-wasm32@0.33.5': + file-entry-cache@8.0.0: dependencies: - '@emnapi/runtime': 1.7.1 - optional: true + flat-cache: 4.0.1 - '@img/sharp-win32-ia32@0.33.5': - optional: true + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 - '@img/sharp-win32-x64@0.33.5': - optional: true + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 - '@next/env@15.2.8': {} + flat-cache@4.0.1: + dependencies: + flatted: 3.4.4 + keyv: 4.5.4 - '@next/swc-darwin-arm64@15.2.5': - optional: true + flatted@3.4.4: {} - '@next/swc-darwin-x64@15.2.5': - optional: true + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 - '@next/swc-linux-arm64-gnu@15.2.5': + fsevents@2.3.3: optional: true - '@next/swc-linux-arm64-musl@15.2.5': - optional: true + function-bind@1.1.2: {} - '@next/swc-linux-x64-gnu@15.2.5': - optional: true + function.prototype.name@1.2.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + es-define-property: 1.0.1 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 + is-callable: 1.2.7 + is-document.all: 1.0.0 - '@next/swc-linux-x64-musl@15.2.5': - optional: true + functions-have-names@1.2.3: {} - '@next/swc-win32-arm64-msvc@15.2.5': - optional: true + generator-function@2.0.1: {} - '@next/swc-win32-x64-msvc@15.2.5': - optional: true + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.0.8)(react@19.2.3)': + get-symbol-description@1.1.0: dependencies: - react: 19.2.3 - optionalDependencies: - '@types/react': 19.0.8 + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 - '@radix-ui/react-slot@1.2.4(@types/react@19.0.8)(react@19.2.3)': + get-tsconfig@4.14.3: dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.8)(react@19.2.3) - react: 19.2.3 - optionalDependencies: - '@types/react': 19.0.8 + resolve-pkg-maps: 1.0.0 - '@react-aria/focus@3.19.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + glob-parent@5.1.2: dependencies: - '@react-aria/interactions': 3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@react-aria/utils': 3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@react-types/shared': 3.27.0(react@19.2.3) - '@swc/helpers': 0.5.15 - clsx: 2.1.1 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + is-glob: 4.0.3 - '@react-aria/interactions@3.23.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + glob-parent@6.0.2: dependencies: - '@react-aria/ssr': 3.9.7(react@19.2.3) - '@react-aria/utils': 3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@react-types/shared': 3.27.0(react@19.2.3) - '@swc/helpers': 0.5.15 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + is-glob: 4.0.3 - '@react-aria/ssr@3.9.7(react@19.2.3)': + glob@14.0.6: dependencies: - '@swc/helpers': 0.5.15 - react: 19.2.3 + minimatch: 11.0.8 + minipass: 7.1.3 + path-scurry: 3.0.0 - '@react-aria/utils@3.27.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + globals@14.0.0: {} + + globalthis@1.0.4: dependencies: - '@react-aria/ssr': 3.9.7(react@19.2.3) - '@react-stately/utils': 3.10.5(react@19.2.3) - '@react-types/shared': 3.27.0(react@19.2.3) - '@swc/helpers': 0.5.15 - clsx: 2.1.1 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + define-properties: 1.2.1 + gopd: 1.2.0 - '@react-stately/utils@3.10.5(react@19.2.3)': + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: dependencies: - '@swc/helpers': 0.5.15 - react: 19.2.3 + es-define-property: 1.0.1 - '@react-types/shared@3.27.0(react@19.2.3)': + has-proto@1.2.0: dependencies: - react: 19.2.3 + dunder-proto: 1.0.1 - '@swc/counter@0.1.3': {} + has-symbols@1.1.0: {} - '@swc/helpers@0.5.15': + has-tostringtag@1.0.2: dependencies: - tslib: 2.8.1 + has-symbols: 1.1.0 - '@tailwindcss/forms@0.5.10(tailwindcss@4.0.3)': + hasown@2.0.4: dependencies: - mini-svg-data-uri: 1.4.4 - tailwindcss: 4.0.3 + function-bind: 1.1.2 - '@tailwindcss/node@4.0.3': - dependencies: - enhanced-resolve: 5.18.0 - jiti: 2.4.2 - tailwindcss: 4.0.3 + ignore@5.3.2: {} - '@tailwindcss/oxide-android-arm64@4.0.3': - optional: true + ignore@7.0.14: {} - '@tailwindcss/oxide-darwin-arm64@4.0.3': - optional: true + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 - '@tailwindcss/oxide-darwin-x64@4.0.3': - optional: true + imurmurhash@0.1.4: {} - '@tailwindcss/oxide-freebsd-x64@4.0.3': - optional: true + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.1 - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.3': - optional: true + iron-session@8.0.4: + dependencies: + cookie: 0.7.2 + iron-webcrypto: 1.2.1 + uncrypto: 0.1.3 - '@tailwindcss/oxide-linux-arm64-gnu@4.0.3': - optional: true + iron-webcrypto@1.2.1: {} - '@tailwindcss/oxide-linux-arm64-musl@4.0.3': - optional: true + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 - '@tailwindcss/oxide-linux-x64-gnu@4.0.3': + is-arrayish@0.3.4: optional: true - '@tailwindcss/oxide-linux-x64-musl@4.0.3': - optional: true + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 - '@tailwindcss/oxide-win32-arm64-msvc@4.0.3': - optional: true + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 - '@tailwindcss/oxide-win32-x64-msvc@4.0.3': - optional: true + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 - '@tailwindcss/oxide@4.0.3': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.0.3 - '@tailwindcss/oxide-darwin-arm64': 4.0.3 - '@tailwindcss/oxide-darwin-x64': 4.0.3 - '@tailwindcss/oxide-freebsd-x64': 4.0.3 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.3 - '@tailwindcss/oxide-linux-arm64-gnu': 4.0.3 - '@tailwindcss/oxide-linux-arm64-musl': 4.0.3 - '@tailwindcss/oxide-linux-x64-gnu': 4.0.3 - '@tailwindcss/oxide-linux-x64-musl': 4.0.3 - '@tailwindcss/oxide-win32-arm64-msvc': 4.0.3 - '@tailwindcss/oxide-win32-x64-msvc': 4.0.3 + is-bun-module@2.0.0: + dependencies: + semver: 7.7.3 - '@tailwindcss/postcss@4.0.3': + is-callable@1.2.7: {} + + is-core-module@2.18.0: dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.0.3 - '@tailwindcss/oxide': 4.0.3 - lightningcss: 1.29.1 - postcss: 8.5.1 - tailwindcss: 4.0.3 + hasown: 2.0.4 - '@tanstack/react-virtual@3.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + is-data-view@1.0.2: dependencies: - '@tanstack/virtual-core': 3.12.0 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 - '@tanstack/virtual-core@3.12.0': {} + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 - '@types/aos@3.0.7': {} + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 - '@types/node@22.13.0': + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: dependencies: - undici-types: 6.20.0 + call-bound: 1.0.4 - '@types/react-dom@19.0.3(@types/react@19.0.8)': + is-generator-function@1.1.2: dependencies: - '@types/react': 19.0.8 + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 - '@types/react@19.0.8': + is-glob@4.0.3: dependencies: - csstype: 3.1.3 + is-extglob: 2.1.1 - '@workos-inc/authkit-nextjs@3.0.0(next@15.2.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.7.3)': + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: dependencies: - '@workos-inc/node': 8.10.0 - iron-session: 8.0.4 - jose: 5.10.0 - next: 15.2.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - path-to-regexp: 6.3.0 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - valibot: 1.3.1(typescript@5.7.3) - transitivePeerDependencies: - - typescript + call-bound: 1.0.4 + has-tostringtag: 1.0.2 - '@workos-inc/node@8.10.0': {} + is-number@7.0.0: {} - aos@3.0.0-beta.6: + is-reference@1.2.1: dependencies: - classlist-polyfill: 1.2.0 - lodash.debounce: 4.0.8 - lodash.throttle: 4.1.1 + '@types/estree': 1.0.10 - busboy@1.6.0: + is-regex@1.2.1: dependencies: - streamsearch: 1.1.0 + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 - caniuse-lite@1.0.30001696: {} + is-set@2.0.3: {} - class-variance-authority@0.7.1: + is-shared-array-buffer@1.0.4: dependencies: - clsx: 2.1.1 - - classlist-polyfill@1.2.0: {} + call-bound: 1.0.4 - client-only@0.0.1: {} + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 - clsx@2.1.1: {} + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - color-convert@2.0.1: + is-typed-array@1.1.15: dependencies: - color-name: 1.1.4 - optional: true + which-typed-array: 1.1.24 - color-name@1.1.4: - optional: true + is-weakmap@2.0.2: {} - color-string@1.9.1: + is-weakref@1.1.1: dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.4 - optional: true + call-bound: 1.0.4 - color@4.2.3: + is-weakset@2.0.4: dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - optional: true + call-bound: 1.0.4 + get-intrinsic: 1.3.0 - cookie@0.7.2: {} + isarray@2.0.5: {} - csstype@3.1.3: {} + isexe@2.0.0: {} - detect-libc@1.0.3: {} + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 - detect-libc@2.1.2: - optional: true + jiti@2.4.2: {} - enhanced-resolve@5.18.0: + jose@5.10.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.3.2: dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 + argparse: 2.0.1 - graceful-fs@4.2.11: {} + json-buffer@3.0.1: {} - iron-session@8.0.4: + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: dependencies: - cookie: 0.7.2 - iron-webcrypto: 1.2.1 - uncrypto: 0.1.3 + minimist: 1.2.8 - iron-webcrypto@1.2.1: {} + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.2.0 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 - is-arrayish@0.3.4: - optional: true + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 - jiti@2.4.2: {} + language-subtag-registry@0.3.23: {} - jose@5.10.0: {} + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 lightningcss-darwin-arm64@1.29.1: optional: true @@ -1139,19 +4202,71 @@ snapshots: lightningcss-win32-arm64-msvc: 1.29.1 lightningcss-win32-x64-msvc: 1.29.1 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + lodash.debounce@4.0.8: {} + lodash.merge@4.6.2: {} + lodash.throttle@4.1.1: {} + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@11.5.3: {} + lucide-react@1.7.0(react@19.2.3): dependencies: react: 19.2.3 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + magic-string@1.4.5: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + math-intrinsics@1.1.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + mini-svg-data-uri@1.4.4: {} + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.13 + + minimatch@11.0.8: + dependencies: + '@isaacs/nonrecursive-glob-match': 1.1.0 + brace-expansion: 5.0.13 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.22 + + minimist@1.2.8: {} + + minipass@7.1.3: {} + + ms@2.1.3: {} + nanoid@3.3.8: {} - next@15.2.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + napi-postinstall@0.3.8: {} + + natural-compare@1.4.0: {} + + next@15.2.8(@opentelemetry/api@1.10.0)(@playwright/test@1.65.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 15.2.8 '@swc/counter': 0.1.3 @@ -1171,15 +4286,141 @@ snapshots: '@next/swc-linux-x64-musl': 15.2.5 '@next/swc-win32-arm64-msvc': 15.2.5 '@next/swc-win32-x64-msvc': 15.2.5 + '@opentelemetry/api': 1.10.0 + '@playwright/test': 1.65.0 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + node-exports-info@1.6.2: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.2 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + oxc-parser@0.152.0: + dependencies: + '@oxc-project/types': 0.152.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.152.0 + '@oxc-parser/binding-android-arm64': 0.152.0 + '@oxc-parser/binding-darwin-arm64': 0.152.0 + '@oxc-parser/binding-darwin-x64': 0.152.0 + '@oxc-parser/binding-freebsd-x64': 0.152.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.152.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.152.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.152.0 + '@oxc-parser/binding-linux-arm64-musl': 0.152.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.152.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.152.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.152.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.152.0 + '@oxc-parser/binding-linux-x64-gnu': 0.152.0 + '@oxc-parser/binding-linux-x64-musl': 0.152.0 + '@oxc-parser/binding-openharmony-arm64': 0.152.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.152.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.152.0 + '@oxc-parser/binding-win32-x64-msvc': 0.152.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@3.0.0: + dependencies: + lru-cache: 11.5.3 + minipass: 7.1.3 + path-to-regexp@6.3.0: {} picocolors@1.1.1: {} + picomatch@2.3.2: {} + + picomatch@4.0.7: {} + + playwright-core@1.65.0: {} + + playwright@1.65.0: + dependencies: + playwright-core: 1.65.0 + + possible-typed-array-names@1.1.0: {} + postcss@8.4.31: dependencies: nanoid: 3.3.8 @@ -1192,17 +4433,145 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prelude-ls@1.2.1: {} + + prettier@3.10.1: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + react-dom@19.2.3(react@19.2.3): dependencies: react: 19.2.3 scheduler: 0.27.0 + react-is@16.13.1: {} + react@19.2.3: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@2.0.0-next.7: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.18.0 + node-exports-info: 1.6.2 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rollup@4.68.3: + dependencies: + '@types/estree': 1.0.10 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.68.3 + '@rollup/rollup-android-arm64': 4.68.3 + '@rollup/rollup-android-x64': 4.68.3 + '@rollup/rollup-darwin-arm64': 4.68.3 + '@rollup/rollup-darwin-x64': 4.68.3 + '@rollup/rollup-freebsd-arm64': 4.68.3 + '@rollup/rollup-freebsd-x64': 4.68.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.68.3 + '@rollup/rollup-linux-arm-musleabihf': 4.68.3 + '@rollup/rollup-linux-arm64-gnu': 4.68.3 + '@rollup/rollup-linux-arm64-musl': 4.68.3 + '@rollup/rollup-linux-loong64-gnu': 4.68.3 + '@rollup/rollup-linux-loong64-musl': 4.68.3 + '@rollup/rollup-linux-ppc64-gnu': 4.68.3 + '@rollup/rollup-linux-ppc64-musl': 4.68.3 + '@rollup/rollup-linux-riscv64-gnu': 4.68.3 + '@rollup/rollup-linux-s390x-gnu': 4.68.3 + '@rollup/rollup-linux-x64-gnu': 4.68.3 + '@rollup/rollup-linux-x64-musl': 4.68.3 + '@rollup/rollup-openharmony-arm64': 4.68.3 + '@rollup/rollup-win32-arm64-msvc': 4.68.3 + '@rollup/rollup-win32-ia32-msvc': 4.68.3 + '@rollup/rollup-win32-x64-msvc': 4.68.3 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + scheduler@0.27.0: {} - semver@7.7.3: - optional: true + semver@6.3.2: {} + + semver@7.7.3: {} + + sentry@0.49.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 sharp@0.33.5: dependencies: @@ -1231,6 +4600,40 @@ snapshots: '@img/sharp-win32-x64': 0.33.5 optional: true + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + simple-swizzle@0.2.4: dependencies: is-arrayish: 0.3.4 @@ -1238,13 +4641,85 @@ snapshots: source-map-js@1.2.1: {} + stable-hash@0.0.5: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + streamsearch@1.1.0: {} + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + string.prototype.matchall@4.1.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.1 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.2 + + string.prototype.trim@1.2.11: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 + + string.prototype.trimend@1.0.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + strip-bom@3.0.0: {} + + strip-json-comments@3.1.1: {} + styled-jsx@5.1.6(react@19.2.3): dependencies: client-only: 0.0.1 react: 19.2.3 + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + tabbable@6.2.0: {} tailwind-merge@3.5.0: {} @@ -1253,14 +4728,160 @@ snapshots: tapable@2.2.1: {} + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@2.5.0(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.8.1: {} + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.7.1: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.5: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.8: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + typescript@5.7.3: {} + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + uncrypto@0.1.3: {} undici-types@6.20.0: {} + unrs-resolver@1.13.0: + dependencies: + napi-postinstall: 0.3.8 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.13.0 + '@unrs/resolver-binding-android-arm64': 1.13.0 + '@unrs/resolver-binding-darwin-arm64': 1.13.0 + '@unrs/resolver-binding-darwin-x64': 1.13.0 + '@unrs/resolver-binding-freebsd-x64': 1.13.0 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.13.0 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.13.0 + '@unrs/resolver-binding-linux-arm64-gnu': 1.13.0 + '@unrs/resolver-binding-linux-arm64-musl': 1.13.0 + '@unrs/resolver-binding-linux-loong64-gnu': 1.13.0 + '@unrs/resolver-binding-linux-loong64-musl': 1.13.0 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.13.0 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.13.0 + '@unrs/resolver-binding-linux-riscv64-musl': 1.13.0 + '@unrs/resolver-binding-linux-s390x-gnu': 1.13.0 + '@unrs/resolver-binding-linux-x64-gnu': 1.13.0 + '@unrs/resolver-binding-linux-x64-musl': 1.13.0 + '@unrs/resolver-binding-openharmony-arm64': 1.13.0 + '@unrs/resolver-binding-win32-arm64-msvc': 1.13.0 + '@unrs/resolver-binding-win32-ia32-msvc': 1.13.0 + '@unrs/resolver-binding-win32-x64-msvc': 1.13.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + valibot@1.3.1(typescript@5.7.3): optionalDependencies: typescript: 5.7.3 + + web-vitals@6.2.3: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.2.0 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.24 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.24: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yocto-queue@0.1.0: {} diff --git a/quality/eslint-baseline.json b/quality/eslint-baseline.json new file mode 100644 index 0000000..79ac8ca --- /dev/null +++ b/quality/eslint-baseline.json @@ -0,0 +1,15 @@ +{ + "app/(auth)/reset-password/page.tsx:@typescript-eslint/no-unused-vars:b728893e4acb0f9c:69133de71f6611d2:2": 1, + "app/(default)/terms/page.tsx:react/no-unescaped-entities:1c3839c03cb2b991:c5a5e2a1458b58b1:2": 2, + "app/(default)/terms/page.tsx:react/no-unescaped-entities:1c3839c03cb2b991:ffd76ff58589503a:2": 2, + "app/(default)/terms/page.tsx:react/no-unescaped-entities:1c3839c03cb2b991:b00b6f721170ad06:2": 2, + "app/api/hello/route.ts:@typescript-eslint/no-unused-vars:4de5a2da09f9a3a6:d94ae0b200cbd3e2:2": 1, + "components/features.tsx:@typescript-eslint/no-unused-vars:46caadc339cb7170:1ea0b1617e95c54d:2": 1, + "components/spotlight.tsx:@typescript-eslint/no-unused-expressions:0c76df5cc23b85bd:8f8b048b5ead5eac:2": 1, + "components/spotlight.tsx:react-hooks/exhaustive-deps:24b591d6474d100c:5e61b3167f235ea7:1": 1, + "components/testimonials.tsx:react/no-unescaped-entities:4a5fcfbb4b1a13ca:3f24d4ed5fa4dd97:2": 1, + "components/ui/footer.tsx:@next/next/no-html-link-for-pages:4944a2c195abdcd8:8ded8914e8d7bde0:2": 1, + "components/ui/footer.tsx:@next/next/no-html-link-for-pages:4944a2c195abdcd8:a183b133e812c4cb:2": 1, + "components/ui/footer.tsx:@next/next/no-html-link-for-pages:4944a2c195abdcd8:eecb865f44dfc990:2": 2, + "components/ui/footer.tsx:@next/next/no-html-link-for-pages:4944a2c195abdcd8:48610c20e48ab358:2": 1 +} diff --git a/quality/format-baseline.json b/quality/format-baseline.json new file mode 100644 index 0000000..b24ba89 --- /dev/null +++ b/quality/format-baseline.json @@ -0,0 +1,15 @@ +{ + "app/(default)/contact/page.tsx": "e723e9a1e4d88cbf41b21369b7753a8ffcf1495a994d2a5fc5d722d11592448c", + "app/(default)/disclaimer/page.tsx": "6b5def71b5cebd2a2d2f2b17483cba9b496ec9e46313b5d5ddd42ff499aad2ef", + "app/(default)/privacy/page.tsx": "2533bf409f5faf43215ec1910dbef61eef162eb8812f034700c0be2379fb450b", + "app/(default)/terms/page.tsx": "80b14b6e136839234c0b204d1df974fdc83975efe56f93ab33180328a0dbe96a", + "components/features.tsx": "885658ebb2b323a135a0d87deaded0dd4b03914311f49b8eb814372bffc33ff3", + "components/hero-home.tsx": "6f10ff5e9953fd4b430dd1ffa7b350f3c803be1552c017b5c4e39addc0df0ab6", + "components/legal/legal-page.tsx": "b7696c0b85dc215f8e91394994cbc516cb058ac289fe19906612ea2022ffc356", + "components/ui/badge.tsx": "7e1318d20f902eba92bccdbef3c20143fcfc85a444816deccd2a4e8ee86ad268", + "components/ui/button.tsx": "d6a638903cce1dde29ad180eef2ab36665f201c411d5b75022942d96cce51a4e", + "components/ui/card.tsx": "c375ec8547fc642b51a03b5effa4f7264e399ffdb94c84977aad478092142035", + "components/ui/header.tsx": "ee35b9035a2521a150f26b2e5b598b84be55e8445b8bd9e844248a5f1bf3847c", + "components/workflows.tsx": "7e204c9bcd1eaacea01e0567cbcc05e6d0e2b11086d4976949bfb81c5decbb5a", + "postcss.config.js": "323d21314f4ee8f2a44c196b2a0cfc87b98144ac5eae429c1749dd5a4da9da1f" +} diff --git a/scripts/check-format.mjs b/scripts/check-format.mjs new file mode 100644 index 0000000..e3f8969 --- /dev/null +++ b/scripts/check-format.mjs @@ -0,0 +1,66 @@ +if (process.env.CI && process.argv.includes("--baseline")) + throw new Error("CI may not regenerate formatting debt"); +import { execFileSync } from "node:child_process"; +import { createHash } from "node:crypto"; +import { existsSync, readFileSync, writeFileSync } from "node:fs"; +import * as prettier from "prettier"; +const path = "quality/format-baseline.json"; +const files = [ + ...new Set( + execFileSync( + "git", + ["ls-files", "--cached", "--others", "--exclude-standard", "-z"], + { encoding: "utf8" }, + ).split("\0"), + ), +].filter( + (file) => + /\.(?:ts|tsx|js|mjs|json|yml|yaml)$/.test(file) && + !/(?:^|\/)(?:node_modules|dist|coverage|samples|uploads|quality|playwright-report|test-results)\//.test( + file, + ) && + !["pnpm-lock.yaml", "package-lock.json"].includes(file) && + existsSync(file), +); +const baseline = existsSync(path) ? JSON.parse(readFileSync(path, "utf8")) : {}; +const changed = new Set( + execFileSync("git", ["diff", "HEAD", "--name-only"], { + encoding: "utf8", + }).split("\n"), +); +const tracked = new Set( + execFileSync("git", ["ls-files"], { encoding: "utf8" }).split("\n"), +); +const next = {}; +let failed = false; +for (const file of files) { + const text = readFileSync(file, "utf8"); + const hash = createHash("sha256").update(text).digest("hex"); + if ( + await prettier.check(text, { + ...(await prettier.resolveConfig(file)), + filepath: file, + }) + ) + continue; + if ( + process.argv.includes("--baseline") && + tracked.has(file) && + !changed.has(file) + ) { + next[file] = hash; + continue; + } + if (baseline[file] === hash) { + next[file] = hash; + continue; + } + console.error(`Formatting required: ${file}`); + failed = true; +} +if (process.argv.includes("--baseline")) + writeFileSync(path, JSON.stringify(next, null, 2) + "\n"); +console.log( + `Formatting: ${files.length} files checked, ${Object.keys(next).length} unchanged historical exceptions`, +); +if (failed) process.exitCode = 1; diff --git a/scripts/check-quality.mjs b/scripts/check-quality.mjs new file mode 100644 index 0000000..a15eb8f --- /dev/null +++ b/scripts/check-quality.mjs @@ -0,0 +1,61 @@ +import { ESLint } from "eslint"; +import { createHash } from "node:crypto"; +import { readFileSync, writeFileSync } from "node:fs"; +const backend = + JSON.parse(readFileSync("package.json", "utf8")).name === "loadiq-api"; +const files = backend + ? ["src/**/*.ts", "test/**/*.ts"] + : [ + "app/**/*.{ts,tsx}", + "components/**/*.{ts,tsx}", + "lib/**/*.{ts,tsx}", + "tests/**/*.ts", + "middleware.ts", + "instrumentation*.ts", + ]; +const results = await new ESLint({ errorOnUnmatchedPattern: false }).lintFiles( + files, +); +const counts = {}; +if (process.env.CI && process.argv.includes("--baseline")) + throw new Error("CI may not regenerate lint debt"); +for (const result of results) + for (const message of result.messages) { + if (message.fatal) + throw new Error("Fatal ESLint parsing/configuration error"); + const file = result.filePath.slice(process.cwd().length + 1); + const source = readFileSync(result.filePath, "utf8") + .split("\n") + .slice(message.line - 1, message.endLine ?? message.line) + .map((line) => line.trim()) + .join("\n"); + const sourceHash = createHash("sha256") + .update(source) + .digest("hex") + .slice(0, 16); + const key = `${file}:${message.ruleId ?? "parse"}:${createHash("sha256").update(message.message).digest("hex").slice(0, 16)}:${sourceHash}:${message.severity}`; + counts[key] = (counts[key] ?? 0) + 1; + } +const path = "quality/eslint-baseline.json"; +if (process.argv.includes("--baseline")) { + // Manual debt acknowledgement only; CI never invokes this option. + writeFileSync(path, JSON.stringify(counts, null, 2) + "\n"); + console.log( + `Recorded ${Object.values(counts).reduce((a, b) => a + b, 0)} existing lint findings`, + ); +} else { + const baseline = JSON.parse(readFileSync(path, "utf8")); + let failures = 0; + for (const [key, count] of Object.entries(counts)) + if (count > (baseline[key] ?? 0)) { + console.error( + `New lint finding: ${key} (${count - (baseline[key] ?? 0)})`, + ); + failures++; + } + if (failures) process.exitCode = 1; + else + console.log( + `Lint gate passed; ${Object.values(counts).reduce((a, b) => a + b, 0)} acknowledged historical findings remain`, + ); +} diff --git a/scripts/e2e-server.mjs b/scripts/e2e-server.mjs new file mode 100644 index 0000000..da71a2f --- /dev/null +++ b/scripts/e2e-server.mjs @@ -0,0 +1,49 @@ +import { spawn } from "node:child_process"; +const env = { + ...process.env, + NODE_ENV: "development", + LOADIQ_E2E_MODE: "true", + LOADIQ_E2E_SECRET: "synthetic-e2e-local-only", + LOADIQ_API_BASE_URL: "http://127.0.0.1:4319", + LOADIQ_INTERNAL_API_KEY: "synthetic-internal", + NEXT_TELEMETRY_DISABLED: "1", + WORKOS_API_KEY: "", + WORKOS_CLIENT_ID: "", + WORKOS_COOKIE_PASSWORD: "", + SENTRY_DSN: "", + NEXT_PUBLIC_SENTRY_DSN: "", +}; +const children = [ + spawn(process.execPath, ["tests/fixture-server.mjs"], { + stdio: "inherit", + env, + }), + spawn( + process.execPath, + [ + "node_modules/next/dist/bin/next", + "dev", + "--hostname", + "127.0.0.1", + "--port", + "4318", + ], + { stdio: "inherit", env }, + ), +]; +let stopping = false; +function stop() { + if (stopping) return; + stopping = true; + children.forEach((child) => child.kill("SIGTERM")); +} +process.on("SIGTERM", stop); +process.on("SIGINT", stop); +children.forEach((child) => + child.on("exit", (code) => { + if (!stopping) { + stop(); + process.exitCode = code || 1; + } + }), +); diff --git a/tests/dashboard.spec.ts b/tests/dashboard.spec.ts new file mode 100644 index 0000000..baccdb1 --- /dev/null +++ b/tests/dashboard.spec.ts @@ -0,0 +1,74 @@ +import { test, expect } from "@playwright/test"; +const session = { "x-loadiq-e2e-session": "synthetic-e2e-local-only:alice" }; +test.beforeEach(async ({ page }) => { + await page.route("**/*", (route) => { + const target = new URL(route.request().url()); + return target.origin === "http://127.0.0.1:4318" + ? route.continue() + : route.abort(); + }); + await page.setExtraHTTPHeaders(session); +}); +test("dashboard loads fixture data", async ({ page }) => { + await page.goto("/app"); + await expect( + page.getByRole("heading", { name: "Welcome back, alice" }), + ).toBeVisible(); + await expect(page.getByText("Alice fixture week")).toBeVisible(); +}); +test("daily signals are displayed with units", async ({ page }) => { + await page.goto("/app"); + await expect(page.getByText("8000", { exact: true })).toBeVisible(); + await expect(page.getByText("420 min", { exact: true })).toBeVisible(); + await expect(page.getByText("56 bpm", { exact: true })).toBeVisible(); +}); +test("insights display deterministic recommendations", async ({ page }) => { + await page.goto("/app"); + await expect(page.getByText("Keep training intensity easy")).toBeVisible(); +}); +test("missing and historical data remains limited", async ({ page }) => { + await page.setExtraHTTPHeaders({ + ...session, + "x-loadiq-e2e-scenario": "limited", + }); + await page.goto("/app"); + await expect(page.getByText("Limited data", { exact: true })).toBeVisible(); + await expect( + page.getByText("Historical data only; current recovery is unknown."), + ).toBeVisible(); + await expect(page.getByText("No recent wearable data")).toBeVisible(); +}); +test("API failure is controlled", async ({ page }) => { + await page.setExtraHTTPHeaders({ + ...session, + "x-loadiq-e2e-scenario": "error", + }); + await page.goto("/app"); + await expect( + page.getByRole("heading", { name: "Dashboard unavailable" }), + ).toBeVisible(); +}); +test("protected route redirects without a session", async ({ request }) => { + const result = await request.get("/app", { maxRedirects: 0 }); + expect([302, 303, 307, 308]).toContain(result.status()); + expect(result.headers().location).toContain("/signin"); +}); +test("identity cannot be overridden by query or client user headers", async ({ + page, +}) => { + await page.setExtraHTTPHeaders({ + ...session, + "x-loadiq-external-auth-id": "synthetic-bob", + }); + await page.goto("/app?userId=synthetic-bob"); + await expect(page.getByText("Alice fixture week")).toBeVisible(); + await expect(page.getByText("Bob fixture week")).toHaveCount(0); +}); +test("second isolated session sees only its own fixtures", async ({ page }) => { + await page.setExtraHTTPHeaders({ + "x-loadiq-e2e-session": "synthetic-e2e-local-only:bob", + }); + await page.goto("/app"); + await expect(page.getByText("Bob fixture week")).toBeVisible(); + await expect(page.getByText("Alice fixture week")).toHaveCount(0); +}); diff --git a/tests/fixture-server.mjs b/tests/fixture-server.mjs new file mode 100644 index 0000000..6f5d6fe --- /dev/null +++ b/tests/fixture-server.mjs @@ -0,0 +1,115 @@ +import { createServer } from "node:http"; +const date = "2020-01-06"; +function summary(limited, bob) { + return { + asOfDate: date, + daily: { + date, + summary: { + headline: limited ? "Limited data" : "Recovery signals stable", + status: limited ? "limited_data" : "stable", + narrative: [ + limited + ? "Historical data only; current recovery is unknown." + : "Synthetic recovery summary.", + ], + nextActions: limited ? [] : ["Choose an easy workout"], + }, + coverage: { + insufficientData: limited, + insufficientReasons: limited ? ["No recent wearable data"] : [], + }, + states: [], + recommendations: limited + ? [] + : [ + { + recommendationType: "RECOVERY", + confidence: 0.8, + priority: 1, + payloadJson: { actions: ["Keep training intensity easy"] }, + }, + ], + }, + weekly: { + period: { from: "2019-12-31", to: date, anchorDate: date }, + summary: { + headline: bob ? "Bob fixture week" : "Alice fixture week", + narrative: ["Synthetic weekly summary"], + nextActions: [], + metrics: { + coverage: { weightDays: 0, wearableDays: limited ? 0 : 7 }, + body: { + latestWeightKg: null, + averageWeightKg: null, + weightChangeKg: null, + }, + recovery: { + averageRestingHr: limited ? null : 56, + averageSleepDurationMin: limited ? null : 420, + averageStressScore: limited ? null : 25, + }, + activity: { + totalSteps: limited ? 0 : 56000, + averageSteps: limited ? null : 8000, + totalCaloriesBurned: 0, + }, + activitySessions: { + sessionCount: 0, + totalSessionDurationMin: 0, + totalSessionCalories: 0, + }, + }, + }, + coverage: {}, + highlights: [], + }, + latestWeight: null, + latestWearable: limited + ? null + : { date, sourceType: "synthetic", sourceRef: "fixture" }, + imports: { recentCount: 0, latest: null }, + }; +} +const server = createServer((req, res) => { + if (req.url === "/health") return res.end("ok"); + if ( + req.headers["x-loadiq-internal-api-key"] !== "synthetic-internal" || + !["synthetic-alice", "synthetic-bob"].includes( + req.headers["x-loadiq-external-auth-id"], + ) + ) { + res.writeHead(403); + return res.end(); + } + if (req.headers["x-loadiq-e2e-scenario"] === "error") { + res.writeHead(503); + return res.end(); + } + const limited = req.headers["x-loadiq-e2e-scenario"] === "limited"; + const bob = req.headers["x-loadiq-external-auth-id"] === "synthetic-bob"; + const url = new URL(req.url, "http://127.0.0.1"); + const body = url.pathname.endsWith("/summary") + ? summary(limited, bob) + : url.pathname.endsWith("/timeline") + ? { + range: { days: 28, from: "2019-12-10", to: date }, + points: limited + ? [] + : [ + { + date, + weightKg: null, + steps: bob ? 3000 : 8000, + sleepDurationMin: 420, + restingHr: 56, + stressScore: 25, + }, + ], + } + : []; + res.setHeader("Content-Type", "application/json"); + res.end(JSON.stringify(body)); +}); +server.listen(4319, "127.0.0.1"); +process.on("SIGTERM", () => server.close()); diff --git a/tests/privacy.spec.ts b/tests/privacy.spec.ts new file mode 100644 index 0000000..e626518 --- /dev/null +++ b/tests/privacy.spec.ts @@ -0,0 +1,206 @@ +import { spawnSync } from "node:child_process"; +import { test, expect } from "@playwright/test"; +import { scrubEvent, euDsn } from "../lib/monitoring/privacy"; +import { e2eEnabled } from "../lib/e2e-mode"; +test("monitoring strips all sensitive event context", () => { + const event = { + event_id: "a".repeat(32), + request: { + headers: { Authorization: "synthetic-secret" }, + cookies: "synthetic-cookie", + data: { hrv: 999 }, + }, + user: { + email: "private@example.invalid", + id: "synthetic-private-id", + username: "synthetic-private-name", + ip_address: "203.0.113.42", + }, + extra: { gps: [45, 16] }, + exception: { values: [{ value: "synthetic-private-error" }] }, + }; + const serialized = JSON.stringify(scrubEvent(event)); + for (const value of [ + "synthetic-secret", + "synthetic-cookie", + "999", + "private@example.invalid", + "gps", + "synthetic-private-error", + ]) + expect(serialized).not.toContain(value); + expect(euDsn("https://synthetic@o1.ingest.us.sentry.io/1")).toBeUndefined(); +}); +test("test authentication cannot activate in production", () => { + const original = { ...process.env }; + try { + Object.assign(process.env, { + NODE_ENV: "production", + LOADIQ_E2E_MODE: "true", + LOADIQ_E2E_SECRET: "synthetic-e2e-local-only", + LOADIQ_API_BASE_URL: "http://127.0.0.1:4319", + }); + expect(e2eEnabled()).toBe(false); + const build = spawnSync( + process.execPath, + ["-e", 'require("./next.config.js")'], + { env: process.env, encoding: "utf8" }, + ); + expect(build.status).not.toBe(0); + expect(build.stderr).toContain( + "E2E authentication is forbidden in production", + ); + } finally { + process.env = original; + } +}); + +test("frontend SDK initialization scrubs its transport envelope", async () => { + const Sentry = await import("@sentry/nextjs"); + const { monitoringOptions } = await import("../lib/monitoring/sentry"); + const envelopes: unknown[] = []; + Sentry.init({ + ...monitoringOptions("https://synthetic@o1.ingest.de.sentry.io/1"), + integrations: [], + transport: () => ({ + send: (envelope: unknown) => { + envelopes.push(envelope); + return Promise.resolve({ statusCode: 200 }); + }, + flush: () => Promise.resolve(true), + }), + }); + const original = new TypeError("synthetic-private-error"); + original.stack = + "TypeError: synthetic-private-error\n at render (https://private.invalid/_next/static/chunks/app/app/page-1234abcd.js:123:7)"; + Sentry.captureException(original, { + user: { + email: "private@example.invalid", + id: "synthetic-private-id", + username: "synthetic-private-name", + ip_address: "203.0.113.42", + }, + extra: { Authorization: "synthetic-secret", gps: [45, 16] }, + }); + await Sentry.flush(2000); + expect(envelopes).toHaveLength(1); + const serialized = JSON.stringify(envelopes); + for (const value of [ + "synthetic-private-error", + "private@example.invalid", + "synthetic-secret", + "gps", + "synthetic-private-name", + "203.0.113.42", + ]) + expect(serialized).not.toContain(value); + expect(serialized).toContain("Application operation failed"); + expect(serialized).toContain("_next/static/chunks/app/app/page-1234abcd.js"); + expect(serialized).not.toContain("private.invalid"); + expect(serialized).toContain("TypeError"); + expect(serialized).not.toContain("synthetic-private-id"); + await Sentry.close(); +}); + +test("retains useful technical diagnostics without runtime or personal context", () => { + const input = { + event_id: "a".repeat(32), + tags: { operation: "frontend", userId: "synthetic-private-id" }, + exception: { + values: [ + { + type: "TypeError", + value: "synthetic-secret hrv=999 gps=45,16", + stacktrace: { + frames: [ + { + filename: + "/Users/synthetic-private-id/project/components/product/dashboard-page.tsx?token=synthetic-secret", + lineno: 123, + colno: 7, + function: "synthetic-private-function", + vars: { hrv: 999 }, + pre_context: ["synthetic-secret"], + }, + { + filename: + "https://private.invalid/uploads/synthetic-private-id/activity.fit", + lineno: 10, + }, + { + filename: + "https://private.invalid/_next/static/chunks/123-abcd.js?token=synthetic-secret", + lineno: 456, + colno: 8, + }, + ], + }, + }, + ], + }, + }; + const safe = scrubEvent(input); + expect(safe.exception.values[0].type).toBe("TypeError"); + expect(safe.exception.values[0].stacktrace.frames).toEqual([ + { + filename: "components/product/dashboard-page.tsx", + lineno: 123, + colno: 7, + in_app: true, + }, + { + filename: "_next/static/chunks/123-abcd.js", + lineno: 456, + colno: 8, + in_app: true, + }, + ]); + expect((safe as unknown as { fingerprint: string[] }).fingerprint).toEqual([ + "{{ default }}", + "frontend", + "TypeError", + ]); + const serialized = JSON.stringify(safe); + for (const secret of [ + "synthetic-secret", + "999", + "45,16", + "synthetic-private-id", + "private.invalid", + "synthetic-private-function", + "pre_context", + ]) + expect(serialized).not.toContain(secret); +}); +test("rejects arbitrary categories, filenames and invalid frame positions", () => { + const safe = scrubEvent({ + event_id: "a".repeat(32), + exception: { + values: [ + { + type: "private-health-category", + value: "private-health", + stacktrace: { + frames: [ + { + filename: "components/product/dashboard-page.tsx", + lineno: NaN, + colno: Infinity, + }, + { filename: "src/not-reviewed-user-file.ts", lineno: 123 }, + ], + }, + }, + ], + }, + }); + expect(safe.exception.values[0].type).toBe("Error"); + expect(safe.exception.values[0].stacktrace.frames).toEqual([ + { + filename: "components/product/dashboard-page.tsx", + lineno: undefined, + colno: undefined, + in_app: true, + }, + ]); +});