From 25d852b96afab233ba60d15bdcd58e436dc51bd1 Mon Sep 17 00:00:00 2001 From: Jared Scott Date: Tue, 2 Dec 2025 19:33:11 +0800 Subject: [PATCH 1/9] feat: Begin replacing wouter with nextJS routing Signed-off-by: Jared Scott --- js/app/(mainComponents)/NavBar.tsx | 152 ++ js/app/(mainComponents)/RecceVersionBadge.tsx | 90 + js/app/(mainComponents)/TopBar.tsx | 212 ++ js/app/@lineage/default.tsx | 20 + js/app/@lineage/page.tsx | 14 + js/app/MainLayout.tsx | 117 + js/app/Providers.tsx | 39 +- .../CheckPage.tsx => app/checks/page.tsx} | 48 +- js/app/error.tsx | 81 + js/app/global-error.tsx | 114 + js/app/layout.tsx | 13 +- js/app/page.tsx | 581 +---- js/package.json | 6 +- js/pnpm-lock.yaml | 1922 ++++++++++++++++- js/src/components/app/StateImporter.tsx | 4 +- js/src/components/app/StateSynchronizer.tsx | 4 +- js/src/components/check/CheckDetail.tsx | 24 +- js/src/components/check/CheckEmptyState.tsx | 4 +- js/src/components/check/CheckList.tsx | 2 +- js/src/components/check/utils.ts | 12 + js/src/components/lineage/LineageView.tsx | 4 +- .../lineage/LineageViewContextMenu.tsx | 4 +- js/src/components/lineage/NodeView.tsx | 6 +- .../components/routing/HashbangRedirect.tsx | 102 + js/src/components/run/RunList.tsx | 4 +- js/src/components/run/RunResultPane.tsx | 4 +- js/src/lib/hooks/RecceActionContext.tsx | 9 +- js/src/lib/hooks/useAppRouter.ts | 165 ++ js/src/lib/hooks/useHashLocation.ts | 19 - 29 files changed, 3070 insertions(+), 706 deletions(-) create mode 100644 js/app/(mainComponents)/NavBar.tsx create mode 100644 js/app/(mainComponents)/RecceVersionBadge.tsx create mode 100644 js/app/(mainComponents)/TopBar.tsx create mode 100644 js/app/@lineage/default.tsx create mode 100644 js/app/@lineage/page.tsx create mode 100644 js/app/MainLayout.tsx rename js/{src/components/check/CheckPage.tsx => app/checks/page.tsx} (82%) create mode 100644 js/app/error.tsx create mode 100644 js/app/global-error.tsx create mode 100644 js/src/components/check/utils.ts create mode 100644 js/src/components/routing/HashbangRedirect.tsx create mode 100644 js/src/lib/hooks/useAppRouter.ts delete mode 100644 js/src/lib/hooks/useHashLocation.ts diff --git a/js/app/(mainComponents)/NavBar.tsx b/js/app/(mainComponents)/NavBar.tsx new file mode 100644 index 000000000..6ffab0434 --- /dev/null +++ b/js/app/(mainComponents)/NavBar.tsx @@ -0,0 +1,152 @@ +import { Box, Flex, Link, Tabs } from "@chakra-ui/react"; +import { useQuery } from "@tanstack/react-query"; +import { usePathname } from "next/navigation"; +import React, { Activity, ReactNode, useEffect, useMemo } from "react"; +import { EnvInfo } from "@/components/app/EnvInfo"; +import { Filename } from "@/components/app/Filename"; +import { StateExporter } from "@/components/app/StateExporter"; +import { TopLevelShare } from "@/components/app/StateSharing"; +import { StateSynchronizer } from "@/components/app/StateSynchronizer"; +import { cacheKeys } from "@/lib/api/cacheKeys"; +import { Check, listChecks } from "@/lib/api/checks"; +import { trackNavigation } from "@/lib/api/track"; +import { useLineageGraphContext } from "@/lib/hooks/LineageGraphContext"; +import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; +import { useRecceServerFlag } from "@/lib/hooks/useRecceServerFlag"; + +/** + * Route configuration for tabs + */ +const ROUTE_CONFIG = [ + { path: "/lineage", name: "Lineage" }, + { path: "/query", name: "Query" }, + { path: "/checks", name: "Checklist" }, +] as const; + +interface TabBadgeProps { + queryKey: string[]; + fetchCallback: () => Promise; + selectCallback?: (data: T) => number; +} + +function TabBadge({ + queryKey, + fetchCallback, + selectCallback, +}: TabBadgeProps): ReactNode { + const { + data: count, + isLoading, + error, + } = useQuery({ + queryKey: queryKey, + queryFn: fetchCallback, + select: selectCallback, + }); + + if (isLoading || error || count === 0) { + return <>; + } + + return ( + + {count} + + ); +} + +// NavBar component with Next.js Link navigation +export default function NavBar() { + const pathname = usePathname(); + const { isDemoSite, isLoading, cloudMode } = useLineageGraphContext(); + const { featureToggles } = useRecceInstanceContext(); + const { data: flag, isLoading: isFlagLoading } = useRecceServerFlag(); + const ChecklistBadge = ( + + queryKey={cacheKeys.checks()} + fetchCallback={listChecks} + selectCallback={(checks: Check[]) => { + return checks.filter((check) => !check.is_checked).length; + }} + /> + ); + // Track navigation changes + useEffect(() => { + trackNavigation({ from: location.pathname, to: pathname }); + }, [pathname]); + + // Get current tab value from pathname + const currentTab = useMemo(() => { + if (pathname.startsWith("/checks")) return "/checks"; + if (pathname.startsWith("/query")) return "/query"; + if (pathname.startsWith("/runs")) return "/runs"; + return "/lineage"; + }, [pathname]); + + return ( + + + {/* Left section: Tabs */} + + {ROUTE_CONFIG.map(({ path, name }) => { + const disable = name === "Query" && flag?.single_env_onboarding; + + return ( + + ); + })} + + + {/* Center section: Filename and TopLevelShare */} + + {!isLoading && !isDemoSite && } + {!isLoading && + !isDemoSite && + !flag?.single_env_onboarding && + !featureToggles.disableShare && } + + + {/* Right section: EnvInfo, StateSynchronizer, StateExporter */} + {!isLoading && ( + + + {cloudMode && } + + + )} + + + ); +} diff --git a/js/app/(mainComponents)/RecceVersionBadge.tsx b/js/app/(mainComponents)/RecceVersionBadge.tsx new file mode 100644 index 000000000..4641b33fd --- /dev/null +++ b/js/app/(mainComponents)/RecceVersionBadge.tsx @@ -0,0 +1,90 @@ +import { Badge, Code, Link, Text } from "@chakra-ui/react"; +import React, { useEffect, useMemo } from "react"; +import { toaster } from "@/components/ui/toaster"; +import { useVersionNumber } from "@/lib/api/version"; + +export default function RecceVersionBadge() { + const { version, latestVersion } = useVersionNumber(); + const versionFormatRegex = useMemo( + () => new RegExp("^\\d+\\.\\d+\\.\\d+$"), + [], + ); + + useEffect(() => { + if (versionFormatRegex.test(version) && version !== latestVersion) { + const storageKey = "recce-update-toast-shown"; + const hasShownForThisVersion = sessionStorage.getItem(storageKey); + if (hasShownForThisVersion) { + return; + } + // Defer toast creation to next tick to avoid React's flushSync error + // This prevents "flushSync called from inside lifecycle method" when + // the toast library tries to immediately update DOM during render cycle + setTimeout(() => { + toaster.create({ + id: "recce-update-available", // Fixed ID prevents duplicates + title: "Update available", + description: ( + + A new version of Recce (v{latestVersion}) is available. +
+ Please run pip install --upgrade recce to update + Recce. +
+ + Click here to view the detail of latest release + +
+ ), + duration: 60 * 1000, + // TODO Fix this at a later update + // containerStyle: { + // background: "rgba(20, 20, 20, 0.6)", // Semi-transparent black + // color: "white", // Ensure text is visible + // backdropFilter: "blur(10px)", // Frosted glass effect + // borderRadius: "8px", + // }, + closable: true, + }); + sessionStorage.setItem(storageKey, "true"); + }, 0); + } + }, [version, latestVersion, versionFormatRegex]); + + if (!versionFormatRegex.test(version)) { + // If the version is not in the format of x.y.z, don't apply + return ( + + {version} + + ); + } + + // Link to the release page on GitHub if the version is in the format of x.y.z + return ( + + + {version} + + + ); +} diff --git a/js/app/(mainComponents)/TopBar.tsx b/js/app/(mainComponents)/TopBar.tsx new file mode 100644 index 000000000..382dff5bc --- /dev/null +++ b/js/app/(mainComponents)/TopBar.tsx @@ -0,0 +1,212 @@ +import { + Badge, + Box, + Flex, + Heading, + HStack, + Icon, + Image, + Link, + LinkProps, + Spacer, + Text, +} from "@chakra-ui/react"; +import RecceVersionBadge from "app/(mainComponents)/RecceVersionBadge"; +import React, { useState } from "react"; +import { IconType } from "react-icons"; +import { FaGithub, FaQuestionCircle, FaSlack } from "react-icons/fa"; +import { VscGitPullRequest } from "react-icons/vsc"; +import AuthModal from "@/components/AuthModal/AuthModal"; +import AvatarDropdown from "@/components/app/AvatarDropdown"; +import { IdleTimeoutBadge } from "@/components/timeout/IdleTimeoutBadge"; +import { useLineageGraphContext } from "@/lib/hooks/LineageGraphContext"; +import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; + +interface LinkIconProps extends LinkProps { + icon: IconType; + href: string; +} + +function LinkIcon({ icon, href, ...prob }: LinkIconProps) { + return ( + + + + ); +} + +export default function TopBar() { + const { reviewMode, isDemoSite, envInfo, cloudMode } = + useLineageGraphContext(); + const { featureToggles, authed } = useRecceInstanceContext(); + const { url: prURL, id: prID } = envInfo?.pullRequest ?? {}; + const demoPrId = prURL ? prURL.split("/").pop() : null; + const brandLink = + cloudMode || authed + ? "https://cloud.datarecce.io/" + : "https://reccehq.com/"; + const [showModal, setShowModal] = useState(false); + + return ( + + + + recce-logo-white + + RECCE + + + + + {(featureToggles.mode ?? reviewMode) && ( + + {featureToggles.mode ?? "review mode"} + + )} + {cloudMode && prID && ( + + + cloud mode + + + + {`#${String(prID)}`} + + + + + )} + {isDemoSite && prURL && demoPrId && ( + + + demo mode + + + + {`#${demoPrId}`} + + + + + )} + + + {(isDemoSite || featureToggles.mode === "read only") && ( + <> + + + + + )} + {!isDemoSite && featureToggles.mode !== "read only" && ( + <> + + {authed || cloudMode ? ( + + + + ) : ( + <> + { + setShowModal(true); + }} + > + Connect to Cloud + + {showModal && ( + + )} + + )} + + )} + + ); +} diff --git a/js/app/@lineage/default.tsx b/js/app/@lineage/default.tsx new file mode 100644 index 000000000..3510be35b --- /dev/null +++ b/js/app/@lineage/default.tsx @@ -0,0 +1,20 @@ +/** + * @lineage Parallel Route - Default + * + * This file is rendered when navigating to routes that don't have + * a matching @lineage segment. It still renders LineagePage to + * keep it mounted (though hidden via CSS in MainLayout). + * + * This is crucial for preserving React state across navigation. + * + * @see https://nextjs.org/docs/app/api-reference/file-conventions/parallel-routes#defaultjs + */ +"use client"; + +import { LineagePage } from "@/components/lineage/LineagePage"; + +export default function LineageSlotDefault() { + // Still render LineagePage to keep it mounted + // MainLayout controls visibility via CSS display property + return ; +} diff --git a/js/app/@lineage/page.tsx b/js/app/@lineage/page.tsx new file mode 100644 index 000000000..4addb1213 --- /dev/null +++ b/js/app/@lineage/page.tsx @@ -0,0 +1,14 @@ +/** + * @lineage Parallel Route - Page + * + * This parallel route renders the LineagePage component. + * It is always mounted in the layout to preserve React state + * (React Flow graph state, zoom level, selected nodes, etc.) + */ +"use client"; + +import { LineagePage } from "@/components/lineage/LineagePage"; + +export default function LineageSlotPage() { + return ; +} diff --git a/js/app/MainLayout.tsx b/js/app/MainLayout.tsx new file mode 100644 index 000000000..66ee7b292 --- /dev/null +++ b/js/app/MainLayout.tsx @@ -0,0 +1,117 @@ +/** + * MainLayout - Handles parallel route visibility and main app structure + * + * This component manages the visibility of the @lineage parallel route + * while keeping it mounted to preserve React state (React Flow graph state, etc.) + */ + +"use client"; + +import { Box, Flex } from "@chakra-ui/react"; +import { usePathname } from "next/navigation"; +import React, { ReactNode, useEffect } from "react"; +import AuthModal from "@/components/AuthModal/AuthModal"; +import { RunList } from "@/components/run/RunList"; +import { RunResultPane } from "@/components/run/RunResultPane"; +import { HSplit, VSplit } from "@/components/split/Split"; +import { trackInit } from "@/lib/api/track"; +import { useLineageGraphContext } from "@/lib/hooks/LineageGraphContext"; +import { useRecceActionContext } from "@/lib/hooks/RecceActionContext"; +import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; +import { useRecceServerFlag } from "@/lib/hooks/useRecceServerFlag"; +import "@fontsource/montserrat/800.css"; +import NavBar from "app/(mainComponents)/NavBar"; +import TopBar from "app/(mainComponents)/TopBar"; + +interface MainLayoutProps { + children: ReactNode; + /** Parallel route slot from @lineage */ + lineage: ReactNode; +} + +export function MainLayout({ children, lineage }: MainLayoutProps) { + const pathname = usePathname(); + const { isDemoSite, isLoading, isCodespace } = useLineageGraphContext(); + const { featureToggles } = useRecceInstanceContext(); + + // Determine if lineage route is active + const isLineageRoute = pathname === "/lineage" || pathname === "/"; + + useEffect(() => { + trackInit(); + }, []); + + return ( + + + +
+ {children} +
+ {!isLoading && + !isDemoSite && + !isCodespace && + featureToggles.mode === null && } +
+ ); +} + +// Main content area with parallel route handling +interface MainProps { + children: ReactNode; + lineage: ReactNode; + isLineageRoute: boolean; +} + +function Main({ children, lineage, isLineageRoute }: MainProps) { + const { isRunResultOpen, isHistoryOpen, closeRunResult } = + useRecceActionContext(); + const { data: flag } = useRecceServerFlag(); + const pathname = usePathname(); + + const _isRunResultOpen = isRunResultOpen && !pathname.startsWith("/checks"); + const _isHistoryOpen = isHistoryOpen && !pathname.startsWith("/checks"); + + return ( + + {_isHistoryOpen && } + + + {/* + * Lineage parallel route - always mounted but visibility controlled + * This replaces the old RouteAlwaysMount pattern + */} + + {lineage} + + + {/* Other route content */} + {!isLineageRoute && children} + + {_isRunResultOpen ? ( + + ) : ( + + )} + + + ); +} diff --git a/js/app/Providers.tsx b/js/app/Providers.tsx index 48c4e0162..7c7326ded 100644 --- a/js/app/Providers.tsx +++ b/js/app/Providers.tsx @@ -1,26 +1,53 @@ +/** + * Application Providers + * + * Wraps the application with necessary context providers. + * Updated to remove Wouter Router - now using Next.js App Router. + */ + "use client"; import { QueryClientProvider } from "@tanstack/react-query"; import { ReactNode } from "react"; -import { Router } from "wouter"; +import { HashbangRedirect } from "@/components/routing/HashbangRedirect"; import { Provider } from "@/components/ui/provider"; import { Toaster } from "@/components/ui/toaster"; import { reactQueryClient } from "@/lib/api/axiosClient"; import { IdleTimeoutProvider } from "@/lib/hooks/IdleTimeoutContext"; import RecceContextProvider from "@/lib/hooks/RecceContextProvider"; -import { useHashLocation } from "@/lib/hooks/useHashLocation"; +import { MainLayout } from "./MainLayout"; + +interface ProvidersProps { + children: ReactNode; + /** Parallel route slot for lineage page */ + lineage: ReactNode; +} -export default function Providers({ children }: { children: ReactNode }) { +export default function Providers({ children, lineage }: ProvidersProps) { return ( - + {/* Handle legacy hashbang URL redirects */} + + Loading... + + } + > - {children} + {children} - + diff --git a/js/src/components/check/CheckPage.tsx b/js/app/checks/page.tsx similarity index 82% rename from js/src/components/check/CheckPage.tsx rename to js/app/checks/page.tsx index 43a5fc9f7..ba9dc4a36 100644 --- a/js/src/components/check/CheckPage.tsx +++ b/js/app/checks/page.tsx @@ -1,20 +1,22 @@ -import "react-data-grid/lib/styles.css"; +"use client"; + import { Box, Center, Flex, Separator, VStack } from "@chakra-ui/react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import React, { useCallback, useEffect, useState } from "react"; -import { Route, Switch, useLocation, useRoute } from "wouter"; +import { useParams } from "next/navigation"; +import React, { ReactNode, useCallback, useEffect, useState } from "react"; +import { StateImporter } from "@/components/app/StateImporter"; +import { CheckDetail } from "@/components/check/CheckDetail"; +import { CheckEmptyState } from "@/components/check/CheckEmptyState"; +import { CheckList } from "@/components/check/CheckList"; +import { HSplit } from "@/components/split/Split"; import { cacheKeys } from "@/lib/api/cacheKeys"; import { listChecks, reorderChecks } from "@/lib/api/checks"; import { useRecceCheckContext } from "@/lib/hooks/RecceCheckContext"; -import { StateImporter } from "../app/StateImporter"; -import { HSplit } from "../split/Split"; -import { CheckDetail } from "./CheckDetail"; -import { CheckEmptyState } from "./CheckEmptyState"; -import { CheckList } from "./CheckList"; - -export const CheckPage = () => { - const [, setLocation] = useLocation(); - const [, params] = useRoute("/checks/:checkId"); +import { useAppLocation } from "@/lib/hooks/useAppRouter"; + +export default function CheckPage(): ReactNode { + const [, setLocation] = useAppLocation(); + const params = useParams<{ checkId?: string }>(); const { latestSelectedCheckId, setLatestSelectedCheckId } = useRecceCheckContext(); const queryClient = useQueryClient(); @@ -165,20 +167,14 @@ export const CheckPage = () => { - - - {(params) => { - return ( - - ); - }} - - + {selectedItem && ( + + )} ); -}; +} diff --git a/js/app/error.tsx b/js/app/error.tsx new file mode 100644 index 000000000..8da887b2d --- /dev/null +++ b/js/app/error.tsx @@ -0,0 +1,81 @@ +/** + * Next.js App Router Error Boundary + * + * This file handles runtime errors within route segments. + * It automatically wraps the route segment in a React Error Boundary. + * + * @see https://nextjs.org/docs/app/building-your-application/routing/error-handling + */ + +"use client"; + +import { Box, Button, Center, Flex, Heading } from "@chakra-ui/react"; +import * as Sentry from "@sentry/nextjs"; +import { useEffect } from "react"; + +interface ErrorProps { + error: Error & { digest?: string }; + reset: () => void; +} + +// biome-ignore lint/suspicious/noShadowRestrictedNames: https://nextjs.org/docs/app/api-reference/file-conventions/error +export default function Error({ error, reset }: ErrorProps) { + useEffect(() => { + // Log the error to Sentry + Sentry.captureException(error, { + tags: { + errorBoundary: "app", + digest: error.digest, + }, + extra: { + componentStack: error.stack, + }, + }); + + // Also log to console for development + console.error("App Error Boundary caught error:", error); + }, [error]); + + return ( +
+ + + You have encountered an error + + + + {error.message || String(error)} + + + {error.digest && ( + + Error ID: {error.digest} + + )} + + + +
+ ); +} diff --git a/js/app/global-error.tsx b/js/app/global-error.tsx new file mode 100644 index 000000000..8acf8fc01 --- /dev/null +++ b/js/app/global-error.tsx @@ -0,0 +1,114 @@ +/** + * Next.js Global Error Boundary + * + * This file handles errors in the root layout.tsx. + * It must include its own and tags since it replaces + * the root layout when active. + * + * @see https://nextjs.org/docs/app/building-your-application/routing/error-handling#handling-errors-in-root-layouts + */ + +"use client"; + +import * as Sentry from "@sentry/nextjs"; +import { useEffect } from "react"; + +interface GlobalErrorProps { + error: Error & { digest?: string }; + reset: () => void; +} + +export default function GlobalError({ error, reset }: GlobalErrorProps) { + useEffect(() => { + // Log the error to Sentry with high priority + Sentry.captureException(error, { + level: "fatal", + tags: { + errorBoundary: "global", + digest: error.digest, + }, + extra: { + componentStack: error.stack, + }, + }); + + console.error("Global Error Boundary caught error:", error); + }, [error]); + + return ( + + +
+
+

+ Something went wrong +

+ +

+ {error.message || "An unexpected error occurred"} +

+ + {error.digest && ( +

+ Error ID: {error.digest} +

+ )} + + +
+
+ + + ); +} diff --git a/js/app/layout.tsx b/js/app/layout.tsx index 71d1b67e5..8c7155af1 100644 --- a/js/app/layout.tsx +++ b/js/app/layout.tsx @@ -10,14 +10,23 @@ export const metadata: Metadata = { description: "Recce: Data validation toolkit for comprehensive PR review", }; -export default function RootLayout({ children }: { children: ReactNode }) { +interface RootLayoutProps { + children: ReactNode; + /** Parallel route slot from @lineage folder */ + lineage: ReactNode; +} + +export default function RootLayout({ + children, + lineage, +}: RootLayoutProps): ReactNode { return ( {GTM_ID != null && GTM_ID.trim().length > 0 && ( )} - {children} + {children} ); diff --git a/js/app/page.tsx b/js/app/page.tsx index d4c4726eb..03d748f40 100644 --- a/js/app/page.tsx +++ b/js/app/page.tsx @@ -1,577 +1,12 @@ -"use client"; +/** + * Root Page + * + * Redirects to /lineage by default. + * The redirect is handled server-side for faster navigation. + */ -import { - Badge, - Box, - Code, - Flex, - Heading, - HStack, - Icon, - Image, - Link, - LinkProps, - Progress, - Spacer, - Tabs, - Text, -} from "@chakra-ui/react"; -import { useQuery } from "@tanstack/react-query"; -import React, { ReactNode, useEffect, useMemo, useState } from "react"; -import { IconType } from "react-icons"; -import { FaGithub, FaQuestionCircle, FaSlack } from "react-icons/fa"; -import { Redirect, Route, Switch, useLocation, useRoute } from "wouter"; -import { StateExporter } from "@/components/app/StateExporter"; -import { CheckPage } from "@/components/check/CheckPage"; -import { ErrorBoundary } from "@/components/errorboundary/ErrorBoundary"; -import { QueryPage } from "@/components/query/QueryPage"; -import { RunPage } from "@/components/run/RunPage"; -import { useVersionNumber } from "@/lib/api/version"; -import { useLineageGraphContext } from "@/lib/hooks/LineageGraphContext"; -import "@fontsource/montserrat/800.css"; -import { VscGitPullRequest } from "react-icons/vsc"; -import AuthModal from "@/components/AuthModal/AuthModal"; -import AvatarDropdown from "@/components/app/AvatarDropdown"; -import { EnvInfo } from "@/components/app/EnvInfo"; -import { Filename } from "@/components/app/Filename"; -import { TopLevelShare } from "@/components/app/StateSharing"; -import { StateSynchronizer } from "@/components/app/StateSynchronizer"; -import { LineagePage } from "@/components/lineage/LineagePage"; -import { RunList } from "@/components/run/RunList"; -import { RunResultPane } from "@/components/run/RunResultPane"; -import { HSplit, VSplit } from "@/components/split/Split"; -import { IdleTimeoutBadge } from "@/components/timeout/IdleTimeoutBadge"; -import { toaster } from "@/components/ui/toaster"; -import { cacheKeys } from "@/lib/api/cacheKeys"; -import { Check, listChecks } from "@/lib/api/checks"; -import { trackInit, trackNavigation } from "@/lib/api/track"; -import { useRecceActionContext } from "@/lib/hooks/RecceActionContext"; -import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; -import { useRecceServerFlag } from "@/lib/hooks/useRecceServerFlag"; - -const RouteAlwaysMount = ({ - children, - path, -}: { - children: ReactNode; - path: string; -}) => { - const [match] = useRoute(path); - return ( - - {children} - - ); -}; - -interface LinkIconProps extends LinkProps { - icon: IconType; - href: string; -} - -function LinkIcon({ icon, href, ...prob }: LinkIconProps) { - return ( - - - - ); -} - -function RecceVersionBadge() { - const { version, latestVersion } = useVersionNumber(); - const versionFormatRegex = useMemo( - () => new RegExp("^\\d+\\.\\d+\\.\\d+$"), - [], - ); - - useEffect(() => { - if (versionFormatRegex.test(version) && version !== latestVersion) { - const storageKey = "recce-update-toast-shown"; - const hasShownForThisVersion = sessionStorage.getItem(storageKey); - if (hasShownForThisVersion) { - return; - } - // Defer toast creation to next tick to avoid React's flushSync error - // This prevents "flushSync called from inside lifecycle method" when - // the toast library tries to immediately update DOM during render cycle - setTimeout(() => { - toaster.create({ - id: "recce-update-available", // Fixed ID prevents duplicates - title: "Update available", - description: ( - - A new version of Recce (v{latestVersion}) is available. -
- Please run pip install --upgrade recce to update - Recce. -
- - Click here to view the detail of latest release - -
- ), - duration: 60 * 1000, - // TODO Fix this at a later update - // containerStyle: { - // background: "rgba(20, 20, 20, 0.6)", // Semi-transparent black - // color: "white", // Ensure text is visible - // backdropFilter: "blur(10px)", // Frosted glass effect - // borderRadius: "8px", - // }, - closable: true, - }); - sessionStorage.setItem(storageKey, "true"); - }, 0); - } - }, [version, latestVersion, versionFormatRegex]); - - if (!versionFormatRegex.test(version)) { - // If the version is not in the format of x.y.z, don't apply - return ( - - {version} - - ); - } - - // Link to the release page on GitHub if the version is in the format of x.y.z - return ( - - - {version} - - - ); -} - -function TopBar() { - const { reviewMode, isDemoSite, envInfo, cloudMode } = - useLineageGraphContext(); - const { featureToggles, authed } = useRecceInstanceContext(); - const { url: prURL, id: prID } = envInfo?.pullRequest ?? {}; - const demoPrId = prURL ? prURL.split("/").pop() : null; - const brandLink = - cloudMode || authed - ? "https://cloud.datarecce.io/" - : "https://reccehq.com/"; - const [showModal, setShowModal] = useState(false); - - return ( - - - - recce-logo-white - - RECCE - - - - - {(featureToggles.mode ?? reviewMode) && ( - - {featureToggles.mode ?? "review mode"} - - )} - {cloudMode && prID && ( - - - cloud mode - - - - {`#${String(prID)}`} - - - - - )} - {isDemoSite && prURL && demoPrId && ( - - - demo mode - - - - {`#${demoPrId}`} - - - - - )} - - - {(isDemoSite || featureToggles.mode === "read only") && ( - <> - - - - - )} - {!isDemoSite && featureToggles.mode !== "read only" && ( - <> - - {authed || cloudMode ? ( - - - - ) : ( - <> - { - setShowModal(true); - }} - > - Connect to Cloud - - {showModal && ( - - )} - - )} - - )} - - ); -} - -interface TabProps { - name: string; - href: string; - badge?: ReactNode; - disable?: boolean; -} - -interface TabBadgeProps { - queryKey: string[]; - fetchCallback: () => Promise; - selectCallback?: (data: T) => number; -} - -function TabBadge({ - queryKey, - fetchCallback, - selectCallback, -}: TabBadgeProps): ReactNode { - const { - data: count, - isLoading, - error, - } = useQuery({ - queryKey: queryKey, - queryFn: fetchCallback, - select: selectCallback, - }); - - if (isLoading || error || count === 0) { - return <>; - } - - return ( - - {count} - - ); -} - -function NavBar() { - const { isDemoSite, cloudMode, isLoading } = useLineageGraphContext(); - const { featureToggles } = useRecceInstanceContext(); - const [location, setLocation] = useLocation(); - const [valueLocation, setValueLocation] = useState("/lineage"); - const { data: flag, isLoading: isFlagLoading } = useRecceServerFlag(); - - const checklistBadge = ( - - queryKey={cacheKeys.checks()} - fetchCallback={listChecks} - selectCallback={(checks: Check[]) => { - return checks.filter((check) => !check.is_checked).length; - }} - /> - ); - - const tabs: TabProps[] = [ - { name: "Lineage", href: "/lineage" }, - { name: "Query", href: "/query" }, - { - name: "Checklist", - href: "/checks", - badge: checklistBadge, - disable: flag?.single_env_onboarding === true, - }, - ]; - - useEffect(() => { - setValueLocation(`/${location.split("/")[1]}`); - // Only run on page load - }, [location]); - - return ( - { - setValueLocation(e.value); - }} - > - - {/* Left section: Tabs */} - - {tabs.map(({ name, href, badge, disable }) => { - return ( - { - trackNavigation({ from: location, to: href }); - setLocation(href); - }} - disabled={!!isLoading || isFlagLoading || disable} - hidden={disable} - > - {name} - {badge} - - ); - })} - - - {/* Center section: Filename and TopLevelShare */} - - {!isLoading && !isDemoSite && } - {!isLoading && - !isDemoSite && - !flag?.single_env_onboarding && - !featureToggles.disableShare && } - - - {/* Right section: EnvInfo, StateSynchronizer, StateExporter */} - {!isLoading && ( - - - {cloudMode && } - - - )} - - - ); -} - -function Main() { - const { isRunResultOpen, isHistoryOpen, closeRunResult } = - useRecceActionContext(); - const { data: flag } = useRecceServerFlag(); - const [location] = useLocation(); - const _isRunResultOpen = isRunResultOpen && !location.startsWith("/checks"); - const _isHistoryOpen = isHistoryOpen && !location.startsWith("/checks"); - - return ( - - {_isHistoryOpen && } - - - - {/* Prevent the lineage page unmount and lose states */} - - - - - - - - - - - - {({ runId }) => { - return ; - }} - - - - - - - - - - - - - - - {_isRunResultOpen ? ( - - ) : ( - - )} - - - ); -} - -function MainContainer({ children }: { children: ReactNode }): ReactNode { - return ( - - {children} - - ); -} +import { redirect } from "next/navigation"; export default function Home() { - const { isDemoSite, isLoading, isCodespace } = useLineageGraphContext(); - const { featureToggles } = useRecceInstanceContext(); - - useEffect(() => { - trackInit(); - }, []); - - return ( - - - -
- {!isLoading && - !isDemoSite && - !isCodespace && - featureToggles.mode === null && } - - ); + redirect("/lineage"); } diff --git a/js/package.json b/js/package.json index e8efad8df..07552a6b7 100644 --- a/js/package.json +++ b/js/package.json @@ -32,6 +32,7 @@ "@jeromefitz/date-fns-tz": "3.0.0-canary.8", "@monaco-editor/react": "^4.7.0", "@next/third-parties": "16.0.3", + "@sentry/nextjs": "^10.27.0", "@sentry/react": "^10.25.0", "@tailwindcss/postcss": "^4.1.17", "@tanstack/react-query": "^5.90.10", @@ -45,6 +46,7 @@ "file-saver": "^2.0.5", "html-to-image": "^1.11.13", "html2canvas-pro": "^1.5.13", + "import-in-the-middle": "^2.0.0", "js-cookie": "^3.0.5", "lodash": "^4.17.21", "monaco-editor": "^0.54.0", @@ -59,6 +61,7 @@ "react-split": "^2.0.14", "react-syntax-highlighter": "^16.1.0", "remark-gfm": "^4.0.1", + "require-in-the-middle": "^8.0.1", "simplebar": "^6.3.3", "simplebar-react": "3.3.2", "usehooks-ts": "^3.1.1", @@ -81,6 +84,7 @@ "@types/react": "19.2.5", "@types/react-dom": "19.2.3", "@types/react-syntax-highlighter": "^15.5.13", + "baseline-browser-mapping": "^2.8.32", "globals": "^16.5.0", "husky": "^9.1.7", "jest": "^30.2.0", @@ -96,8 +100,8 @@ "brace-expansion@>=2.0.0 <=2.0.1": ">=2.0.2" }, "onlyBuiltDependencies": [ + "@sentry/cli", "@tailwindcss/oxide", - "sharp", "unrs-resolver" ] }, diff --git a/js/pnpm-lock.yaml b/js/pnpm-lock.yaml index fe040a66e..8dbeb5b28 100644 --- a/js/pnpm-lock.yaml +++ b/js/pnpm-lock.yaml @@ -14,7 +14,7 @@ importers: dependencies: '@amplitude/unified': specifier: 1.0.0-beta.9 - version: 1.0.0-beta.9(@amplitude/rrweb@2.0.0-alpha.33) + version: 1.0.0-beta.9(@amplitude/rrweb@2.0.0-alpha.33)(rollup@4.53.3) '@babel/helpers': specifier: ^7.28.4 version: 7.28.4 @@ -50,7 +50,10 @@ importers: version: 4.7.0(monaco-editor@0.54.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@next/third-parties': specifier: 16.0.3 - version: 16.0.3(next@16.0.3(@babel/core@7.28.5)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) + version: 16.0.3(next@16.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) + '@sentry/nextjs': + specifier: ^10.27.0 + version: 10.27.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(webpack@5.103.0) '@sentry/react': specifier: ^10.25.0 version: 10.25.0(react@19.2.0) @@ -90,6 +93,9 @@ importers: html2canvas-pro: specifier: ^1.5.13 version: 1.5.13 + import-in-the-middle: + specifier: ^2.0.0 + version: 2.0.0 js-cookie: specifier: ^3.0.5 version: 3.0.5 @@ -101,7 +107,7 @@ importers: version: 0.54.0 next: specifier: 16.0.3 - version: 16.0.3(@babel/core@7.28.5)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -132,6 +138,9 @@ importers: remark-gfm: specifier: ^4.0.1 version: 4.0.1 + require-in-the-middle: + specifier: ^8.0.1 + version: 8.0.1 simplebar: specifier: ^6.3.3 version: 6.3.3 @@ -193,6 +202,9 @@ importers: '@types/react-syntax-highlighter': specifier: ^15.5.13 version: 15.5.13 + baseline-browser-mapping: + specifier: ^2.8.32 + version: 2.8.32 globals: specifier: ^16.5.0 version: 16.5.0 @@ -322,6 +334,12 @@ packages: '@amplitude/unified@1.0.0-beta.9': resolution: {integrity: sha512-JS7Dq6GJ6amR0olsVu0ekypAUHpcect8pJNTKjWYtEwdUbfQP6giE41Bum8rLR85SOMBqbuMdDr3yO9oj2CKyw==} + '@apm-js-collab/code-transformer@0.8.2': + resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==} + + '@apm-js-collab/tracing-hooks@0.3.1': + resolution: {integrity: sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==} + '@ark-ui/react@5.27.1': resolution: {integrity: sha512-Rg5UPIXMtD0h2JLKS1meQ5qbx5TLLsDoiCpzhbcPCnFyH/c78nqm8ee1RHOjeCnxohNYStSwi49KLzpxttE+Rw==} peerDependencies: @@ -936,6 +954,9 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -1015,6 +1036,190 @@ packages: next: ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0-beta.0 react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + '@opentelemetry/api-logs@0.208.0': + resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.2.0': + resolution: {integrity: sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.2.0': + resolution: {integrity: sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/instrumentation-amqplib@0.55.0': + resolution: {integrity: sha512-5ULoU8p+tWcQw5PDYZn8rySptGSLZHNX/7srqo2TioPnAAcvTy6sQFQXsNPrAnyRRtYGMetXVyZUy5OaX1+IfA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-connect@0.52.0': + resolution: {integrity: sha512-GXPxfNB5szMbV3I9b7kNWSmQBoBzw7MT0ui6iU/p+NIzVx3a06Ri2cdQO7tG9EKb4aKSLmfX9Cw5cKxXqX6Ohg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-dataloader@0.26.0': + resolution: {integrity: sha512-P2BgnFfTOarZ5OKPmYfbXfDFjQ4P9WkQ1Jji7yH5/WwB6Wm/knynAoA1rxbjWcDlYupFkyT0M1j6XLzDzy0aCA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.57.0': + resolution: {integrity: sha512-HAdx/o58+8tSR5iW+ru4PHnEejyKrAy9fYFhlEI81o10nYxrGahnMAHWiSjhDC7UQSY3I4gjcPgSKQz4rm/asg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.28.0': + resolution: {integrity: sha512-FFvg8fq53RRXVBRHZViP+EMxMR03tqzEGpuq55lHNbVPyFklSVfQBN50syPhK5UYYwaStx0eyCtHtbRreusc5g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-generic-pool@0.52.0': + resolution: {integrity: sha512-ISkNcv5CM2IwvsMVL31Tl61/p2Zm2I2NAsYq5SSBgOsOndT0TjnptjufYVScCnD5ZLD1tpl4T3GEYULLYOdIdQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.56.0': + resolution: {integrity: sha512-IPvNk8AFoVzTAM0Z399t34VDmGDgwT6rIqCUug8P9oAGerl2/PEIYMPOl/rerPGu+q8gSWdmbFSjgg7PDVRd3Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.55.0': + resolution: {integrity: sha512-prqAkRf9e4eEpy4G3UcR32prKE8NLNlA90TdEU1UsghOTg0jUvs40Jz8LQWFEs5NbLbXHYGzB4CYVkCI8eWEVQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.208.0': + resolution: {integrity: sha512-rhmK46DRWEbQQB77RxmVXGyjs6783crXCnFjYQj+4tDH/Kpv9Rbg3h2kaNyp5Vz2emF1f9HOQQvZoHzwMWOFZQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.56.0': + resolution: {integrity: sha512-XSWeqsd3rKSsT3WBz/JKJDcZD4QYElZEa0xVdX8f9dh4h4QgXhKRLorVsVkK3uXFbC2sZKAS2Ds+YolGwD83Dg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.18.0': + resolution: {integrity: sha512-KCL/1HnZN5zkUMgPyOxfGjLjbXjpd4odDToy+7c+UsthIzVLFf99LnfIBE8YSSrYE4+uS7OwJMhvhg3tWjqMBg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-knex@0.53.0': + resolution: {integrity: sha512-xngn5cH2mVXFmiT1XfQ1aHqq1m4xb5wvU6j9lSgLlihJ1bXzsO543cpDwjrZm2nMrlpddBf55w8+bfS4qDh60g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.57.0': + resolution: {integrity: sha512-3JS8PU/D5E3q295mwloU2v7c7/m+DyCqdu62BIzWt+3u9utjxC9QS7v6WmUNuoDN3RM+Q+D1Gpj13ERo+m7CGg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + + '@opentelemetry/instrumentation-lru-memoizer@0.53.0': + resolution: {integrity: sha512-LDwWz5cPkWWr0HBIuZUjslyvijljTwmwiItpMTHujaULZCxcYE9eU44Qf/pbVC8TulT0IhZi+RoGvHKXvNhysw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.61.0': + resolution: {integrity: sha512-OV3i2DSoY5M/pmLk+68xr5RvkHU8DRB3DKMzYJdwDdcxeLs62tLbkmRyqJZsYf3Ht7j11rq35pHOWLuLzXL7pQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.55.0': + resolution: {integrity: sha512-5afj0HfF6aM6Nlqgu6/PPHFk8QBfIe3+zF9FGpX76jWPS0/dujoEYn82/XcLSaW5LPUDW8sni+YeK0vTBNri+w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.55.0': + resolution: {integrity: sha512-0cs8whQG55aIi20gnK8B7cco6OK6N+enNhW0p5284MvqJ5EPi+I1YlWsWXgzv/V2HFirEejkvKiI4Iw21OqDWg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.54.0': + resolution: {integrity: sha512-bqC1YhnwAeWmRzy1/Xf9cDqxNG2d/JDkaxnqF5N6iJKN1eVWI+vg7NfDkf52/Nggp3tl1jcC++ptC61BD6738A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.61.0': + resolution: {integrity: sha512-UeV7KeTnRSM7ECHa3YscoklhUtTQPs6V6qYpG283AB7xpnPGCUCUfECFT9jFg6/iZOQTt3FHkB1wGTJCNZEvPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis@0.57.0': + resolution: {integrity: sha512-bCxTHQFXzrU3eU1LZnOZQ3s5LURxQPDlU3/upBzlWY77qOI1GZuGofazj3jtzjctMJeBEJhNwIFEgRPBX1kp/Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-tedious@0.27.0': + resolution: {integrity: sha512-jRtyUJNZppPBjPae4ZjIQ2eqJbcRaRfJkr0lQLHFmOU/no5A6e9s1OHLd5XZyZoBJ/ymngZitanyRRA5cniseA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-undici@0.19.0': + resolution: {integrity: sha512-Pst/RhR61A2OoZQZkn6OLpdVpXp6qn3Y92wXa6umfJe9rV640r4bc6SWvw4pPN6DiQqPu2c8gnSSZPDtC6JlpQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation@0.208.0': + resolution: {integrity: sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/redis-common@0.38.2': + resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} + engines: {node: ^18.19.0 || >=20.6.0} + + '@opentelemetry/resources@2.2.0': + resolution: {integrity: sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.2.0': + resolution: {integrity: sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.38.0': + resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.41.2': + resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@pandacss/is-valid-prop@1.4.3': resolution: {integrity: sha512-9xHAFaRGoXikp0SKUyTHdO97mjIRuGFLDqQ+zphaVeNjTIsyac+fZjOS/2jJNuTS1eybU0/ny1FZ3BpS6SkEqw==} @@ -1026,6 +1231,20 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@prisma/instrumentation@6.19.0': + resolution: {integrity: sha512-QcuYy25pkXM8BJ37wVFBO7Zh34nyRV1GOb2n3lPkkbRYfl4hWl3PTcImP41P0KrzVXfa/45p6eVCos27x3exIg==} + peerDependencies: + '@opentelemetry/api': ^1.8 + + '@rollup/plugin-commonjs@28.0.1': + resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/plugin-replace@6.0.3': resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==} engines: {node: '>=14.0.0'} @@ -1044,36 +1263,278 @@ packages: rollup: optional: true + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + cpu: [x64] + os: [win32] + '@sentry-internal/browser-utils@10.25.0': resolution: {integrity: sha512-wzg1ITZxrRtQouHPCgpt3tl1GiNAWFVy2RYK2KstFEhpYBAOUn9BAdP7KU9UyHBFKqbAvV4oGtAT8H2/Y4+leA==} engines: {node: '>=18'} + '@sentry-internal/browser-utils@10.27.0': + resolution: {integrity: sha512-17tO6AXP+rmVQtLJ3ROQJF2UlFmvMWp7/8RDT5x9VM0w0tY31z8Twc0gw2KA7tcDxa5AaHDUbf9heOf+R6G6ow==} + engines: {node: '>=18'} + '@sentry-internal/feedback@10.25.0': resolution: {integrity: sha512-qlbT4tOd+WRyKpLdsbi26rkynGBoVabnY8/9rFnTxZ0WIUG5EFhJFqEeRLMyv+uk0uRFF3H0I9+u+qP/BKxIcQ==} engines: {node: '>=18'} + '@sentry-internal/feedback@10.27.0': + resolution: {integrity: sha512-UecsIDJcv7VBwycge/MDvgSRxzevDdcItE1i0KSwlPz00rVVxLY9kV28PJ4I2E7r6/cIaP9BkbWegCEcv09NuA==} + engines: {node: '>=18'} + '@sentry-internal/replay-canvas@10.25.0': resolution: {integrity: sha512-zuj5jVNswZ/aA1nPPbU+VIFkQG0695lbyIfS1Skq+5o2FdRIS3MGnBXw1abI9h4pft8GLQWcKiBxISM7UpSz6w==} engines: {node: '>=18'} + '@sentry-internal/replay-canvas@10.27.0': + resolution: {integrity: sha512-inhsRYSVBpu3BI1kZphXj6uB59baJpYdyHeIPCiTfdFNBE5tngNH0HS/aedZ1g9zICw290lwvpuyrWJqp4VBng==} + engines: {node: '>=18'} + '@sentry-internal/replay@10.25.0': resolution: {integrity: sha512-V/kKQn9T46HBTiP0bIThmpVr94K4vXwYM3/EHVpGSq4P9RynX06cgps8GLHq94+A0kX/DbK9igEMZmIuzS1q3A==} engines: {node: '>=18'} + '@sentry-internal/replay@10.27.0': + resolution: {integrity: sha512-tKSzHq1hNzB619Ssrqo25cqdQJ84R3xSSLsUWEnkGO/wcXJvpZy94gwdoS+KmH18BB1iRRRGtnMxZcUkiPSesw==} + engines: {node: '>=18'} + + '@sentry/babel-plugin-component-annotate@4.6.1': + resolution: {integrity: sha512-aSIk0vgBqv7PhX6/Eov+vlI4puCE0bRXzUG5HdCsHBpAfeMkI8Hva6kSOusnzKqs8bf04hU7s3Sf0XxGTj/1AA==} + engines: {node: '>= 14'} + '@sentry/browser@10.25.0': resolution: {integrity: sha512-UgSVT3RTM3vsK914TPuHVJQsjq5ooXVmjMtsWP3Ep+6f7N+1UVX4ZXsyyj5lDOcWdc79FgproD+MrEf9Cj6uBg==} engines: {node: '>=18'} + '@sentry/browser@10.27.0': + resolution: {integrity: sha512-G8q362DdKp9y1b5qkQEmhTFzyWTOVB0ps1rflok0N6bVA75IEmSDX1pqJsNuY3qy14VsVHYVwQBJQsNltQLS0g==} + engines: {node: '>=18'} + + '@sentry/bundler-plugin-core@4.6.1': + resolution: {integrity: sha512-WPeRbnMXm927m4Kr69NTArPfI+p5/34FHftdCRI3LFPMyhZDzz6J3wLy4hzaVUgmMf10eLzmq2HGEMvpQmdynA==} + engines: {node: '>= 14'} + + '@sentry/cli-darwin@2.58.2': + resolution: {integrity: sha512-MArsb3zLhA2/cbd4rTm09SmTpnEuZCoZOpuZYkrpDw1qzBVJmRFA1W1hGAQ9puzBIk/ubY3EUhhzuU3zN2uD6w==} + engines: {node: '>=10'} + os: [darwin] + + '@sentry/cli-linux-arm64@2.58.2': + resolution: {integrity: sha512-ay3OeObnbbPrt45cjeUyQjsx5ain1laj1tRszWj37NkKu55NZSp4QCg1gGBZ0gBGhckI9nInEsmKtix00alw2g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd, android] + + '@sentry/cli-linux-arm@2.58.2': + resolution: {integrity: sha512-HU9lTCzcHqCz/7Mt5n+cv+nFuJdc1hGD2h35Uo92GgxX3/IujNvOUfF+nMX9j6BXH6hUt73R5c0Ycq9+a3Parg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd, android] + + '@sentry/cli-linux-i686@2.58.2': + resolution: {integrity: sha512-CN9p0nfDFsAT1tTGBbzOUGkIllwS3hygOUyTK7LIm9z+UHw5uNgNVqdM/3Vg+02ymjkjISNB3/+mqEM5osGXdA==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd, android] + + '@sentry/cli-linux-x64@2.58.2': + resolution: {integrity: sha512-oX/LLfvWaJO50oBVOn4ZvG2SDWPq0MN8SV9eg5tt2nviq+Ryltfr7Rtoo+HfV+eyOlx1/ZXhq9Wm7OT3cQuz+A==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd, android] + + '@sentry/cli-win32-arm64@2.58.2': + resolution: {integrity: sha512-+cl3x2HPVMpoSVGVM1IDWlAEREZrrVQj4xBb0TRKII7g3hUxRsAIcsrr7+tSkie++0FuH4go/b5fGAv51OEF3w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@sentry/cli-win32-i686@2.58.2': + resolution: {integrity: sha512-omFVr0FhzJ8oTJSg1Kf+gjLgzpYklY0XPfLxZ5iiMiYUKwF5uo1RJRdkUOiEAv0IqpUKnmKcmVCLaDxsWclB7Q==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + + '@sentry/cli-win32-x64@2.58.2': + resolution: {integrity: sha512-2NAFs9UxVbRztQbgJSP5i8TB9eJQ7xraciwj/93djrSMHSEbJ0vC47TME0iifgvhlHMs5vqETOKJtfbbpQAQFA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@sentry/cli@2.58.2': + resolution: {integrity: sha512-U4u62V4vaTWF+o40Mih8aOpQKqKUbZQt9A3LorIJwaE3tO3XFLRI70eWtW2se1Qmy0RZ74zB14nYcFNFl2t4Rw==} + engines: {node: '>= 10'} + hasBin: true + '@sentry/core@10.25.0': resolution: {integrity: sha512-mGi4BYIPwZjWdOXHrPoXz1AW4/cQbFoiuW/m+OOATmtSoGTDnWYwP+qZU7VLlL+v8ZEzxfPi2C1NPfJtPj7QWA==} engines: {node: '>=18'} + '@sentry/core@10.27.0': + resolution: {integrity: sha512-Zc68kdH7tWTDtDbV1zWIbo3Jv0fHAU2NsF5aD2qamypKgfSIMSbWVxd22qZyDBkaX8gWIPm/0Sgx6aRXRBXrYQ==} + engines: {node: '>=18'} + + '@sentry/nextjs@10.27.0': + resolution: {integrity: sha512-O3b7y4JgVyj70ucW7lfyFLSXTCvztu7qOdFzFl2LwIstzFIZzt6v7ICOhP3FEEC7Lxn5teNb6xVBDtu8vYr20g==} + engines: {node: '>=18'} + peerDependencies: + next: ^13.2.0 || ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0 + + '@sentry/node-core@10.27.0': + resolution: {integrity: sha512-Dzo1I64Psb7AkpyKVUlR9KYbl4wcN84W4Wet3xjLmVKMgrCo2uAT70V4xIacmoMH5QLZAx0nGfRy9yRCd4nzBg==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/core': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/instrumentation': '>=0.57.1 <1' + '@opentelemetry/resources': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/semantic-conventions': ^1.37.0 + + '@sentry/node@10.27.0': + resolution: {integrity: sha512-1cQZ4+QqV9juW64Jku1SMSz+PoZV+J59lotz4oYFvCNYzex8hRAnDKvNiKW1IVg5mEEkz98mg1fvcUtiw7GTiQ==} + engines: {node: '>=18'} + + '@sentry/opentelemetry@10.27.0': + resolution: {integrity: sha512-z2vXoicuGiqlRlgL9HaYJgkin89ncMpNQy0Kje6RWyhpzLe8BRgUXlgjux7WrSrcbopDdC1OttSpZsJ/Wjk7fg==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/core': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/semantic-conventions': ^1.37.0 + '@sentry/react@10.25.0': resolution: {integrity: sha512-LBQHgyPAFzuy99mEJF8ZF2AOxxJiGAmtu10eQhglhFgfJsU7JJVsee0h+vTSmvHMDtFrIwhZi3i1X5snZ/kzoA==} engines: {node: '>=18'} peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x + '@sentry/react@10.27.0': + resolution: {integrity: sha512-xoIRBlO1IhLX/O9aQgVYW1F3Qhw8TdkOiZjh6mrPsnCpBLufsQ4aS1nDQi9miZuWeslW0s2zNy0ACBpICZR/sw==} + engines: {node: '>=18'} + peerDependencies: + react: ^16.14.0 || 17.x || 18.x || 19.x + + '@sentry/vercel-edge@10.27.0': + resolution: {integrity: sha512-uBfpOnzSNSd2ITMTMeX5bV9Jlci9iMyI+iOPuW8c3oc+0dITTN0OpKLyNd6nfm50bM5h/1qFVQrph+oFTrtuGQ==} + engines: {node: '>=18'} + + '@sentry/webpack-plugin@4.6.1': + resolution: {integrity: sha512-CJgT/t2pQWsPsMx9VJ86goU/orCQhL2HhDj5ZYBol6fPPoEGeTqKOPCnv/xsbCAfGSp1uHpyRLTA/Gx96u7VVA==} + engines: {node: '>= 14'} + peerDependencies: + webpack: '>=4.40.0' + '@sinclair/typebox@0.34.41': resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} @@ -1235,6 +1696,9 @@ packages: '@types/common-tags@1.8.4': resolution: {integrity: sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg==} + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/css-font-loading-module@0.0.7': resolution: {integrity: sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q==} @@ -1262,6 +1726,12 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -1292,6 +1762,9 @@ packages: '@types/jsdom@21.1.7': resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/lodash.mergewith@4.6.9': resolution: {integrity: sha512-fgkoCAOF47K7sxrQ7Mlud2TH023itugZs2bUg8h/KzT+BnZNrR2jAOmaokbLunHNnobXVWOezAeNn/lZqwxkcw==} @@ -1304,12 +1777,21 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/mysql@2.15.27': + resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} + '@types/node@24.10.1': resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/pg-pool@2.0.6': + resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + + '@types/pg@8.15.6': + resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==} + '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} @@ -1332,6 +1814,9 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} @@ -1448,9 +1933,60 @@ packages: cpu: [x64] os: [win32] + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@xstate/fsm@1.6.5': resolution: {integrity: sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw==} + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@xyflow/react@12.9.3': resolution: {integrity: sha512-PSWoJ8vHiEqSIkLIkge+0eiHWiw4C6dyFDA03VKWJkqbU4A13VlDIVwKqf/Znuysn2GQw/zA61zpHE4rGgax7Q==} peerDependencies: @@ -1680,10 +2216,46 @@ packages: '@zag-js/utils@1.27.0': resolution: {integrity: sha512-kKaqcQDogeUa3Q9+z1YICBAbBVTPC1RdFdDJ8HJ+RxpbwhsfRmgcYFdtiQu4+nruG82BgoIUtdt9KzQAbM4rHQ==} + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1771,10 +2343,14 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.24: - resolution: {integrity: sha512-uUhTRDPXamakPyghwrUcjaGvvBqGrWvBHReoiULMIpOJVM9IYzQh83Xk2Onx5HlGI2o10NNCzcs9TG/S3TkwrQ==} + baseline-browser-mapping@2.8.32: + resolution: {integrity: sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==} hasBin: true + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + brace-expansion@4.0.1: resolution: {integrity: sha512-YClrbvTCXGe70pU2JiEiPLYXO9gQkyxYeKpJIQHVS/gOs6EWMQP2RYBwjFLNT322Ji8TOC3IMPfsYCedNpzKfA==} engines: {node: '>= 18'} @@ -1847,10 +2423,21 @@ packages: resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} engines: {pnpm: '>=8'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + ci-info@4.3.1: resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + cjs-module-lexer@2.1.0: resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} @@ -1885,10 +2472,16 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -2022,6 +2615,10 @@ packages: dompurify@3.1.7: resolution: {integrity: sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2061,6 +2658,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -2085,17 +2685,37 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - estree-util-is-identifier-name@3.0.0: + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2111,15 +2731,30 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -2137,6 +2772,10 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -2158,6 +2797,9 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2193,10 +2835,21 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + glob@11.0.3: resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} engines: {node: 20 || >=22} @@ -2275,6 +2928,10 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -2302,6 +2959,9 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-in-the-middle@2.0.0: + resolution: {integrity: sha512-yNZhyQYqXpkT0AKq3F3KLasUSK4fHvebNH5hOsKQw2dhGSALvQ4U0BqUc5suziKvydO5u5hgN2hy1RJaho8U5A==} + import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -2334,6 +2994,10 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -2341,6 +3005,10 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -2349,6 +3017,10 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -2363,6 +3035,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -2520,6 +3195,10 @@ packages: resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + jest-worker@30.2.0: resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2569,6 +3248,9 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -2651,10 +3333,18 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} @@ -2697,6 +3387,10 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -2889,6 +3583,9 @@ packages: mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + monaco-editor@0.54.0: resolution: {integrity: sha512-hx45SEUoLatgWxHKCmlLJH81xBo0uXP4sRkESUpmDQevfi+e7K1VuiSprK6UpQ8u4zOcKNiH0pMvHvlMWA/4cw==} @@ -2908,6 +3605,9 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: @@ -2935,6 +3635,15 @@ packages: sass: optional: true + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -2975,6 +3684,10 @@ packages: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -3026,6 +3739,17 @@ packages: perfect-freehand@1.2.2: resolution: {integrity: sha512-eh31l019WICQ03pkF3FSzHxB8n07ItqIQ++G5UV8JX0zVOXzgTGCqnRR0jJ2h9U8/2uW4W4mtGJELt9kEV0CFQ==} + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3053,6 +3777,22 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -3065,6 +3805,10 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -3090,6 +3834,9 @@ packages: raf-schd@4.0.3: resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + react-chartjs-2@5.3.1: resolution: {integrity: sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A==} peerDependencies: @@ -3166,6 +3913,10 @@ packages: resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -3196,6 +3947,14 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -3213,17 +3972,29 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + rimraf@6.1.0: resolution: {integrity: sha512-DxdlA1bdNzkZK7JiNWH+BAx1x4tEJWoTofIopFo6qWUU94jYrFZ0ubY05TqH3nWPJ1nKa1JWVFDINZ3fnrle/A==} engines: {node: 20 || >=22} hasBin: true + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3234,6 +4005,10 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3243,6 +4018,9 @@ packages: engines: {node: '>=10'} hasBin: true + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + sharp@0.34.4: resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -3284,6 +4062,9 @@ packages: source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -3305,6 +4086,10 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} @@ -3395,6 +4180,27 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.44.1: + resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} + engines: {node: '>=10'} + hasBin: true + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -3426,6 +4232,9 @@ packages: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@5.1.1: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} @@ -3447,6 +4256,10 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -3476,6 +4289,9 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unplugin@1.0.1: + resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} + unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} @@ -3511,6 +4327,10 @@ packages: utrie@1.0.2: resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} @@ -3528,13 +4348,37 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + web-vitals@5.1.0: resolution: {integrity: sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + + webpack@5.103.0: + resolution: {integrity: sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -3547,6 +4391,9 @@ packages: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3591,6 +4438,10 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3718,12 +4569,12 @@ snapshots: '@amplitude/analytics-core': 2.31.1 tslib: 2.8.1 - '@amplitude/plugin-session-replay-browser@1.23.1(@amplitude/rrweb@2.0.0-alpha.33)': + '@amplitude/plugin-session-replay-browser@1.23.1(@amplitude/rrweb@2.0.0-alpha.33)(rollup@4.53.3)': dependencies: '@amplitude/analytics-client-common': 2.4.11 '@amplitude/analytics-core': 2.31.1 '@amplitude/analytics-types': 2.11.0 - '@amplitude/session-replay-browser': 1.29.3(@amplitude/rrweb@2.0.0-alpha.33) + '@amplitude/session-replay-browser': 1.29.3(@amplitude/rrweb@2.0.0-alpha.33)(rollup@4.53.3) idb-keyval: 6.2.2 tslib: 2.8.1 transitivePeerDependencies: @@ -3778,7 +4629,7 @@ snapshots: base64-arraybuffer: 1.0.2 mitt: 3.0.1 - '@amplitude/session-replay-browser@1.29.3(@amplitude/rrweb@2.0.0-alpha.33)': + '@amplitude/session-replay-browser@1.29.3(@amplitude/rrweb@2.0.0-alpha.33)(rollup@4.53.3)': dependencies: '@amplitude/analytics-client-common': 2.4.11 '@amplitude/analytics-core': 2.31.1 @@ -3789,7 +4640,7 @@ snapshots: '@amplitude/rrweb-types': 2.0.0-alpha.32 '@amplitude/rrweb-utils': 2.0.0-alpha.32 '@amplitude/targeting': 0.2.0 - '@rollup/plugin-replace': 6.0.3 + '@rollup/plugin-replace': 6.0.3(rollup@4.53.3) idb: 8.0.0 tslib: 2.8.1 transitivePeerDependencies: @@ -3807,16 +4658,26 @@ snapshots: '@amplitude/ua-parser-js@0.7.33': {} - '@amplitude/unified@1.0.0-beta.9(@amplitude/rrweb@2.0.0-alpha.33)': + '@amplitude/unified@1.0.0-beta.9(@amplitude/rrweb@2.0.0-alpha.33)(rollup@4.53.3)': dependencies: '@amplitude/analytics-browser': 2.30.0 '@amplitude/engagement-browser': 1.0.5 '@amplitude/plugin-experiment-browser': 1.0.0-beta.0 - '@amplitude/plugin-session-replay-browser': 1.23.1(@amplitude/rrweb@2.0.0-alpha.33) + '@amplitude/plugin-session-replay-browser': 1.23.1(@amplitude/rrweb@2.0.0-alpha.33)(rollup@4.53.3) transitivePeerDependencies: - '@amplitude/rrweb' - rollup + '@apm-js-collab/code-transformer@0.8.2': {} + + '@apm-js-collab/tracing-hooks@0.3.1': + dependencies: + '@apm-js-collab/code-transformer': 0.8.2 + debug: 4.4.3 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + '@ark-ui/react@5.27.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@internationalized/date': 3.10.0 @@ -4610,6 +5471,11 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.31': @@ -4663,12 +5529,243 @@ snapshots: '@next/swc-win32-x64-msvc@16.0.3': optional: true - '@next/third-parties@16.0.3(next@16.0.3(@babel/core@7.28.5)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)': + '@next/third-parties@16.0.3(next@16.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)': dependencies: - next: 16.0.3(@babel/core@7.28.5)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 third-party-capital: 1.0.20 + '@opentelemetry/api-logs@0.208.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.38.0 + + '@opentelemetry/instrumentation-amqplib@0.55.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-connect@0.52.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@types/connect': 3.4.38 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dataloader@0.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-express@0.57.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fs@0.28.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-generic-pool@0.52.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-graphql@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-hapi@0.55.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.208.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + forwarded-parse: 2.1.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-ioredis@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-kafkajs@0.18.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-knex@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-koa@0.57.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-lru-memoizer@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongodb@0.61.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongoose@0.55.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql2@0.55.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql@0.54.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@types/mysql': 2.15.27 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pg@0.61.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) + '@types/pg': 8.15.6 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis@0.57.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.2 + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-tedious@0.27.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-undici@0.19.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.208.0 + import-in-the-middle: 2.0.0 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/redis-common@0.38.2': {} + + '@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + + '@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + + '@opentelemetry/semantic-conventions@1.38.0': {} + + '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@pandacss/is-valid-prop@1.4.3': {} '@pkgjs/parseargs@0.11.0': @@ -4676,44 +5773,312 @@ snapshots: '@pkgr/core@0.2.9': {} - '@rollup/plugin-replace@6.0.3': + '@prisma/instrumentation@6.19.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-commonjs@28.0.1(rollup@4.53.3)': dependencies: - '@rollup/pluginutils': 5.3.0 + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.3) + is-reference: 1.2.1 magic-string: 0.30.21 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.53.3 - '@rollup/pluginutils@5.3.0': + '@rollup/plugin-replace@6.0.3(rollup@4.53.3)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.53.3 + + '@rollup/pluginutils@5.3.0(rollup@4.53.3)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 + optionalDependencies: + rollup: 4.53.3 + + '@rollup/rollup-android-arm-eabi@4.53.3': + optional: true + + '@rollup/rollup-android-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-x64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.53.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.3': + optional: true + + '@sentry-internal/browser-utils@10.25.0': + dependencies: + '@sentry/core': 10.25.0 + + '@sentry-internal/browser-utils@10.27.0': + dependencies: + '@sentry/core': 10.27.0 + + '@sentry-internal/feedback@10.25.0': + dependencies: + '@sentry/core': 10.25.0 + + '@sentry-internal/feedback@10.27.0': + dependencies: + '@sentry/core': 10.27.0 + + '@sentry-internal/replay-canvas@10.25.0': + dependencies: + '@sentry-internal/replay': 10.25.0 + '@sentry/core': 10.25.0 + + '@sentry-internal/replay-canvas@10.27.0': + dependencies: + '@sentry-internal/replay': 10.27.0 + '@sentry/core': 10.27.0 + + '@sentry-internal/replay@10.25.0': + dependencies: + '@sentry-internal/browser-utils': 10.25.0 + '@sentry/core': 10.25.0 + + '@sentry-internal/replay@10.27.0': + dependencies: + '@sentry-internal/browser-utils': 10.27.0 + '@sentry/core': 10.27.0 + + '@sentry/babel-plugin-component-annotate@4.6.1': {} + + '@sentry/browser@10.25.0': + dependencies: + '@sentry-internal/browser-utils': 10.25.0 + '@sentry-internal/feedback': 10.25.0 + '@sentry-internal/replay': 10.25.0 + '@sentry-internal/replay-canvas': 10.25.0 + '@sentry/core': 10.25.0 + + '@sentry/browser@10.27.0': + dependencies: + '@sentry-internal/browser-utils': 10.27.0 + '@sentry-internal/feedback': 10.27.0 + '@sentry-internal/replay': 10.27.0 + '@sentry-internal/replay-canvas': 10.27.0 + '@sentry/core': 10.27.0 + + '@sentry/bundler-plugin-core@4.6.1': + dependencies: + '@babel/core': 7.28.5 + '@sentry/babel-plugin-component-annotate': 4.6.1 + '@sentry/cli': 2.58.2 + dotenv: 16.6.1 + find-up: 5.0.0 + glob: 10.5.0 + magic-string: 0.30.8 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/cli-darwin@2.58.2': + optional: true + + '@sentry/cli-linux-arm64@2.58.2': + optional: true + + '@sentry/cli-linux-arm@2.58.2': + optional: true + + '@sentry/cli-linux-i686@2.58.2': + optional: true + + '@sentry/cli-linux-x64@2.58.2': + optional: true + + '@sentry/cli-win32-arm64@2.58.2': + optional: true + + '@sentry/cli-win32-i686@2.58.2': + optional: true + + '@sentry/cli-win32-x64@2.58.2': + optional: true - '@sentry-internal/browser-utils@10.25.0': + '@sentry/cli@2.58.2': dependencies: - '@sentry/core': 10.25.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + optionalDependencies: + '@sentry/cli-darwin': 2.58.2 + '@sentry/cli-linux-arm': 2.58.2 + '@sentry/cli-linux-arm64': 2.58.2 + '@sentry/cli-linux-i686': 2.58.2 + '@sentry/cli-linux-x64': 2.58.2 + '@sentry/cli-win32-arm64': 2.58.2 + '@sentry/cli-win32-i686': 2.58.2 + '@sentry/cli-win32-x64': 2.58.2 + transitivePeerDependencies: + - encoding + - supports-color - '@sentry-internal/feedback@10.25.0': - dependencies: - '@sentry/core': 10.25.0 + '@sentry/core@10.25.0': {} - '@sentry-internal/replay-canvas@10.25.0': - dependencies: - '@sentry-internal/replay': 10.25.0 - '@sentry/core': 10.25.0 + '@sentry/core@10.27.0': {} + + '@sentry/nextjs@10.27.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(next@16.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(webpack@5.103.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.38.0 + '@rollup/plugin-commonjs': 28.0.1(rollup@4.53.3) + '@sentry-internal/browser-utils': 10.27.0 + '@sentry/bundler-plugin-core': 4.6.1 + '@sentry/core': 10.27.0 + '@sentry/node': 10.27.0 + '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + '@sentry/react': 10.27.0(react@19.2.0) + '@sentry/vercel-edge': 10.27.0 + '@sentry/webpack-plugin': 4.6.1(webpack@5.103.0) + next: 16.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + resolve: 1.22.8 + rollup: 4.53.3 + stacktrace-parser: 0.1.11 + transitivePeerDependencies: + - '@opentelemetry/context-async-hooks' + - '@opentelemetry/core' + - '@opentelemetry/sdk-trace-base' + - encoding + - react + - supports-color + - webpack + + '@sentry/node-core@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': + dependencies: + '@apm-js-collab/tracing-hooks': 0.3.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@sentry/core': 10.27.0 + '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + import-in-the-middle: 2.0.0 + transitivePeerDependencies: + - supports-color - '@sentry-internal/replay@10.25.0': - dependencies: - '@sentry-internal/browser-utils': 10.25.0 - '@sentry/core': 10.25.0 + '@sentry/node@10.27.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.18.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.61.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.54.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.61.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.19.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@prisma/instrumentation': 6.19.0(@opentelemetry/api@1.9.0) + '@sentry/core': 10.27.0 + '@sentry/node-core': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + import-in-the-middle: 2.0.0 + minimatch: 9.0.5 + transitivePeerDependencies: + - supports-color - '@sentry/browser@10.25.0': + '@sentry/opentelemetry@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': dependencies: - '@sentry-internal/browser-utils': 10.25.0 - '@sentry-internal/feedback': 10.25.0 - '@sentry-internal/replay': 10.25.0 - '@sentry-internal/replay-canvas': 10.25.0 - '@sentry/core': 10.25.0 - - '@sentry/core@10.25.0': {} + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@sentry/core': 10.27.0 '@sentry/react@10.25.0(react@19.2.0)': dependencies: @@ -4722,6 +6087,29 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.2.0 + '@sentry/react@10.27.0(react@19.2.0)': + dependencies: + '@sentry/browser': 10.27.0 + '@sentry/core': 10.27.0 + hoist-non-react-statics: 3.3.2 + react: 19.2.0 + + '@sentry/vercel-edge@10.27.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@sentry/core': 10.27.0 + + '@sentry/webpack-plugin@4.6.1(webpack@5.103.0)': + dependencies: + '@sentry/bundler-plugin-core': 4.6.1 + unplugin: 1.0.1 + uuid: 9.0.1 + webpack: 5.103.0 + transitivePeerDependencies: + - encoding + - supports-color + '@sinclair/typebox@0.34.41': {} '@sinonjs/commons@3.0.1': @@ -4880,6 +6268,10 @@ snapshots: '@types/common-tags@1.8.4': {} + '@types/connect@3.4.38': + dependencies: + '@types/node': 24.10.1 + '@types/css-font-loading-module@0.0.7': {} '@types/d3-color@3.1.3': {} @@ -4909,6 +6301,16 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -4944,6 +6346,8 @@ snapshots: '@types/tough-cookie': 4.0.5 parse5: 7.3.0 + '@types/json-schema@7.0.15': {} + '@types/lodash.mergewith@4.6.9': dependencies: '@types/lodash': 4.17.20 @@ -4956,12 +6360,26 @@ snapshots: '@types/ms@2.1.0': {} + '@types/mysql@2.15.27': + dependencies: + '@types/node': 24.10.1 + '@types/node@24.10.1': dependencies: undici-types: 7.16.0 '@types/parse-json@4.0.2': {} + '@types/pg-pool@2.0.6': + dependencies: + '@types/pg': 8.15.6 + + '@types/pg@8.15.6': + dependencies: + '@types/node': 24.10.1 + pg-protocol: 1.10.3 + pg-types: 2.2.0 + '@types/prismjs@1.26.5': {} '@types/react-dom@19.2.3(@types/react@19.2.5)': @@ -4982,6 +6400,10 @@ snapshots: '@types/stack-utils@2.0.3': {} + '@types/tedious@4.0.14': + dependencies: + '@types/node': 24.10.1 + '@types/tough-cookie@4.0.5': {} '@types/unist@2.0.11': {} @@ -5057,8 +6479,88 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + '@xstate/fsm@1.6.5': {} + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + '@xyflow/react@12.9.3(@types/react@19.2.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@xyflow/system': 0.0.73 @@ -5605,8 +7107,40 @@ snapshots: '@zag-js/utils@1.27.0': {} + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-import-phases@1.0.4(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + agent-base@7.1.4: {} + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -5714,7 +7248,9 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.24: {} + baseline-browser-mapping@2.8.32: {} + + binary-extensions@2.3.0: {} brace-expansion@4.0.1: dependencies: @@ -5726,7 +7262,7 @@ snapshots: browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.8.24 + baseline-browser-mapping: 2.8.32 caniuse-lite: 1.0.30001753 electron-to-chromium: 1.5.244 node-releases: 2.0.27 @@ -5783,8 +7319,24 @@ snapshots: dependencies: '@kurkle/color': 0.3.4 + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + ci-info@4.3.1: {} + cjs-module-lexer@1.4.3: {} + cjs-module-lexer@2.1.0: {} classcat@5.0.5: {} @@ -5813,8 +7365,12 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@2.20.3: {} + common-tags@1.8.2: {} + commondir@1.0.1: {} + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -5932,6 +7488,8 @@ snapshots: dompurify@3.1.7: {} + dotenv@16.6.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5963,6 +7521,8 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -5982,12 +7542,27 @@ snapshots: escape-string-regexp@5.0.0: {} + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + esprima@4.0.1: {} + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + estree-util-is-identifier-name@3.0.0: {} estree-walker@2.0.2: {} + events@3.3.0: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -6013,8 +7588,12 @@ snapshots: extend@3.0.2: {} + fast-deep-equal@3.1.3: {} + fast-json-stable-stringify@2.1.0: {} + fast-uri@3.1.0: {} + fault@1.0.4: dependencies: format: 0.2.2 @@ -6023,6 +7602,10 @@ snapshots: dependencies: bser: 2.1.1 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fflate@0.4.8: {} file-saver@2.0.5: {} @@ -6038,6 +7621,11 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + follow-redirects@1.15.11: {} foreground-child@3.3.1: @@ -6055,6 +7643,8 @@ snapshots: format@0.2.2: {} + forwarded-parse@2.1.2: {} + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -6088,6 +7678,12 @@ snapshots: get-stream@6.0.1: {} + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -6097,6 +7693,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@11.0.3: dependencies: foreground-child: 3.3.1 @@ -6199,6 +7804,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -6223,6 +7835,13 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@2.0.0: + dependencies: + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -6250,16 +7869,26 @@ snapshots: is-arrayish@0.2.1: {} + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-core-module@2.16.1: dependencies: hasown: 2.0.2 is-decimal@2.0.1: {} + is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} is-generator-fn@2.1.0: {} + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} is-number@7.0.0: {} @@ -6268,6 +7897,10 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + is-stream@2.0.1: {} isexe@2.0.0: {} @@ -6615,6 +8248,12 @@ snapshots: jest-util: 30.2.0 string-length: 4.0.2 + jest-worker@27.5.1: + dependencies: + '@types/node': 24.10.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jest-worker@30.2.0: dependencies: '@types/node': 24.10.1 @@ -6680,6 +8319,8 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@1.0.0: {} + json5@2.2.3: {} leven@3.1.0: {} @@ -6735,10 +8376,16 @@ snapshots: lines-and-columns@1.2.4: {} + loader-runner@4.3.1: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + lodash-es@4.17.21: {} lodash.clonedeep@4.5.0: {} @@ -6774,6 +8421,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.8: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@4.0.0: dependencies: semver: 7.7.3 @@ -7167,6 +8818,8 @@ snapshots: mitt@3.0.1: {} + module-details-from-path@1.0.4: {} + monaco-editor@0.54.0: dependencies: dompurify: 3.1.7 @@ -7180,12 +8833,14 @@ snapshots: natural-compare@1.4.0: {} + neo-async@2.6.2: {} + next-themes@0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - next@16.0.3(@babel/core@7.28.5)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@16.0.3(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@next/env': 16.0.3 '@swc/helpers': 0.5.15 @@ -7203,11 +8858,16 @@ snapshots: '@next/swc-linux-x64-musl': 16.0.3 '@next/swc-win32-arm64-msvc': 16.0.3 '@next/swc-win32-x64-msvc': 16.0.3 + '@opentelemetry/api': 1.9.0 sharp: 0.34.4 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-int64@0.4.0: {} node-releases@2.0.27: {} @@ -7242,6 +8902,10 @@ snapshots: dependencies: p-limit: 2.3.0 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-try@2.2.0: {} package-json-from-dist@1.0.1: {} @@ -7293,6 +8957,18 @@ snapshots: perfect-freehand@1.2.2: {} + pg-int8@1.0.1: {} + + pg-protocol@1.10.3: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -7317,6 +8993,16 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postgres-array@2.0.0: {} + + postgres-bytea@1.0.0: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -7331,6 +9017,8 @@ snapshots: prismjs@1.30.0: {} + progress@2.0.3: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -7353,6 +9041,10 @@ snapshots: raf-schd@4.0.3: {} + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + react-chartjs-2@5.3.1(chart.js@4.5.1)(react@19.2.0): dependencies: chart.js: 4.5.1 @@ -7449,6 +9141,10 @@ snapshots: react@19.2.0: {} + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -7501,6 +9197,15 @@ snapshots: require-directory@2.1.1: {} + require-from-string@2.0.2: {} + + require-in-the-middle@8.0.1: + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -7515,17 +9220,53 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.8: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + rimraf@6.1.0: dependencies: glob: 11.0.3 package-json-from-dist: 1.0.1 + rollup@4.53.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 + fsevents: 2.3.3 + rrweb-cssom@0.8.0: {} rxjs@7.8.2: dependencies: tslib: 2.8.1 + safe-buffer@5.2.1: {} + safer-buffer@2.1.2: {} saxes@6.0.0: @@ -7534,10 +9275,21 @@ snapshots: scheduler@0.27.0: {} + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + semver@6.3.1: {} semver@7.7.3: {} + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + sharp@0.34.4: dependencies: '@img/colour': 1.0.0 @@ -7601,6 +9353,11 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map@0.5.7: {} source-map@0.6.1: {} @@ -7615,6 +9372,10 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + state-local@1.0.7: {} string-length@4.0.2: @@ -7695,6 +9456,22 @@ snapshots: tapable@2.3.0: {} + terser-webpack-plugin@5.3.14(webpack@5.103.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.1 + webpack: 5.103.0 + + terser@5.44.1: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -7725,6 +9502,8 @@ snapshots: dependencies: tldts: 6.1.86 + tr46@0.0.3: {} + tr46@5.1.1: dependencies: punycode: 2.3.1 @@ -7739,6 +9518,8 @@ snapshots: type-fest@0.21.3: {} + type-fest@0.7.1: {} + typescript@5.9.3: {} undici-types@7.16.0: {} @@ -7778,6 +9559,13 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 + unplugin@1.0.1: + dependencies: + acorn: 8.15.0 + chokidar: 3.6.0 + webpack-sources: 3.3.3 + webpack-virtual-modules: 0.5.0 + unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.4 @@ -7829,6 +9617,8 @@ snapshots: dependencies: base64-arraybuffer: 1.0.2 + uuid@9.0.1: {} + v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -7853,10 +9643,53 @@ snapshots: dependencies: makeerror: 1.0.12 + watchpack@2.4.4: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + web-vitals@5.1.0: {} + webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: {} + webpack-sources@3.3.3: {} + + webpack-virtual-modules@0.5.0: {} + + webpack@5.103.0: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.27.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(webpack@5.103.0) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -7868,6 +9701,11 @@ snapshots: tr46: 5.1.1 webidl-conversions: 7.0.0 + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -7904,6 +9742,8 @@ snapshots: xmlchars@2.2.0: {} + xtend@4.0.2: {} + y18n@5.0.8: {} yallist@3.1.1: {} diff --git a/js/src/components/app/StateImporter.tsx b/js/src/components/app/StateImporter.tsx index 1869720ab..5c18f2f62 100644 --- a/js/src/components/app/StateImporter.tsx +++ b/js/src/components/app/StateImporter.tsx @@ -12,7 +12,6 @@ import { import { useQueryClient } from "@tanstack/react-query"; import React, { ChangeEvent, useCallback, useRef, useState } from "react"; import { PiInfo } from "react-icons/pi"; -import { useLocation } from "wouter"; import { toaster } from "@/components/ui/toaster"; import { Tooltip } from "@/components/ui/tooltip"; import { cacheKeys } from "@/lib/api/cacheKeys"; @@ -23,6 +22,7 @@ import { useRunsAggregated, } from "@/lib/hooks/LineageGraphContext"; import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; +import { useAppLocation } from "@/lib/hooks/useAppRouter"; import { IconImport } from "../icons"; export function StateImporter({ checksOnly = true }: { checksOnly?: boolean }) { @@ -32,7 +32,7 @@ export function StateImporter({ checksOnly = true }: { checksOnly?: boolean }) { const cancelRef = useRef(null); const [selectedFile, setSelectedFile] = useState(null); const { open, onOpen, onClose } = useDisclosure(); - const [location, setLocation] = useLocation(); + const [location, setLocation] = useAppLocation(); const [, refetchRunsAggregated] = useRunsAggregated(); const handleImport = useCallback(async () => { diff --git a/js/src/components/app/StateSynchronizer.tsx b/js/src/components/app/StateSynchronizer.tsx index 4945e1fe8..0617d4f0a 100644 --- a/js/src/components/app/StateSynchronizer.tsx +++ b/js/src/components/app/StateSynchronizer.tsx @@ -14,11 +14,11 @@ import { import { useQueryClient } from "@tanstack/react-query"; import React, { useCallback, useState } from "react"; import { PiInfo } from "react-icons/pi"; -import { useLocation } from "wouter"; import { toaster } from "@/components/ui/toaster"; import { Tooltip } from "@/components/ui/tooltip"; import { cacheKeys } from "@/lib/api/cacheKeys"; import { isStateSyncing, SyncStateInput, syncState } from "@/lib/api/state"; +import { useAppLocation } from "@/lib/hooks/useAppRouter"; import { useRecceInstanceInfo } from "@/lib/hooks/useRecceInstanceInfo"; import { IconSync } from "../icons"; @@ -41,7 +41,7 @@ export function StateSpinner() { export function StateSynchronizer() { const [isSyncing, setSyncing] = useState(false); const queryClient = useQueryClient(); - const [location, setLocation] = useLocation(); + const [location, setLocation] = useAppLocation(); const { open, onOpen, onClose } = useDisclosure(); const [syncOption, setSyncOption] = useState< "overwrite" | "revert" | "merge" | "" diff --git a/js/src/components/check/CheckDetail.tsx b/js/src/components/check/CheckDetail.tsx index f2d91476f..cfb8aa774 100644 --- a/js/src/components/check/CheckDetail.tsx +++ b/js/src/components/check/CheckDetail.tsx @@ -1,3 +1,5 @@ +"use client"; + import { Box, Button, @@ -31,9 +33,9 @@ import { IoMdCodeWorking } from "react-icons/io"; import { IoBookmarksOutline } from "react-icons/io5"; import { PiCheckCircle, PiCopy, PiRepeat, PiTrashFill } from "react-icons/pi"; import { VscCircleLarge, VscKebabVertical } from "react-icons/vsc"; -import { useLocation } from "wouter"; import SetupConnectionPopover from "@/components/app/SetupConnectionPopover"; import { CheckTimeline } from "@/components/check/timeline"; +import { isDisabledByNoResult } from "@/components/check/utils"; import { Tooltip } from "@/components/ui/tooltip"; import { QueryDiffParams, @@ -55,6 +57,7 @@ import { useLineageGraphContext } from "@/lib/hooks/LineageGraphContext"; import { useRecceCheckContext } from "@/lib/hooks/RecceCheckContext"; import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; import { useCopyToClipboardButton } from "@/lib/hooks/ScreenShot"; +import { useAppLocation } from "@/lib/hooks/useAppRouter"; import { useCheckToast } from "@/lib/hooks/useCheckToast"; import { useClipBoardToast } from "@/lib/hooks/useClipBoardToast"; import { useRun } from "@/lib/hooks/useRun"; @@ -65,7 +68,6 @@ import { findByRunType, RefTypes, RegistryEntry, - RunType, ViewOptionTypes, } from "../run/registry"; import { VSplit } from "../split/Split"; @@ -79,16 +81,6 @@ import { } from "./PresetCheckTemplateView"; import { SchemaDiffView } from "./SchemaDiffView"; -export const isDisabledByNoResult = ( - type: RunType, - run: Run | undefined, -): boolean => { - if (type === "schema_diff" || type === "lineage_diff") { - return false; - } - return !run?.result || !!run.error; -}; - interface CheckDetailProps { checkId: string; refreshCheckList?: () => void; @@ -96,15 +88,15 @@ interface CheckDetailProps { type TabValueList = "result" | "query"; -export const CheckDetail = ({ +export function CheckDetail({ checkId, refreshCheckList, -}: CheckDetailProps) => { +}: CheckDetailProps): ReactNode { const { featureToggles, sessionId } = useRecceInstanceContext(); const { setLatestSelectedCheckId } = useRecceCheckContext(); const { cloudMode } = useLineageGraphContext(); const queryClient = useQueryClient(); - const [, setLocation] = useLocation(); + const [, setLocation] = useAppLocation(); const { successToast, failToast } = useClipBoardToast(); const { markedAsApprovedToast } = useCheckToast(); const [submittedRunId, setSubmittedRunId] = useState(); @@ -632,7 +624,7 @@ export const CheckDetail = ({ ); -}; +} function Overlay(): ReactNode { return ; diff --git a/js/src/components/check/CheckEmptyState.tsx b/js/src/components/check/CheckEmptyState.tsx index b92ef4218..d98e1411b 100644 --- a/js/src/components/check/CheckEmptyState.tsx +++ b/js/src/components/check/CheckEmptyState.tsx @@ -10,14 +10,14 @@ import { import { useMutation, useQueryClient } from "@tanstack/react-query"; import React from "react"; import { TbChecklist, TbPlus } from "react-icons/tb"; -import { useLocation } from "wouter"; import { cacheKeys } from "@/lib/api/cacheKeys"; import { Check } from "@/lib/api/checks"; import { createSchemaDiffCheck } from "@/lib/api/schemacheck"; +import { useAppLocation } from "@/lib/hooks/useAppRouter"; export const CheckEmptyState = () => { const queryClient = useQueryClient(); - const [, setLocation] = useLocation(); + const [, setLocation] = useAppLocation(); const { mutate: createSchemaCheck, isPending } = useMutation({ mutationFn: () => createSchemaDiffCheck({ select: "state:modified" }), diff --git a/js/src/components/check/CheckList.tsx b/js/src/components/check/CheckList.tsx index 06193d5f0..2bdc559d1 100644 --- a/js/src/components/check/CheckList.tsx +++ b/js/src/components/check/CheckList.tsx @@ -21,6 +21,7 @@ import { import { useMutation, useQueryClient } from "@tanstack/react-query"; import React, { useState } from "react"; import { IconType } from "react-icons"; +import { isDisabledByNoResult } from "@/components/check/utils"; import { Tooltip } from "@/components/ui/tooltip"; import { cacheKeys } from "@/lib/api/cacheKeys"; import { Check, updateCheck } from "@/lib/api/checks"; @@ -28,7 +29,6 @@ import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; import { useCheckToast } from "@/lib/hooks/useCheckToast"; import { useRun } from "@/lib/hooks/useRun"; import { findByRunType } from "../run/registry"; -import { isDisabledByNoResult } from "./CheckDetail"; const ChecklistItem = ({ check, diff --git a/js/src/components/check/utils.ts b/js/src/components/check/utils.ts new file mode 100644 index 000000000..046b60bb1 --- /dev/null +++ b/js/src/components/check/utils.ts @@ -0,0 +1,12 @@ +import { RunType } from "@/components/run/registry"; +import { Run } from "@/lib/api/types"; + +export const isDisabledByNoResult = ( + type: RunType, + run: Run | undefined, +): boolean => { + if (type === "schema_diff" || type === "lineage_diff") { + return false; + } + return !run?.result || !!run.error; +}; diff --git a/js/src/components/lineage/LineageView.tsx b/js/src/components/lineage/LineageView.tsx index c1768b6d2..ff229bab3 100644 --- a/js/src/components/lineage/LineageView.tsx +++ b/js/src/components/lineage/LineageView.tsx @@ -51,7 +51,6 @@ import "@xyflow/react/dist/style.css"; import { useMutation } from "@tanstack/react-query"; import { AxiosError } from "axios"; import { FiCopy } from "react-icons/fi"; -import { useLocation } from "wouter"; import { toaster } from "@/components/ui/toaster"; import { Check } from "@/lib/api/checks"; import { CllInput, ColumnLineageData, getCll } from "@/lib/api/cll"; @@ -76,6 +75,7 @@ import { IGNORE_SCREENSHOT_CLASS, useCopyToClipboard, } from "@/lib/hooks/ScreenShot"; +import { useAppLocation } from "@/lib/hooks/useAppRouter"; import { useClipBoardToast } from "@/lib/hooks/useClipBoardToast"; import { useRun } from "@/lib/hooks/useRun"; import { HSplit } from "../split/Split"; @@ -184,7 +184,7 @@ const useResizeObserver = ( }; const useNavToCheck = () => { - const [, setLocation] = useLocation(); + const [, setLocation] = useAppLocation(); return useCallback( (check: Check) => { if (check.check_id) { diff --git a/js/src/components/lineage/LineageViewContextMenu.tsx b/js/src/components/lineage/LineageViewContextMenu.tsx index 843ed1fcc..137224b73 100644 --- a/js/src/components/lineage/LineageViewContextMenu.tsx +++ b/js/src/components/lineage/LineageViewContextMenu.tsx @@ -2,7 +2,6 @@ import { Icon, Menu, Portal, useDisclosure } from "@chakra-ui/react"; import { ReactNode, useState } from "react"; import { BiArrowFromBottom, BiArrowToBottom } from "react-icons/bi"; import { FaRegDotCircle } from "react-icons/fa"; -import { useLocation } from "wouter"; import SetupConnectionPopover from "@/components/app/SetupConnectionPopover"; import { SubmitRunTrackProps } from "@/lib/api/runs"; import { formatSelectColumns } from "@/lib/formatSelect"; @@ -10,6 +9,7 @@ import { useLineageGraphContext } from "@/lib/hooks/LineageGraphContext"; import { useRecceActionContext } from "@/lib/hooks/RecceActionContext"; import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; import { useRecceQueryContext } from "@/lib/hooks/RecceQueryContext"; +import { useAppLocation } from "@/lib/hooks/useAppRouter"; import useModelColumns from "@/lib/hooks/useModelColumns"; import { useRecceServerFlag } from "@/lib/hooks/useRecceServerFlag"; import { supportsHistogramDiff } from "../histogram/HistogramDiffForm"; @@ -144,7 +144,7 @@ export const ModelNodeContextMenu = ({ (node?.data as LineageGraphNode | undefined)?.data.name, ); const { setSqlQuery, setPrimaryKeys } = useRecceQueryContext(); - const [, setLocation] = useLocation(); + const [, setLocation] = useAppLocation(); if (!node?.data) { return <>; diff --git a/js/src/components/lineage/NodeView.tsx b/js/src/components/lineage/NodeView.tsx index 7c4879e69..d2ab27882 100644 --- a/js/src/components/lineage/NodeView.tsx +++ b/js/src/components/lineage/NodeView.tsx @@ -15,7 +15,6 @@ import { } from "@chakra-ui/react"; import { useCallback } from "react"; import { PiCaretDown } from "react-icons/pi"; -import { useLocation } from "wouter"; import SetupConnectionPopover from "@/components/app/SetupConnectionPopover"; import { Tooltip } from "@/components/ui/tooltip"; import { DisableTooltipMessages } from "@/constants/tooltipMessage"; @@ -26,6 +25,7 @@ import { useLineageGraphContext } from "@/lib/hooks/LineageGraphContext"; import { useRecceActionContext } from "@/lib/hooks/RecceActionContext"; import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; import { useRecceQueryContext } from "@/lib/hooks/RecceQueryContext"; +import { useAppLocation } from "@/lib/hooks/useAppRouter"; import useModelColumns from "@/lib/hooks/useModelColumns"; import { LearnHowLink, @@ -198,7 +198,7 @@ function SingleEnvironmentMenuButton({ refetchRowCount, disableReason, }: SingleEnvironmentMenuButtonProps) { - const [, setLocation] = useLocation(); + const [, setLocation] = useAppLocation(); const { setSqlQuery } = useRecceQueryContext(); const { runAction } = useRecceActionContext(); const { envInfo } = useLineageGraphContext(); @@ -296,7 +296,7 @@ function ExploreChangeMenuButton({ onSandboxOpen, refetchRowCountDiff, }: ExploreChangeMenuButtonProps) { - const [, setLocation] = useLocation(); + const [, setLocation] = useAppLocation(); const { runAction } = useRecceActionContext(); const { setSqlQuery, setPrimaryKeys } = useRecceQueryContext(); const { envInfo, isActionAvailable } = useLineageGraphContext(); diff --git a/js/src/components/routing/HashbangRedirect.tsx b/js/src/components/routing/HashbangRedirect.tsx new file mode 100644 index 000000000..a03e463fd --- /dev/null +++ b/js/src/components/routing/HashbangRedirect.tsx @@ -0,0 +1,102 @@ +/** + * HashbangRedirect - Client-side redirect for legacy hashbang URLs + * + * This component detects URLs with #! (hashbang) fragments and redirects + * them to the standard Next.js routing paths. + * + * Example: /#!/lineage -> /lineage + * + * This is necessary because hash fragments are not sent to the server, + * so server-side proxy/middleware cannot handle them. + */ + +"use client"; + +import { useRouter } from "next/navigation"; +import { useEffect, useState } from "react"; + +interface HashbangRedirectProps { + /** Content to show while checking for redirect */ + fallback?: React.ReactNode; + /** Children to render after redirect check completes */ + children: React.ReactNode; +} + +/** + * Parses a hashbang URL and extracts the path + * @param hash - The window.location.hash value + * @returns The path without the hashbang prefix, or null if not a hashbang URL + */ +function parseHashbangPath(hash: string): string | null { + // Match #!/ followed by the path + const hashbangMatch = hash.match(/^#!(.*)$/); + if (hashbangMatch) { + const path = hashbangMatch[1]; + // Ensure path starts with / + return path.startsWith("/") ? path : `/${path}`; + } + return null; +} + +export function HashbangRedirect({ + fallback, + children, +}: HashbangRedirectProps): React.ReactNode { + const router = useRouter(); + const [isChecking, setIsChecking] = useState(true); + + useEffect(() => { + // Only run on client side + if (typeof window === "undefined") { + setIsChecking(false); + return; + } + + const hash = window.location.hash; + const hashbangPath = parseHashbangPath(hash); + + if (hashbangPath) { + // Redirect to the new path without hashbang + // Use replace to avoid adding to browser history + router.replace(hashbangPath); + } else { + setIsChecking(false); + } + }, [router]); + + // Show fallback while checking/redirecting + if (isChecking) { + return fallback ?? null; + } + + return children; +} + +/** + * Hook to detect if current URL has a hashbang + * Useful for conditional logic without the redirect behavior + */ +export function useHashbangDetection(): { + isHashbang: boolean; + hashbangPath: string | null; +} { + const [state, setState] = useState<{ + isHashbang: boolean; + hashbangPath: string | null; + }>({ + isHashbang: false, + hashbangPath: null, + }); + + useEffect(() => { + if (typeof window !== "undefined") { + const path = parseHashbangPath(window.location.hash); + setState({ + isHashbang: path !== null, + hashbangPath: path, + }); + } + }, []); + + return state; +} diff --git a/js/src/components/run/RunList.tsx b/js/src/components/run/RunList.tsx index 58445909a..d8b1388aa 100644 --- a/js/src/components/run/RunList.tsx +++ b/js/src/components/run/RunList.tsx @@ -15,7 +15,6 @@ import React, { ReactNode, useCallback } from "react"; import { IconType } from "react-icons"; import { FaCheckCircle, FaRegCheckCircle } from "react-icons/fa"; import SimpleBar from "simplebar-react"; -import { useLocation } from "wouter"; import { cacheKeys } from "@/lib/api/cacheKeys"; import { createCheckByRun } from "@/lib/api/checks"; import { listRuns, waitRun } from "@/lib/api/runs"; @@ -27,6 +26,7 @@ import { PiX } from "react-icons/pi"; import { Tooltip } from "@/components/ui/tooltip"; import { trackHistoryAction } from "@/lib/api/track"; import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; +import { useAppLocation } from "@/lib/hooks/useAppRouter"; import { formatRunDate, RunStatusAndDate } from "./RunStatusAndDate"; const RunListItem = ({ @@ -220,7 +220,7 @@ function DateDividedRunHistoryItem({ run, previousDate, }: DateDividedRunHistoryItemProps): ReactNode { - const [, setLocation] = useLocation(); + const [, setLocation] = useAppLocation(); const queryClient = useQueryClient(); const { showRunId, runId } = useRecceActionContext(); diff --git a/js/src/components/run/RunResultPane.tsx b/js/src/components/run/RunResultPane.tsx index 22ae2c46d..92b980447 100644 --- a/js/src/components/run/RunResultPane.tsx +++ b/js/src/components/run/RunResultPane.tsx @@ -15,7 +15,6 @@ import { useQueryClient } from "@tanstack/react-query"; import { ReactNode, Ref, useCallback, useState } from "react"; import { PiCaretDown, PiCheck, PiCopy, PiRepeat } from "react-icons/pi"; import { TbCloudUpload } from "react-icons/tb"; -import { useLocation } from "wouter"; import YAML from "yaml"; import AuthModal from "@/components/AuthModal/AuthModal"; import { cacheKeys } from "@/lib/api/cacheKeys"; @@ -32,6 +31,7 @@ import { useRecceActionContext } from "@/lib/hooks/RecceActionContext"; import { useRecceInstanceContext } from "@/lib/hooks/RecceInstanceContext"; import { useRecceShareStateContext } from "@/lib/hooks/RecceShareStateContext"; import { useCopyToClipboardButton } from "@/lib/hooks/ScreenShot"; +import { useAppLocation } from "@/lib/hooks/useAppRouter"; import { useRun } from "@/lib/hooks/useRun"; import { LearnHowLink, @@ -368,7 +368,7 @@ function AddToCheckButton({ const { featureToggles } = useRecceInstanceContext(); const { error, run } = useRun(runId); const queryClient = useQueryClient(); - const [, setLocation] = useLocation(); + const [, setLocation] = useAppLocation(); const checkId = run?.check_id; diff --git a/js/src/lib/hooks/RecceActionContext.tsx b/js/src/lib/hooks/RecceActionContext.tsx index d1d382134..04f2093a6 100644 --- a/js/src/lib/hooks/RecceActionContext.tsx +++ b/js/src/lib/hooks/RecceActionContext.tsx @@ -1,5 +1,6 @@ import { useDisclosure } from "@chakra-ui/react"; import { useQueryClient } from "@tanstack/react-query"; +import { usePathname } from "next/navigation"; import React, { ComponentType, createContext, @@ -10,7 +11,6 @@ import React, { useEffect, useState, } from "react"; -import { useLocation } from "wouter"; import { RunModal } from "@/components/run/RunModal"; import { findByRunType, @@ -20,6 +20,7 @@ import { } from "@/components/run/registry"; import { RunFormProps } from "@/components/run/types"; import { toaster } from "@/components/ui/toaster"; +import { useAppLocation } from "@/lib/hooks/useAppRouter"; import { cacheKeys } from "../api/cacheKeys"; import { SubmitRunTrackProps, searchRuns, submitRun } from "../api/runs"; import { AxiosQueryParams, Run, RunParamTypes } from "../api/types"; @@ -78,12 +79,12 @@ interface RecceActionContextProviderProps { } const useCloseModalEffect = (onClose: () => void) => { - const [location] = useLocation(); + const pathname = usePathname(); // biome-ignore lint/correctness/useExhaustiveDependencies: Specifically run in location changes useEffect(() => { onClose(); - }, [onClose, location]); + }, [onClose, pathname]); }; interface RunActionInternal { @@ -117,7 +118,7 @@ export function RecceActionContextProvider({ setOpen: setHistoryOpen, } = useDisclosure(); const [runId, setRunId] = useState(); - const [location, setLocation] = useLocation(); + const [location, setLocation] = useAppLocation(); const queryClient = useQueryClient(); const showRunId = useCallback( diff --git a/js/src/lib/hooks/useAppRouter.ts b/js/src/lib/hooks/useAppRouter.ts new file mode 100644 index 000000000..f20f2ff92 --- /dev/null +++ b/js/src/lib/hooks/useAppRouter.ts @@ -0,0 +1,165 @@ +/** + * useAppRouter - Navigation utilities for Next.js App Router + * + * Provides a similar API to Wouter's useLocation for easier migration. + * This hook combines Next.js's useRouter, usePathname, useParams, + * and useSearchParams into a unified interface. + */ + +"use client"; + +import { + useParams, + usePathname, + useRouter, + useSearchParams, +} from "next/navigation"; +import { useCallback, useMemo } from "react"; + +interface NavigateOptions { + replace?: boolean; + scroll?: boolean; +} + +/** + * Hook that provides Wouter-compatible location API using Next.js App Router + * + * @returns [location, setLocation] tuple similar to Wouter's useLocation + * + * @example + * // Migration from Wouter + * // Before: const [location, setLocation] = useLocation(); + * // After: const [location, setLocation] = useAppLocation(); + * + * const [location, setLocation] = useAppLocation(); + * setLocation("/checks/123"); // Navigate to new path + * setLocation("/checks", { replace: true }); // Replace current history entry + */ +export function useAppLocation(): [ + string, + (to: string, options?: NavigateOptions) => void, +] { + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + + // Construct full location string including search params + const location = useMemo(() => { + const search = searchParams?.toString(); + return search ? `${pathname}?${search}` : pathname; + }, [pathname, searchParams]); + + // Navigation function compatible with Wouter's setLocation + const setLocation = useCallback( + (to: string, options?: NavigateOptions) => { + if (options?.replace) { + router.replace(to, { scroll: options?.scroll ?? true }); + } else { + router.push(to, { scroll: options?.scroll ?? true }); + } + }, + [router], + ); + + return [location, setLocation]; +} + +/** + * Hook to check if current path matches a pattern + * Similar to Wouter's useRoute + * + * @param pattern - The route pattern to match (e.g., "/checks/:checkId") + * @returns [isMatch, params] tuple + * + * @example + * const [isMatch, params] = useAppRoute("/checks/:checkId"); + * if (isMatch) { + * console.log(params.checkId); // "abc-123" + * } + */ +export function useAppRoute( + pattern: string, +): [boolean, Record] { + const pathname = usePathname(); + const params = useParams(); + + const isMatch = useMemo(() => { + // Convert Next.js dynamic route pattern to regex + // /checks/[checkId] -> /checks/:checkId -> /checks/([^/]+) + const regexPattern = pattern + .replace(/:\w+/g, "([^/]+)") // :param -> capture group + .replace(/\*/g, ".*"); // * -> wildcard + + const regex = new RegExp(`^${regexPattern}$`); + return regex.test(pathname); + }, [pattern, pathname]); + + // Convert Next.js params to plain object + const paramsObj = useMemo(() => { + if (!params) return {}; + return Object.fromEntries( + Object.entries(params).map(([key, value]) => [ + key, + Array.isArray(value) ? value.join("/") : value, + ]), + ); + }, [params]); + + return [isMatch, paramsObj as Record]; +} + +/** + * Imperative navigation function for use outside React components + * Use sparingly - prefer useAppLocation hook in components + * + * @example + * // In an event handler or utility function + * import { navigateTo } from "@/lib/hooks/useAppRouter"; + * navigateTo("/checks/123"); + */ +export function navigateTo(path: string, replace = false): void { + if (typeof window !== "undefined") { + if (replace) { + window.history.replaceState(null, "", path); + } else { + window.history.pushState(null, "", path); + } + // Trigger Next.js to recognize the navigation + window.dispatchEvent(new PopStateEvent("popstate")); + } +} + +/** + * Hook for programmatic navigation with more options + * Provides direct access to Next.js router methods + */ +export function useAppNavigation() { + const router = useRouter(); + const pathname = usePathname(); + const params = useParams(); + const searchParams = useSearchParams(); + + return { + /** Current pathname */ + pathname, + /** Current route params */ + params: params as Record, + /** Current search params */ + searchParams, + /** Navigate to a new path */ + push: router.push, + /** Replace current history entry */ + replace: router.replace, + /** Go back in history */ + back: router.back, + /** Go forward in history */ + forward: router.forward, + /** Refresh the current route */ + refresh: router.refresh, + /** Prefetch a route for faster navigation */ + prefetch: router.prefetch, + }; +} + +// Re-export Next.js hooks for convenience +export { useRouter, usePathname, useParams, useSearchParams }; diff --git a/js/src/lib/hooks/useHashLocation.ts b/js/src/lib/hooks/useHashLocation.ts deleted file mode 100644 index ddf70bcb6..000000000 --- a/js/src/lib/hooks/useHashLocation.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { BaseLocationHook, Path } from "wouter"; -import { navigate, useLocationProperty } from "wouter/use-browser-location"; - -function hashNavigate( - to: Path, - options?: { state?: unknown; replace?: boolean }, -): void { - navigate("#!" + to); -} - -export const useHashLocation: BaseLocationHook = (options?: { - ssrPath?: Path; -}) => { - const location = useLocationProperty( - () => window.location.hash.replace(/^#!/, "") || "/", - () => "/ssr", - ); - return [location, hashNavigate]; -}; From 7912e86c74472969a1be350691f4c573dac1c17c Mon Sep 17 00:00:00 2001 From: Jared Scott Date: Tue, 2 Dec 2025 20:17:39 +0800 Subject: [PATCH 2/9] feat: Remove Wouter - Get links to Query, Checks, Check/?id=checkId, Lineage working correctly Signed-off-by: Jared Scott --- js/app/(mainComponents)/NavBar.tsx | 4 +- js/app/checks/[checkId]/page.tsx | 180 ++++++++++++++++++++ js/app/checks/page.tsx | 13 +- js/app/lineage/page.tsx | 8 + js/app/query/page.tsx | 8 + js/package.json | 1 - js/pnpm-lock.yaml | 21 --- js/src/components/check/CheckEmptyState.tsx | 2 +- js/src/components/check/CheckList.tsx | 2 +- js/src/components/lineage/LineageView.tsx | 2 +- js/src/components/lineage/NodeView.tsx | 2 +- js/src/components/run/RunList.tsx | 4 +- js/src/components/run/RunResultPane.tsx | 4 +- 13 files changed, 214 insertions(+), 37 deletions(-) create mode 100644 js/app/checks/[checkId]/page.tsx create mode 100644 js/app/lineage/page.tsx create mode 100644 js/app/query/page.tsx diff --git a/js/app/(mainComponents)/NavBar.tsx b/js/app/(mainComponents)/NavBar.tsx index 6ffab0434..41602e2ab 100644 --- a/js/app/(mainComponents)/NavBar.tsx +++ b/js/app/(mainComponents)/NavBar.tsx @@ -1,3 +1,5 @@ +"use client"; + import { Box, Flex, Link, Tabs } from "@chakra-ui/react"; import { useQuery } from "@tanstack/react-query"; import { usePathname } from "next/navigation"; @@ -95,6 +97,7 @@ export default function NavBar() { return (