From 45bf548c74a9b3e80162c342ce8da82a722c48b4 Mon Sep 17 00:00:00 2001 From: Jahvon Dockery Date: Wed, 23 Jul 2025 15:27:38 -0400 Subject: [PATCH 1/6] refactor: swap in react-router for view handling --- desktop/package-lock.json | 98 +++++- desktop/package.json | 4 +- desktop/src/App.tsx | 172 ++++------ desktop/src/components/PageWrapper.tsx | 16 + desktop/src/hooks/useAppContext.tsx | 140 ++++++++ desktop/src/hooks/useBackendData.ts | 301 ------------------ desktop/src/hooks/useConfig.ts | 90 ++++++ desktop/src/hooks/useExecutable.ts | 81 +++++ desktop/src/hooks/useWorkspace.ts | 61 ++++ desktop/src/layout/AppShell/AppShell.tsx | 99 ++---- desktop/src/layout/Header/Header.tsx | 29 +- .../Sidebar/ExecutableTree/ExecutableTree.tsx | 86 ++--- desktop/src/layout/Sidebar/Sidebar.tsx | 90 +++--- .../WorkspaceSelector/WorkspaceSelector.tsx | 25 +- desktop/src/layout/Viewer/ViewLinks.ts | 14 - desktop/src/layout/Viewer/Viewer.tsx | 78 ----- desktop/src/layout/index.ts | 2 - desktop/src/pages/Data/Data.tsx | 5 +- desktop/src/pages/Executable/Executable.tsx | 2 +- .../src/pages/Executable/ExecutableRoute.tsx | 23 ++ desktop/src/pages/Settings/Settings.tsx | 253 +++++++-------- .../src/pages/Workspace/WorkspaceRoute.tsx | 23 ++ desktop/src/pages/index.ts | 4 +- 23 files changed, 869 insertions(+), 827 deletions(-) create mode 100644 desktop/src/components/PageWrapper.tsx create mode 100644 desktop/src/hooks/useAppContext.tsx delete mode 100644 desktop/src/hooks/useBackendData.ts create mode 100644 desktop/src/hooks/useConfig.ts create mode 100644 desktop/src/hooks/useExecutable.ts create mode 100644 desktop/src/hooks/useWorkspace.ts delete mode 100644 desktop/src/layout/Viewer/ViewLinks.ts delete mode 100644 desktop/src/layout/Viewer/Viewer.tsx create mode 100644 desktop/src/pages/Executable/ExecutableRoute.tsx create mode 100644 desktop/src/pages/Workspace/WorkspaceRoute.tsx diff --git a/desktop/package-lock.json b/desktop/package-lock.json index beb95f51..dd6c59b4 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -17,10 +17,12 @@ "@tauri-apps/plugin-opener": "^2.3.0", "@tauri-apps/plugin-shell": "^2.2.2", "@types/prismjs": "^1.26.5", + "@types/react-router-dom": "^5.3.3", "prismjs": "^1.30.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-markdown": "^10.1.0" + "react-markdown": "^10.1.0", + "react-router-dom": "^7.7.0" }, "devDependencies": { "@chromatic-com/storybook": "^4.0.0", @@ -1270,9 +1272,9 @@ "dev": true }, "node_modules/@mantine/core": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.0.2.tgz", - "integrity": "sha512-2Ps7bRTeTbRwAKTCL9xdflPz0pwOlTq6ohyTbDZMCADqecf09GHI7GiX+HJatqbPZ2t8jK0fN1b48YhjJaxTqg==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.2.1.tgz", + "integrity": "sha512-KxvydotyFRdrRbqULUX2G35/GddPFju9XQUv/vdDWu1ytIWZViTguc+WSj1aBd0DtfRrSaofU5ezZISEXVrPBA==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.26.28", @@ -1283,15 +1285,15 @@ "type-fest": "^4.27.0" }, "peerDependencies": { - "@mantine/hooks": "8.0.2", + "@mantine/hooks": "8.2.1", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "node_modules/@mantine/hooks": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.0.2.tgz", - "integrity": "sha512-0jpEdC0KIAZ54D5kd9rJudrEm6vkvnrL9yYHnkuNbxokXSzDdYA/wpHnKR5WW+u6fW4JF6A6A7gN1vXKeC9MSw==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.2.1.tgz", + "integrity": "sha512-gnRDk5FXCD9fa0AjlAj9otCsZL9QJzVrpYZk9KjOEoP5XR1TEE2F9/rGbajh1UVjPnD3jUlNLRJMH0YHTlA65A==", "license": "MIT", "peerDependencies": { "react": "^18.x || ^19.x" @@ -2439,6 +2441,12 @@ "@types/unist": "*" } }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2523,6 +2531,27 @@ "@types/react": "^18.0.0" } }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, "node_modules/@types/resolve": { "version": "1.20.6", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", @@ -3777,6 +3806,15 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -7940,6 +7978,44 @@ } } }, + "node_modules/react-router": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.7.0.tgz", + "integrity": "sha512-3FUYSwlvB/5wRJVTL/aavqHmfUKe0+Xm9MllkYgGo9eDwNdkvwlJGjpPxono1kCycLt6AnDTgjmXvK3/B4QGuw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.7.0.tgz", + "integrity": "sha512-wwGS19VkNBkneVh9/YD0pK3IsjWxQUVMDD6drlG7eJpo1rXBtctBqDyBm/k+oKHRAm1x9XWT3JFC82QI9YOXXA==", + "license": "MIT", + "dependencies": { + "react-router": "7.7.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/react-style-singleton": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", @@ -8287,6 +8363,12 @@ "semver": "bin/semver.js" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", diff --git a/desktop/package.json b/desktop/package.json index bcaa2a26..c6527fa3 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -26,10 +26,12 @@ "@tauri-apps/plugin-opener": "^2.3.0", "@tauri-apps/plugin-shell": "^2.2.2", "@types/prismjs": "^1.26.5", + "@types/react-router-dom": "^5.3.3", "prismjs": "^1.30.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-markdown": "^10.1.0" + "react-markdown": "^10.1.0", + "react-router-dom": "^7.7.0" }, "devDependencies": { "@chromatic-com/storybook": "^4.0.0", diff --git a/desktop/src/App.tsx b/desktop/src/App.tsx index f87d5aa0..994dd9f6 100644 --- a/desktop/src/App.tsx +++ b/desktop/src/App.tsx @@ -1,13 +1,17 @@ import "@mantine/core/styles.css"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { useEffect, useState } from "react"; +import {createHashRouter, Navigate, RouterProvider} from "react-router-dom"; import "./App.css"; -import { useBackendData, useExecutable } from "./hooks/useBackendData"; -import { NotifierProvider, useNotifier } from "./hooks/useNotifier"; -import { SettingsProvider } from "./hooks/useSettings"; -import { AppShell, View, Viewer } from "./layout"; import { ThemeProvider } from "./theme/ThemeProvider"; -import { NotificationType } from "./types/notification"; +import { AppProvider } from "./hooks/useAppContext.tsx"; +import { NotifierProvider } from "./hooks/useNotifier"; +import { SettingsProvider } from "./hooks/useSettings"; +import {AppShell} from "./layout"; +import {PageWrapper} from "./components/PageWrapper.tsx"; +import {Settings, Welcome, Data} from "./pages"; +import {WorkspaceRoute} from "./pages/Workspace/WorkspaceRoute.tsx"; +import {ExecutableRoute} from "./pages/Executable/ExecutableRoute.tsx"; +import {Text} from "@mantine/core"; const queryClient = new QueryClient({ defaultOptions: { @@ -18,106 +22,66 @@ const queryClient = new QueryClient({ }, }); -function AppContent() { - const [currentView, setCurrentView] = useState(View.Welcome); - const [welcomeMessage, setWelcomeMessage] = useState(""); - const [selectedExecutable, setSelectedExecutable] = useState( - null - ); - const [selectedWorkspace, setSelectedWorkspace] = useState( - null - ); - const { notification, setNotification } = useNotifier(); - - const { config, workspaces, executables, isLoading, hasError, refreshAll } = - useBackendData(selectedWorkspace); - - const { executable, executableError } = useExecutable( - selectedExecutable || "" - ); - - // Set initial workspace from config when it loads - useEffect(() => { - if (config?.currentWorkspace && workspaces && workspaces.length > 0) { - // Only update if we don't have a selected workspace or if the config workspace is different - if (!selectedWorkspace || config.currentWorkspace !== selectedWorkspace) { - setSelectedWorkspace(config.currentWorkspace); - } - } - }, [config, workspaces]); - - useEffect(() => { - if (hasError) { - setNotification({ - title: "Unexpected error", - message: hasError.message || "An error occurred", - type: NotificationType.Error, - autoClose: false, - }); - } - }, [hasError]); - useEffect(() => { - if (welcomeMessage === "" && executables?.length > 0) { - setWelcomeMessage("Select an executable to get started."); - } - }, [executables, welcomeMessage]); - - const handleLogoClick = () => { - setCurrentView(View.Welcome); - }; - - return ( - setCurrentView(view as View)} - workspaces={workspaces || []} - selectedWorkspace={selectedWorkspace} - onSelectWorkspace={(workspaceName) => { - setSelectedWorkspace(workspaceName); - setCurrentView(View.Workspace); - }} - visibleExecutables={executables || []} - onSelectExecutable={(executable) => { - if (executable === selectedExecutable) { - return; - } - setSelectedExecutable(executable); - if (currentView !== View.Executable) { - setCurrentView(View.Executable); - } - }} - onLogoClick={handleLogoClick} - hasError={hasError} - isLoading={isLoading} - refreshAll={refreshAll} - notification={notification} - setNotification={setNotification} - > - w.name === selectedWorkspace) || null - } - /> - - ); -} +const router = createHashRouter([ + { + path: "/", + element: ( + + + + + + + + + + + + ), + children: [ + { + index: true, + element: ( + + + + ), + }, + { + path: "workspace/:workspaceName", + element: , + }, + { + path: "executable/:executableId", + element: , + }, + { + path: "logs", + element: Logs view coming soon..., + }, + { + path: "vault", + element: , + }, + { + path: "cache", + element: , + }, + { + path: "settings", + element: , + }, + { + path: "*", + element: , + }, + ], + }, +]); function App() { - return ( - - - - - - - - - - ); + return + } export default App; diff --git a/desktop/src/components/PageWrapper.tsx b/desktop/src/components/PageWrapper.tsx new file mode 100644 index 00000000..7e10ab04 --- /dev/null +++ b/desktop/src/components/PageWrapper.tsx @@ -0,0 +1,16 @@ +import {ScrollArea} from "@mantine/core"; + +export function PageWrapper({children}: { children: React.ReactNode }) { + return ( + + {children} + + ); +} \ No newline at end of file diff --git a/desktop/src/hooks/useAppContext.tsx b/desktop/src/hooks/useAppContext.tsx new file mode 100644 index 00000000..c719c0bc --- /dev/null +++ b/desktop/src/hooks/useAppContext.tsx @@ -0,0 +1,140 @@ +import React from "react"; +import { createContext, useContext, useState, useEffect } from "react"; +import { Config } from "../types/generated/config"; +import { EnrichedWorkspace } from "../types/workspace"; +import { EnrichedExecutable } from "../types/executable"; +import { useConfig } from "./useConfig"; +import { useWorkspaces } from "./useWorkspace"; +import { useExecutables } from "./useExecutable"; +import { invoke } from "@tauri-apps/api/core"; +import { useQuery } from "@tanstack/react-query"; + +interface AppContextType { + config: Config | null; + selectedWorkspace: string | null; + setSelectedWorkspace: (workspaceName: string | null) => void; + workspaces: EnrichedWorkspace[]; + executables: EnrichedExecutable[]; + isLoading: boolean; + hasError: Error | null; + refreshAll: () => void; +} + +export const AppContext = createContext(undefined); + +export function useFlowBinaryCheck() { + const { data: isFlowBinaryAvailable, isLoading: isCheckingBinary, error: binaryCheckError } = useQuery({ + queryKey: ["flowBinaryCheck"], + queryFn: async () => { + try { + await invoke("check_flow_binary"); + return true; + } catch (error) { + console.error(error); + throw new Error("flow CLI not found or not executable"); + } + }, + retry: false, + refetchOnWindowFocus: false, + }); + + return { + isFlowBinaryAvailable, + isCheckingBinary, + binaryCheckError, + }; +} + +export function AppProvider({ children }: { children: React.ReactNode }) { + const { isCheckingBinary, binaryCheckError } = useFlowBinaryCheck(); + const enabled = !binaryCheckError && !isCheckingBinary; + + const { config, isConfigLoading, configError, refreshConfig } = useConfig(enabled); + + const { workspaces, isWorkspacesLoading, workspacesError, refreshWorkspaces } = useWorkspaces(enabled); + const [selectedWorkspace, setSelectedWorkspace] = useState(null); + + useEffect(() => { + if (config?.currentWorkspace && workspaces && workspaces.length > 0) { + // Only set if we don't have a selected workspace or if the config workspace exists + const configWorkspaceExists = workspaces.some(w => w.name === config.currentWorkspace); + if (!selectedWorkspace && configWorkspaceExists) { + setSelectedWorkspace(config.currentWorkspace); + } + } + }, [config, workspaces, selectedWorkspace]); + + const { executables, isExecutablesLoading, executablesError, refreshExecutables } = useExecutables(selectedWorkspace, enabled); + + const isLoading = + isConfigLoading || isWorkspacesLoading || isExecutablesLoading; + const hasError = configError || workspacesError || executablesError; + if (hasError) { + console.error("Error", hasError); + } + + const refreshAll = () => { + refreshConfig(); + refreshWorkspaces(); + refreshExecutables(); + }; + + // If flow binary is not available, return early with error state + if (binaryCheckError) { + return ( + {}, + }}> + {children} + + ); + } + + // If still checking binary, show loading state + if (isCheckingBinary) { + return ( + {}, + }}> + {children} + + ); + } + + return ( + + {children} + + ); +} + +export function useAppContext() { + const context = useContext(AppContext); + if (context === undefined) { + throw new Error('useAppContext must be used within an AppProvider'); + } + return context; +} \ No newline at end of file diff --git a/desktop/src/hooks/useBackendData.ts b/desktop/src/hooks/useBackendData.ts deleted file mode 100644 index c35776d9..00000000 --- a/desktop/src/hooks/useBackendData.ts +++ /dev/null @@ -1,301 +0,0 @@ -import { useQuery, useQueryClient } from "@tanstack/react-query"; -import { invoke } from "@tauri-apps/api/core"; -import React from "react"; -import { EnrichedExecutable } from "../types/executable"; -import { Config } from "../types/generated/config"; -import { EnrichedWorkspace } from "../types/workspace"; - -export function useConfig(enabled: boolean = true) { - const queryClient = useQueryClient(); - - const { - data: config, - isLoading: isConfigLoading, - error: configError, - } = useQuery({ - queryKey: ["config"], - queryFn: async () => { - return await invoke("get_config"); - }, - enabled, - }); - - const refreshConfig = () => { - queryClient.invalidateQueries({ queryKey: ["config"] }); - }; - - const updateTheme = async (theme: string) => { - try { - await invoke("set_config_theme", { theme }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update theme: ${error}`); - } - }; - - const updateWorkspaceMode = async (mode: string) => { - try { - await invoke("set_config_workspace_mode", { mode }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update workspace mode: ${error}`); - } - }; - - const updateLogMode = async (mode: string) => { - try { - await invoke("set_config_log_mode", { mode }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update log mode: ${error}`); - } - }; - - const updateNamespace = async (namespace: string) => { - try { - await invoke("set_config_namespace", { namespace }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update namespace: ${error}`); - } - }; - - const updateCurrentWorkspace = async (workspace: string) => { - try { - await invoke("set_workspace", { name: workspace, fixed: false }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update current workspace: ${error}`); - } - }; - - const updateDefaultTimeout = async (timeout: string) => { - try { - await invoke("set_config_timeout", { timeout }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update default timeout: ${error}`); - } - }; - - return { - config, - isConfigLoading, - configError, - refreshConfig, - updateTheme, - updateWorkspaceMode, - updateLogMode, - updateNamespace, - updateCurrentWorkspace, - updateDefaultTimeout, - }; -} - -export function useWorkspaces(enabled: boolean = true) { - const queryClient = useQueryClient(); - - const { - data: workspaces, - isLoading: isWorkspacesLoading, - error: workspacesError, - } = useQuery({ - queryKey: ["workspaces"], - queryFn: async () => { - const response = await invoke("list_workspaces"); - return response; - }, - enabled, - }); - - const refreshWorkspaces = () => { - queryClient.invalidateQueries({ queryKey: ["workspaces"] }); - }; - - return { - workspaces, - isWorkspacesLoading, - workspacesError, - refreshWorkspaces, - }; -} - -export function useExecutable(executableRef: string) { - const queryClient = useQueryClient(); - const [currentExecutable, setCurrentExecutable] = - React.useState(null); - - const { - data: executable, - isLoading: isExecutableLoading, - error: executableError, - } = useQuery({ - queryKey: ["executable", executableRef], - queryFn: async () => { - if (!executableRef) return null; - const response = await invoke("get_executable", { - executableRef: executableRef, - }); - return response; - }, - enabled: !!executableRef, - }); - - // Update current executable when we have new data - React.useEffect(() => { - if (executable) { - setCurrentExecutable(executable); - } - }, [executable]); - - const refreshExecutable = () => { - if (executableRef) { - queryClient.invalidateQueries({ - queryKey: ["executable", executableRef], - }); - } - }; - - return { - executable: currentExecutable, - isExecutableLoading, - executableError, - refreshExecutable, - }; -} - -export function useExecutables(selectedWorkspace: string | null, enabled: boolean = true) { - const queryClient = useQueryClient(); - - const { - data: executables, - isLoading: isExecutablesLoading, - error: executablesError, - } = useQuery({ - queryKey: ["executables", selectedWorkspace], - queryFn: async () => { - if (!selectedWorkspace) return []; - const response = await invoke("list_executables", { - workspace: selectedWorkspace, - }); - return response; - }, - enabled: enabled && !!selectedWorkspace, // Only run when workspace is selected AND enabled - }); - - const refreshExecutables = () => { - if (selectedWorkspace) { - queryClient.invalidateQueries({ - queryKey: ["executables", selectedWorkspace], - }); - } - }; - - return { - executables: executables || [], - isExecutablesLoading, - executablesError, - refreshExecutables, - }; -} - -// Hook to check if flow binary is available -export function useFlowBinaryCheck() { - const { data: isFlowBinaryAvailable, isLoading: isCheckingBinary, error: binaryCheckError } = useQuery({ - queryKey: ["flowBinaryCheck"], - queryFn: async () => { - try { - await invoke("check_flow_binary"); - return true; - } catch (error) { - console.error(error); - throw new Error("flow CLI not found or not executable"); - } - }, - retry: false, - refetchOnWindowFocus: false, - }); - - return { - isFlowBinaryAvailable, - isCheckingBinary, - binaryCheckError, - }; -} - -// Composite hook that combines all data sources -export function useBackendData(selectedWorkspace: string | null) { - const { isCheckingBinary, binaryCheckError } = useFlowBinaryCheck(); - - // Only enable other queries if flow binary is available - const enabled = !binaryCheckError && !isCheckingBinary; - - const { config, isConfigLoading, configError, refreshConfig } = useConfig(enabled); - const { - workspaces, - isWorkspacesLoading, - workspacesError, - refreshWorkspaces, - } = useWorkspaces(enabled); - const { - executables, - isExecutablesLoading, - executablesError, - refreshExecutables, - } = useExecutables(selectedWorkspace, enabled); - - // If flow binary is not available, return early with error state - if (binaryCheckError) { - return { - config: null, - workspaces: [], - executables: [], - isLoading: false, - hasError: binaryCheckError, - refreshAll: () => {}, - refreshConfig: () => {}, - refreshWorkspaces: () => {}, - refreshExecutables: () => {}, - }; - } - - // If still checking binary, show loading state - if (isCheckingBinary) { - return { - config: null, - workspaces: [], - executables: [], - isLoading: true, - hasError: null, - refreshAll: () => {}, - refreshConfig: () => {}, - refreshWorkspaces: () => {}, - refreshExecutables: () => {}, - }; - } - - const isLoading = - isConfigLoading || isWorkspacesLoading || isExecutablesLoading; - const hasError = configError || workspacesError || executablesError; - if (hasError) { - console.error("Error", hasError); - } - - const refreshAll = () => { - refreshConfig(); - refreshWorkspaces(); - refreshExecutables(); - }; - - return { - config, - workspaces, - executables, - isLoading, - hasError, - refreshAll, - refreshConfig, - refreshWorkspaces, - refreshExecutables, - }; -} diff --git a/desktop/src/hooks/useConfig.ts b/desktop/src/hooks/useConfig.ts new file mode 100644 index 00000000..ff9fefe1 --- /dev/null +++ b/desktop/src/hooks/useConfig.ts @@ -0,0 +1,90 @@ +import {useQuery, useQueryClient} from "@tanstack/react-query"; +import {invoke} from "@tauri-apps/api/core"; +import {Config} from "../types/generated/config.ts"; + +export function useConfig(enabled: boolean = true) { + const queryClient = useQueryClient(); + + const { + data: config, + isLoading: isConfigLoading, + error: configError, + } = useQuery({ + queryKey: ["config"], + queryFn: async () => { + return await invoke("get_config"); + }, + enabled, + }); + + const refreshConfig = () => { + queryClient.invalidateQueries({ queryKey: ["config"] }); + }; + + const updateTheme = async (theme: string) => { + try { + await invoke("set_config_theme", { theme }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update theme: ${error}`); + } + }; + + const updateWorkspaceMode = async (mode: string) => { + try { + await invoke("set_config_workspace_mode", { mode }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update workspace mode: ${error}`); + } + }; + + const updateLogMode = async (mode: string) => { + try { + await invoke("set_config_log_mode", { mode }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update log mode: ${error}`); + } + }; + + const updateNamespace = async (namespace: string) => { + try { + await invoke("set_config_namespace", { namespace }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update namespace: ${error}`); + } + }; + + const updateCurrentWorkspace = async (workspace: string) => { + try { + await invoke("set_workspace", { name: workspace, fixed: false }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update current workspace: ${error}`); + } + }; + + const updateDefaultTimeout = async (timeout: string) => { + try { + await invoke("set_config_timeout", { timeout }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update default timeout: ${error}`); + } + }; + + return { + config, + isConfigLoading, + configError, + refreshConfig, + updateTheme, + updateWorkspaceMode, + updateLogMode, + updateNamespace, + updateCurrentWorkspace, + updateDefaultTimeout, + }; +} diff --git a/desktop/src/hooks/useExecutable.ts b/desktop/src/hooks/useExecutable.ts new file mode 100644 index 00000000..10c7b560 --- /dev/null +++ b/desktop/src/hooks/useExecutable.ts @@ -0,0 +1,81 @@ +import {useQuery, useQueryClient} from "@tanstack/react-query"; +import React from "react"; +import {EnrichedExecutable} from "../types/executable.ts"; +import {invoke} from "@tauri-apps/api/core"; + +export function useExecutable(executableRef: string) { + const queryClient = useQueryClient(); + const [currentExecutable, setCurrentExecutable] = + React.useState(null); + + const { + data: executable, + isLoading: isExecutableLoading, + error: executableError, + } = useQuery({ + queryKey: ["executable", executableRef], + queryFn: async () => { + if (!executableRef) return null; + return await invoke("get_executable", { + executableRef: executableRef, + }); + }, + enabled: !!executableRef, + }); + + // Update current executable when we have new data + React.useEffect(() => { + if (executable) { + setCurrentExecutable(executable); + } + }, [executable]); + + const refreshExecutable = () => { + if (executableRef) { + queryClient.invalidateQueries({ + queryKey: ["executable", executableRef], + }); + } + }; + + return { + executable: currentExecutable, + isExecutableLoading, + executableError, + refreshExecutable, + }; +} + +export function useExecutables(selectedWorkspace: string | null, enabled: boolean = true) { + const queryClient = useQueryClient(); + + const { + data: executables, + isLoading: isExecutablesLoading, + error: executablesError, + } = useQuery({ + queryKey: ["executables", selectedWorkspace], + queryFn: async () => { + if (!selectedWorkspace) return []; + return await invoke("list_executables", { + workspace: selectedWorkspace, + }); + }, + enabled: enabled && !!selectedWorkspace, // Only run when workspace is selected AND enabled + }); + + const refreshExecutables = () => { + if (selectedWorkspace) { + queryClient.invalidateQueries({ + queryKey: ["executables", selectedWorkspace], + }); + } + }; + + return { + executables: executables || [], + isExecutablesLoading, + executablesError, + refreshExecutables, + }; +} diff --git a/desktop/src/hooks/useWorkspace.ts b/desktop/src/hooks/useWorkspace.ts new file mode 100644 index 00000000..a8beb362 --- /dev/null +++ b/desktop/src/hooks/useWorkspace.ts @@ -0,0 +1,61 @@ +import {useQuery, useQueryClient} from "@tanstack/react-query"; +import {invoke} from "@tauri-apps/api/core"; +import {EnrichedWorkspace} from "../types/workspace.ts"; + +export function useWorkspace(workspaceName: string, enabled: boolean = true) { + const queryClient = useQueryClient(); + + const { + data: workspace, + isLoading: isWorkspaceLoading, + error: workspaceError, + } = useQuery({ + queryKey: ["workspace", workspaceName], + queryFn: async () => { + return await invoke("get_workspace", { + name: workspaceName, + }); + }, + enabled, + }); + + const refreshWorkspace = () => { + if (workspaceName) { + queryClient.invalidateQueries({queryKey: ["workspace", workspaceName]}); + } + }; + + return { + workspace, + workspaceError, + isWorkspaceLoading, + refreshWorkspace, + }; +} + +export function useWorkspaces(enabled: boolean = true) { + const queryClient = useQueryClient(); + + const { + data: workspaces, + isLoading: isWorkspacesLoading, + error: workspacesError, + } = useQuery({ + queryKey: ["workspaces"], + queryFn: async () => { + return await invoke("list_workspaces"); + }, + enabled, + }); + + const refreshWorkspaces = () => { + queryClient.invalidateQueries({ queryKey: ["workspaces"] }); + }; + + return { + workspaces, + isWorkspacesLoading, + workspacesError, + refreshWorkspaces, + }; +} diff --git a/desktop/src/layout/AppShell/AppShell.tsx b/desktop/src/layout/AppShell/AppShell.tsx index 1b4f46b7..d0f4e3e4 100644 --- a/desktop/src/layout/AppShell/AppShell.tsx +++ b/desktop/src/layout/AppShell/AppShell.tsx @@ -1,57 +1,34 @@ import { - ActionIcon, Loader, AppShell as MantineAppShell, Notification as MantineNotification, Text, } from "@mantine/core"; -import { IconRefresh } from "@tabler/icons-react"; -import { ReactNode } from "react"; -import { EnrichedExecutable } from "../../types/executable"; -import { - colorFromType, - Notification, - NotificationType, -} from "../../types/notification"; -import { EnrichedWorkspace } from "../../types/workspace"; +import {useEffect} from "react"; +import {colorFromType, NotificationType,} from "../../types/notification"; import { Header } from "../Header/Header"; import { Sidebar } from "../Sidebar/Sidebar"; -import { View } from "../Viewer/Viewer"; import styles from "./AppShell.module.css"; +import {useAppContext} from "../../hooks/useAppContext.tsx"; +import {useNotifier} from "../../hooks/useNotifier.tsx"; +import {Outlet, useLocation} from "react-router-dom"; -interface AppShellProps { - children: ReactNode; - currentView: View; - setCurrentView: (view: View) => void; - workspaces: EnrichedWorkspace[]; - selectedWorkspace: string | null; - onSelectWorkspace: (workspaceName: string) => void; - visibleExecutables: EnrichedExecutable[]; - onSelectExecutable: (executable: string) => void; - onLogoClick: () => void; - hasError: Error | null; - isLoading: boolean; - refreshAll: () => void; - notification: Notification | null; - setNotification: (notification: Notification | null) => void; -} +export function AppShell() { + const { isLoading, hasError } = useAppContext(); + const { notification, setNotification } = useNotifier(); + const location = useLocation(); + + useEffect(() => { + if (hasError) { + setNotification({ + title: "Unexpected error", + message: hasError.message || "An error occurred", + type: NotificationType.Error, + autoClose: false, + }); + } + }, [hasError, setNotification]); -export function AppShell({ - children, - currentView, - setCurrentView, - workspaces, - selectedWorkspace, - onSelectWorkspace, - visibleExecutables, - onSelectExecutable, - onLogoClick, - hasError, - isLoading, - refreshAll, - notification, - setNotification, -}: AppShellProps) { return ( -
{}} - onRefreshWorkspaces={() => { - refreshAll(); - setNotification({ - title: "Refresh completed", - message: "flow data has synced and refreshed successfully", - type: NotificationType.Success, - autoClose: true, - autoCloseDelay: 3000, - }); - }} - /> +
- + @@ -106,18 +62,11 @@ export function AppShell({ }} > Error loading data - - - + {hasError.message} ) : (
- {children} + {isLoading && (
void; - onRefreshWorkspaces: () => void; -} - -export function Header({ - onCreateWorkspace, - onRefreshWorkspaces, -}: HeaderProps) { +export function Header() { + const { refreshAll } = useAppContext(); + const { setNotification } = useNotifier(); + return (
{}} title="Create workspace" variant="light" > @@ -26,7 +24,16 @@ export function Header({ { + refreshAll(); + setNotification({ + title: "Refresh completed", + message: "flow data has synced and refreshed successfully", + type: NotificationType.Success, + autoClose: true, + autoCloseDelay: 3000, + }); + }} title="Refresh workspaces" > diff --git a/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx b/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx index a90d9f9e..cdcf5c9a 100644 --- a/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx +++ b/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx @@ -37,11 +37,8 @@ import { UpdateVerbType, ValidationVerbType, } from "../../../types/executable"; - -interface ExecutableTreeProps { - visibleExecutables: EnrichedExecutable[]; - onSelectExecutable: (executable: string) => void; -} +import {useAppContext} from "../../../hooks/useAppContext.tsx"; +import {Link} from "react-router-dom"; interface CustomTreeNodeData extends TreeNodeData { isNamespace: boolean; @@ -155,58 +152,67 @@ function Leaf({ } } + if (customNode.isNamespace) { + return ( + + {icon} + {customNode.label} + + ); + } + return ( - - {icon} - {customNode.label} - + + + {icon} + {customNode.label} + + ); } -export function ExecutableTree({ - visibleExecutables, - onSelectExecutable, -}: ExecutableTreeProps) { +export function ExecutableTree() { + const { executables } = useAppContext(); const tree = useTree(); - React.useEffect(() => { - const selectedValue = tree.selectedState[0]; - if (selectedValue) { - const findNode = ( - nodes: CustomTreeNodeData[] - ): CustomTreeNodeData | undefined => { - for (const node of nodes) { - if (node.value === selectedValue) { - return node; - } - if (node.children) { - const found = findNode(node.children as CustomTreeNodeData[]); - if (found) return found; - } - } - return undefined; - }; - - const node = findNode(getTreeData(visibleExecutables)); - if (node && !node.isNamespace) { - onSelectExecutable(selectedValue); - } - } - }, [tree.selectedState, visibleExecutables, onSelectExecutable]); + // React.useEffect(() => { + // const selectedValue = tree.selectedState[0]; + // if (selectedValue) { + // const findNode = ( + // nodes: CustomTreeNodeData[] + // ): CustomTreeNodeData | undefined => { + // for (const node of nodes) { + // if (node.value === selectedValue) { + // return node; + // } + // if (node.children) { + // const found = findNode(node.children as CustomTreeNodeData[]); + // if (found) return found; + // } + // } + // return undefined; + // }; + // + // // const node = findNode(getTreeData(executables)); + // // if (node && !node.isNamespace) { + // // onSelectExecutable(selectedValue); + // // } + // } + // }, [tree.selectedState, executables, onSelectExecutable]); return ( <> - EXECUTABLES ({visibleExecutables.length}) + EXECUTABLES ({executables.length}) - {visibleExecutables.length === 0 ? ( + {executables.length === 0 ? ( No executables found ) : ( void; - workspaces: EnrichedWorkspace[]; - selectedWorkspace: string | null; - onSelectWorkspace: (workspaceName: string) => void; - visibleExecutables: EnrichedExecutable[]; - onSelectExecutable: (executableId: string) => void; - onLogoClick: () => void; -} +export function Sidebar() { + const location = useLocation(); + const { executables, selectedWorkspace } = useAppContext() -export function Sidebar({ - currentView, - setCurrentView, - workspaces, - selectedWorkspace, - onSelectWorkspace, - visibleExecutables, - onSelectExecutable, - onLogoClick, -}: SidebarProps) { return (
-
+ flow -
+ - + - {ViewLinks.map((link) => ( - } - active={currentView === link.view} - onClick={() => setCurrentView(link.view)} + } + component={Link} + to={`/workspace/${selectedWorkspace}`} + active={location.pathname.startsWith('/workspace')} variant="filled" - /> - ))} + /> + } + component={Link} + to={`/logs`} + active={location.pathname.startsWith('/logs')} + variant="filled" + /> + } + variant="filled" + childrenOffset={28} + > + + + + } + component={Link} + to={`/settings`} + active={location.pathname.startsWith('/settings')} + variant="filled" + /> - {visibleExecutables && visibleExecutables.length > 0 && ( - + {executables && executables.length > 0 && ( + )}
diff --git a/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.tsx b/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.tsx index ddb14cf1..7bd0279b 100644 --- a/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.tsx +++ b/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.tsx @@ -1,14 +1,8 @@ import { ComboboxItem, Group, OptionsFilter, Select } from "@mantine/core"; -import { useConfig } from "../../../hooks/useBackendData"; +import { useConfig } from "../../../hooks/useConfig"; import { useNotifier } from "../../../hooks/useNotifier"; -import { EnrichedWorkspace } from "../../../types/workspace"; import { NotificationType } from "../../../types/notification"; - -interface WorkspaceSelectorProps { - workspaces: EnrichedWorkspace[]; - selectedWorkspace: string | null; - onSelectWorkspace: (workspaceName: string) => void; -} +import {useAppContext} from "../../../hooks/useAppContext.tsx"; const filter: OptionsFilter = ({ options, search }) => { const filtered = (options as ComboboxItem[]).filter((option) => @@ -19,16 +13,13 @@ const filter: OptionsFilter = ({ options, search }) => { return filtered; }; -export function WorkspaceSelector({ - workspaces, - selectedWorkspace, - onSelectWorkspace, -}: WorkspaceSelectorProps) { - const { config, updateCurrentWorkspace } = useConfig(); +export function WorkspaceSelector() { + const { selectedWorkspace, setSelectedWorkspace, workspaces, config } = useAppContext() + const { updateCurrentWorkspace } = useConfig(); const { setNotification } = useNotifier(); const handleWorkspaceChange = async (workspaceName: string) => { - onSelectWorkspace(workspaceName); + setSelectedWorkspace(workspaceName); if (config?.workspaceMode === 'dynamic') { try { @@ -83,10 +74,10 @@ export function WorkspaceSelector({ }, option: { color: "var(--mantine-color-white)", - "&[data-selected]": { + "&[dataSelected]": { backgroundColor: "var(--mantine-color-dark-5)", }, - "&[data-hovered]": { + "&[dataHovered]": { backgroundColor: "var(--mantine-color-dark-5)", }, }, diff --git a/desktop/src/layout/Viewer/ViewLinks.ts b/desktop/src/layout/Viewer/ViewLinks.ts deleted file mode 100644 index 73c19149..00000000 --- a/desktop/src/layout/Viewer/ViewLinks.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { - IconDatabase, - IconFolders, - IconLogs, - IconSettings, -} from "@tabler/icons-react"; -import { View } from "./Viewer"; - -export const ViewLinks = [ - { icon: IconFolders, label: "Workspace", view: View.Workspace }, - { icon: IconLogs, label: "Logs", view: View.Logs }, - { icon: IconDatabase, label: "Data", view: View.Data }, - { icon: IconSettings, label: "Settings", view: View.Settings }, -]; \ No newline at end of file diff --git a/desktop/src/layout/Viewer/Viewer.tsx b/desktop/src/layout/Viewer/Viewer.tsx deleted file mode 100644 index 5b2b080f..00000000 --- a/desktop/src/layout/Viewer/Viewer.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { ScrollArea, Text } from "@mantine/core"; -import Data from "../../pages/Data/Data"; -import Executable from "../../pages/Executable/Executable"; -import { Settings } from "../../pages/Settings/Settings"; -import { Welcome } from "../../pages/Welcome/Welcome"; -import { Workspace } from "../../pages/Workspace/Workspace"; -import type { EnrichedExecutable } from "../../types/executable"; -import { EnrichedWorkspace } from "../../types/workspace"; - -export enum View { - Welcome = "welcome", - Workspace = "workspace", - Executable = "executable", - Logs = "logs", - Data = "data", - Settings = "settings", -} - -interface ViewerProps { - currentView: View; - selectedExecutable: EnrichedExecutable | null; - executableError: Error | null; - welcomeMessage?: string; - workspace: EnrichedWorkspace | null; -} - -export function Viewer({ - currentView, - selectedExecutable, - executableError, - welcomeMessage, - workspace, -}: ViewerProps) { - const renderContent = () => { - switch (currentView) { - case View.Workspace: - return ; - case View.Executable: - if (selectedExecutable) { - if (executableError) { - console.error(executableError); - return ( - - Error loading executable: {executableError.message} - - ); - } - return ; - } - return ( - - ); - case View.Welcome: - return ; - case View.Logs: - return Logs view coming soon...; - case View.Data: - return ; - case View.Settings: - return ; - default: - return ; - } - }; - - return ( - - {renderContent()} - - ); -} diff --git a/desktop/src/layout/index.ts b/desktop/src/layout/index.ts index db40cc3d..e2ab3558 100644 --- a/desktop/src/layout/index.ts +++ b/desktop/src/layout/index.ts @@ -1,5 +1,3 @@ export { AppShell } from "./AppShell/AppShell"; export { Header } from "./Header/Header"; export { Sidebar } from "./Sidebar/Sidebar"; -export { Viewer, View } from "./Viewer/Viewer"; -export { ViewLinks } from "./Viewer/ViewLinks"; \ No newline at end of file diff --git a/desktop/src/pages/Data/Data.tsx b/desktop/src/pages/Data/Data.tsx index 855b4ec4..f4880b15 100644 --- a/desktop/src/pages/Data/Data.tsx +++ b/desktop/src/pages/Data/Data.tsx @@ -1,8 +1,10 @@ import { Tabs } from "@mantine/core"; import { IconBraces, IconLock } from "@tabler/icons-react"; +import {PageWrapper} from "../../components/PageWrapper.tsx"; -export default function Data() { +export function Data() { return ( + }> @@ -15,5 +17,6 @@ export default function Data() { Cache data should show here Vault data should show here + ); } diff --git a/desktop/src/pages/Executable/Executable.tsx b/desktop/src/pages/Executable/Executable.tsx index b3618d13..bc3b251e 100644 --- a/desktop/src/pages/Executable/Executable.tsx +++ b/desktop/src/pages/Executable/Executable.tsx @@ -96,7 +96,7 @@ function getVisibilityColor(visibility?: string) { } } -export default function Executable({ executable }: ExecutableProps) { +export function Executable({ executable }: ExecutableProps) { const typeInfo = getExecutableTypeInfo(executable); const { settings } = useSettings(); const { setNotification } = useNotifier(); diff --git a/desktop/src/pages/Executable/ExecutableRoute.tsx b/desktop/src/pages/Executable/ExecutableRoute.tsx new file mode 100644 index 00000000..dd410c0e --- /dev/null +++ b/desktop/src/pages/Executable/ExecutableRoute.tsx @@ -0,0 +1,23 @@ +import { Text, LoadingOverlay } from "@mantine/core"; +import { useParams } from "react-router-dom"; +import { useExecutable } from "../../hooks/useExecutable"; +import { PageWrapper } from "../../components/PageWrapper.tsx"; +import { Welcome } from "../Welcome/Welcome"; +import { Executable } from "./Executable"; + +export function ExecutableRoute() { + const { executableId } = useParams(); + const { executable, executableError, isExecutableLoading } = useExecutable(executableId || ""); + + return ( + + {isExecutableLoading && } + {executableError && Error: {executableError.message}} + {executable ? ( + + ) : ( + + )} + + ); +} \ No newline at end of file diff --git a/desktop/src/pages/Settings/Settings.tsx b/desktop/src/pages/Settings/Settings.tsx index 9fdb59f3..250eb929 100644 --- a/desktop/src/pages/Settings/Settings.tsx +++ b/desktop/src/pages/Settings/Settings.tsx @@ -8,7 +8,7 @@ import { Paper, } from "@mantine/core"; import { IconInfoCircle } from "@tabler/icons-react"; -import { useConfig } from "../../hooks/useBackendData"; +import { useConfig } from "../../hooks/useConfig"; import { useSettings } from "../../hooks/useSettings"; import { useNotifier } from "../../hooks/useNotifier"; import { ThemeName } from "../../theme/types"; @@ -16,6 +16,7 @@ import { NotificationType } from "../../types/notification"; import { SettingRow, SettingSection } from "../../components/Settings"; import styles from "./Settings.module.css"; import { useState, useEffect } from "react"; +import { PageWrapper } from "../../components/PageWrapper"; const themeOptions = [ { value: "everforest", label: "Default" }, @@ -194,134 +195,136 @@ export function Settings() { } return ( -
- - - - Settings - + +
+ + + + Settings + + + + + + value && handleThemeChange(value)} - data={themeOptions} - variant="filled" - /> - + + value && handleLogModeChange(value)} - data={logModeOptions} - variant="filled" - /> - - - - handleDefaultTimeoutChange(e.currentTarget.value)} - placeholder="e.g., 30s, 5m, 1h" - variant="filled" - /> - - + + handleDefaultTimeoutChange(e.currentTarget.value)} + placeholder="e.g., 30s, 5m, 1h" + variant="filled" + /> + + - - - value && handleWorkspaceModeChange(value)} - data={workspaceModeOptions} - variant="filled" - /> - + + + value && handleWorkspaceModeChange(value)} + data={workspaceModeOptions} + variant="filled" + /> + - - - updateWorkspaceApp(event.currentTarget.value)} - placeholder="System default" - variant="filled" - spellCheck={false} - /> - - - - updateExecutableApp(event.currentTarget.value)} - placeholder="System default" - variant="filled" - spellCheck={false} - /> - - - -
+ + setNamespaceInput(e.currentTarget.value)} + onBlur={handleNamespaceSubmit} + onKeyDown={(e) => { + if (e.key === 'Enter') { + handleNamespaceSubmit(); + } + }} + placeholder="Enter namespace" + variant="filled" + spellCheck={false} + /> + + + + + + updateWorkspaceApp(event.currentTarget.value)} + placeholder="System default" + variant="filled" + spellCheck={false} + /> + + + + updateExecutableApp(event.currentTarget.value)} + placeholder="System default" + variant="filled" + spellCheck={false} + /> + + + +
+ ); } diff --git a/desktop/src/pages/Workspace/WorkspaceRoute.tsx b/desktop/src/pages/Workspace/WorkspaceRoute.tsx new file mode 100644 index 00000000..3123f975 --- /dev/null +++ b/desktop/src/pages/Workspace/WorkspaceRoute.tsx @@ -0,0 +1,23 @@ +import { useParams } from "react-router-dom"; +import { useWorkspace } from "../../hooks/useWorkspace"; +import { LoadingOverlay, Text } from "@mantine/core"; +import { PageWrapper } from "../../components/PageWrapper.tsx"; +import { Workspace } from "./Workspace"; +import { Welcome } from "../Welcome/Welcome"; + +export function WorkspaceRoute() { + const { workspaceName } = useParams(); + const { workspace, workspaceError, isWorkspaceLoading } = useWorkspace(workspaceName || ""); + + return ( + + {isWorkspaceLoading && } + {workspaceError && Error: {workspaceError.message}} + {workspace ? ( + + ) : ( + + )} + + ); +} \ No newline at end of file diff --git a/desktop/src/pages/index.ts b/desktop/src/pages/index.ts index 92f7ef45..f787324d 100644 --- a/desktop/src/pages/index.ts +++ b/desktop/src/pages/index.ts @@ -1,5 +1,5 @@ -export { default as Data } from "./Data/Data"; -export { default as ExecutableInfo } from "./Executable/Executable"; +export { Data } from "./Data/Data"; +export { Executable } from "./Executable/Executable"; export { Settings } from "./Settings/Settings"; export { Welcome } from "./Welcome/Welcome"; export { Workspace } from "./Workspace/Workspace"; \ No newline at end of file From 2891f12157fd9eb2b0af3f60ea17d65550f9a2b0 Mon Sep 17 00:00:00 2001 From: Jahvon Dockery Date: Fri, 25 Jul 2025 19:10:48 -0400 Subject: [PATCH 2/6] change import --- desktop/index.html | 1 - desktop/package-lock.json | 2040 ++++++++++++++++- desktop/package.json | 6 +- desktop/src/App.tsx | 3 +- desktop/src/layout/AppShell/AppShell.tsx | 2 +- .../Sidebar/ExecutableTree/ExecutableTree.tsx | 2 +- desktop/src/layout/Sidebar/Sidebar.tsx | 25 +- .../src/pages/Executable/ExecutableRoute.tsx | 2 +- .../src/pages/Workspace/WorkspaceRoute.tsx | 2 +- desktop/vite.config.ts | 3 +- 10 files changed, 1942 insertions(+), 144 deletions(-) diff --git a/desktop/index.html b/desktop/index.html index aa6c9999..f1d566b4 100644 --- a/desktop/index.html +++ b/desktop/index.html @@ -2,7 +2,6 @@ - flow Desktop diff --git a/desktop/package-lock.json b/desktop/package-lock.json index dd6c59b4..9cad5c3f 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -17,16 +17,16 @@ "@tauri-apps/plugin-opener": "^2.3.0", "@tauri-apps/plugin-shell": "^2.2.2", "@types/prismjs": "^1.26.5", - "@types/react-router-dom": "^5.3.3", "prismjs": "^1.30.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^10.1.0", - "react-router-dom": "^7.7.0" + "react-router": "^7.7.0" }, "devDependencies": { "@chromatic-com/storybook": "^4.0.0", "@eslint/js": "^9.28.0", + "@react-router/dev": "^7.7.0", "@storybook/addon-a11y": "^9.0.4", "@storybook/addon-docs": "^9.0.4", "@storybook/addon-onboarding": "^9.0.4", @@ -52,7 +52,7 @@ "tsx": "^4.7.1", "typescript": "~5.6.2", "typescript-eslint": "^8.34.0", - "vite": "^6.0.3", + "vite": "^6.3.5", "vitest": "^3.2.1" } }, @@ -103,22 +103,22 @@ } }, "node_modules/@babel/core": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", - "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", + "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.4", - "@babel/parser": "^7.27.4", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.4", - "@babel/types": "^7.27.3", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -134,22 +134,35 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz", - "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.3", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", @@ -167,6 +180,52 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", @@ -199,6 +258,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", @@ -209,6 +281,38 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -240,27 +344,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.4.tgz", - "integrity": "sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3" + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.4.tgz", - "integrity": "sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.28.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -269,6 +373,55 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", @@ -301,6 +454,46 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.27.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.4.tgz", @@ -326,38 +519,28 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/types": "^7.28.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", - "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz", + "integrity": "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1213,18 +1396,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1237,16 +1416,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -1255,9 +1424,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1317,6 +1486,13 @@ "react": ">=16" } }, + "node_modules/@mjackson/node-fetch-server": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mjackson/node-fetch-server/-/node-fetch-server-0.2.0.tgz", + "integrity": "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==", + "dev": true, + "license": "MIT" + }, "node_modules/@neoconfetti/react": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@neoconfetti/react/-/react-1.0.0.tgz", @@ -1362,6 +1538,126 @@ "node": ">= 8" } }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.1.0", + "glob": "^10.2.2", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1380,6 +1676,199 @@ "dev": true, "license": "MIT" }, + "node_modules/@react-router/dev": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.7.0.tgz", + "integrity": "sha512-z6tJ0US20pS/YpaPz59SJgSH+1BJ6xvQmQ/u4Y4HM1uLOa4b3Mleg3KujqAvwGP5wkMkNFz3Ae2g6/kDTFyuCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.7", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.7", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/preset-typescript": "^7.27.1", + "@babel/traverse": "^7.27.7", + "@babel/types": "^7.27.7", + "@npmcli/package-json": "^4.0.1", + "@react-router/node": "7.7.0", + "arg": "^5.0.1", + "babel-dead-code-elimination": "^1.0.6", + "chokidar": "^4.0.0", + "dedent": "^1.5.3", + "es-module-lexer": "^1.3.1", + "exit-hook": "2.2.1", + "isbot": "^5.1.11", + "jsesc": "3.0.2", + "lodash": "^4.17.21", + "pathe": "^1.1.2", + "picocolors": "^1.1.1", + "prettier": "^2.7.1", + "react-refresh": "^0.14.0", + "semver": "^7.3.7", + "set-cookie-parser": "^2.6.0", + "tinyglobby": "^0.2.14", + "valibot": "^0.41.0", + "vite-node": "^3.2.2" + }, + "bin": { + "react-router": "bin.js" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@react-router/serve": "^7.7.0", + "react-router": "^7.7.0", + "typescript": "^5.1.0", + "vite": "^5.1.0 || ^6.0.0 || ^7.0.0", + "wrangler": "^3.28.2 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@react-router/serve": { + "optional": true + }, + "typescript": { + "optional": true + }, + "wrangler": { + "optional": true + } + } + }, + "node_modules/@react-router/dev/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-router/dev/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@react-router/dev/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@react-router/dev/node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@react-router/dev/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-router/express": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@react-router/express/-/express-7.7.0.tgz", + "integrity": "sha512-R86v1qAbj3i/tG00gFM90P3nXR+B66qkp3bbaqm9VnTkbkqUCcHnVaQn64qBOl5g34FdJUMt84UsLS6v2mT/iQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@react-router/node": "7.7.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "express": "^4.17.1 || ^5", + "react-router": "7.7.0", + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@react-router/node": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.7.0.tgz", + "integrity": "sha512-PTl4C+QjWsbTfp+9mybOzIH10ZM/pjZrAlcoxc/KGYxcfWDEe2GDFFBQN6nGZgJe/0SwSjHsVwqo2haMKgTbvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mjackson/node-fetch-server": "^0.2.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react-router": "7.7.0", + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@react-router/serve": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@react-router/serve/-/serve-7.7.0.tgz", + "integrity": "sha512-XvJAY4Sgv7HxdSuLgkBP8bFXxfI97HJSk+p2BisdtK6JT/nSZugEe0gju4xAkgtsncNJJBVndJTcfUtTDNLTUQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@react-router/express": "7.7.0", + "@react-router/node": "7.7.0", + "compression": "^1.7.4", + "express": "^4.19.2", + "get-port": "5.1.1", + "morgan": "^1.10.0", + "source-map-support": "^0.5.21" + }, + "bin": { + "react-router-serve": "bin.js" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react-router": "7.7.0" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.9", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz", @@ -2441,12 +2930,6 @@ "@types/unist": "*" } }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "license": "MIT" - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2522,34 +3005,13 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" + "peerDependencies": { + "@types/react": "^18.0.0" } }, "node_modules/@types/resolve": { @@ -3120,6 +3582,34 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -3192,6 +3682,13 @@ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3225,6 +3722,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/array-includes": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", @@ -3434,6 +3940,19 @@ "node": ">=4" } }, + "node_modules/babel-dead-code-elimination": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.10.tgz", + "integrity": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + } + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -3450,6 +3969,30 @@ "dev": true, "license": "MIT" }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/better-opn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", @@ -3463,6 +4006,54 @@ "node": ">=12.0.0" } }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -3519,6 +4110,27 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -3715,6 +4327,22 @@ "node": ">= 16" } }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/chromatic": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-12.1.0.tgz", @@ -3793,12 +4421,96 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3815,6 +4527,15 @@ "node": ">=18" } }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3952,6 +4673,21 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dedent": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -4015,6 +4751,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -4024,6 +4772,19 @@ "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -4084,6 +4845,15 @@ "dev": true, "license": "MIT" }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/electron-to-chromium": { "version": "1.5.161", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.161.tgz", @@ -4098,6 +4868,25 @@ "dev": true, "license": "MIT" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -4398,6 +5187,15 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4736,6 +5534,18 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -4746,6 +5556,19 @@ "es5-ext": "~0.10.14" } }, + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/expect-type": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", @@ -4756,6 +5579,88 @@ "node": ">=12.0.0" } }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -4869,6 +5774,48 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -4940,6 +5887,30 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5046,6 +6017,21 @@ "node": ">=6" } }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -5326,6 +6312,29 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hosted-git-info": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", + "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -5342,6 +6351,40 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -5427,6 +6470,18 @@ "node": ">= 0.4" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -5921,6 +6976,16 @@ "dev": true, "license": "MIT" }, + "node_modules/isbot": { + "version": "5.1.28", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.28.tgz", + "integrity": "sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=18" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -6054,6 +7119,16 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/json-schema-to-typescript": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-13.1.2.tgz", @@ -6543,6 +7618,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/memoizee": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", @@ -6562,6 +7649,18 @@ "node": ">=0.12" } }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -6572,6 +7671,18 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -7020,6 +8131,60 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -7078,6 +8243,61 @@ "node": ">=10" } }, + "node_modules/morgan": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", + "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.1.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -7131,6 +8351,18 @@ "dev": true, "license": "MIT" }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -7144,6 +8376,129 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", + "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7238,17 +8593,44 @@ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, "node_modules/once": { @@ -7389,6 +8771,18 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7449,6 +8843,15 @@ "dev": true, "license": "ISC" }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -7748,6 +9151,37 @@ "node": ">=6" } }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -7790,6 +9224,22 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -7800,6 +9250,24 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -7821,6 +9289,36 @@ ], "license": "MIT" }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -8000,22 +9498,6 @@ } } }, - "node_modules/react-router-dom": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.7.0.tgz", - "integrity": "sha512-wwGS19VkNBkneVh9/YD0pK3IsjWxQUVMDD6drlG7eJpo1rXBtctBqDyBm/k+oKHRAm1x9XWT3JFC82QI9YOXXA==", - "license": "MIT", - "dependencies": { - "react-router": "7.7.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, "node_modules/react-style-singleton": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", @@ -8055,6 +9537,20 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/recast": { "version": "0.23.11", "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", @@ -8214,6 +9710,16 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -8309,6 +9815,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -8344,6 +9873,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -8363,6 +9901,84 @@ "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", @@ -8418,6 +10034,15 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8579,6 +10204,19 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", @@ -8588,6 +10226,42 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -8595,6 +10269,18 @@ "dev": true, "license": "MIT" }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/std-env": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", @@ -9126,6 +10812,18 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -9248,6 +10946,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -9479,6 +11193,18 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unplugin": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", @@ -9629,6 +11355,66 @@ "dev": true, "license": "MIT" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/valibot": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.41.0.tgz", + "integrity": "sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", diff --git a/desktop/package.json b/desktop/package.json index c6527fa3..a7c195b9 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -26,16 +26,16 @@ "@tauri-apps/plugin-opener": "^2.3.0", "@tauri-apps/plugin-shell": "^2.2.2", "@types/prismjs": "^1.26.5", - "@types/react-router-dom": "^5.3.3", "prismjs": "^1.30.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^10.1.0", - "react-router-dom": "^7.7.0" + "react-router": "^7.7.0" }, "devDependencies": { "@chromatic-com/storybook": "^4.0.0", "@eslint/js": "^9.28.0", + "@react-router/dev": "^7.7.0", "@storybook/addon-a11y": "^9.0.4", "@storybook/addon-docs": "^9.0.4", "@storybook/addon-onboarding": "^9.0.4", @@ -61,7 +61,7 @@ "tsx": "^4.7.1", "typescript": "~5.6.2", "typescript-eslint": "^8.34.0", - "vite": "^6.0.3", + "vite": "^6.3.5", "vitest": "^3.2.1" } } diff --git a/desktop/src/App.tsx b/desktop/src/App.tsx index 994dd9f6..73f7d762 100644 --- a/desktop/src/App.tsx +++ b/desktop/src/App.tsx @@ -1,6 +1,7 @@ import "@mantine/core/styles.css"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import {createHashRouter, Navigate, RouterProvider} from "react-router-dom"; +import {createHashRouter, Navigate} from "react-router"; +import {RouterProvider} from "react-router/dom"; import "./App.css"; import { ThemeProvider } from "./theme/ThemeProvider"; import { AppProvider } from "./hooks/useAppContext.tsx"; diff --git a/desktop/src/layout/AppShell/AppShell.tsx b/desktop/src/layout/AppShell/AppShell.tsx index d0f4e3e4..702061f8 100644 --- a/desktop/src/layout/AppShell/AppShell.tsx +++ b/desktop/src/layout/AppShell/AppShell.tsx @@ -11,7 +11,7 @@ import { Sidebar } from "../Sidebar/Sidebar"; import styles from "./AppShell.module.css"; import {useAppContext} from "../../hooks/useAppContext.tsx"; import {useNotifier} from "../../hooks/useNotifier.tsx"; -import {Outlet, useLocation} from "react-router-dom"; +import {Outlet, useLocation} from "react-router"; export function AppShell() { const { isLoading, hasError } = useAppContext(); diff --git a/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx b/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx index cdcf5c9a..c7233dec 100644 --- a/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx +++ b/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx @@ -38,7 +38,7 @@ import { ValidationVerbType, } from "../../../types/executable"; import {useAppContext} from "../../../hooks/useAppContext.tsx"; -import {Link} from "react-router-dom"; +import {Link} from "react-router"; interface CustomTreeNodeData extends TreeNodeData { isNamespace: boolean; diff --git a/desktop/src/layout/Sidebar/Sidebar.tsx b/desktop/src/layout/Sidebar/Sidebar.tsx index d748b925..903aae64 100644 --- a/desktop/src/layout/Sidebar/Sidebar.tsx +++ b/desktop/src/layout/Sidebar/Sidebar.tsx @@ -1,15 +1,16 @@ -import { Group, Image, NavLink, Stack } from "@mantine/core"; +import {Button, Group, Image, NavLink, Stack} from "@mantine/core"; import { ExecutableTree } from "./ExecutableTree/ExecutableTree"; import styles from "./Sidebar.module.css"; import { WorkspaceSelector } from "./WorkspaceSelector/WorkspaceSelector"; import iconImage from "/logo-dark.png"; import {IconDatabase, IconFolders, IconLogs, IconSettings} from "@tabler/icons-react"; -import {Link, useLocation} from "react-router-dom"; +import {Link, NavLink as RouterNavLink, useLocation, useNavigate} from "react-router"; import {useAppContext} from "../../hooks/useAppContext.tsx"; export function Sidebar() { const location = useLocation(); const { executables, selectedWorkspace } = useAppContext() + const navigate = useNavigate(); return (
@@ -24,10 +25,20 @@ export function Sidebar() { + } - component={Link} + component={RouterNavLink} to={`/workspace/${selectedWorkspace}`} active={location.pathname.startsWith('/workspace')} variant="filled" @@ -35,7 +46,7 @@ export function Sidebar() { } - component={Link} + component={RouterNavLink} to={`/logs`} active={location.pathname.startsWith('/logs')} variant="filled" @@ -46,13 +57,13 @@ export function Sidebar() { variant="filled" childrenOffset={28} > - - + + } - component={Link} + component={RouterNavLink} to={`/settings`} active={location.pathname.startsWith('/settings')} variant="filled" diff --git a/desktop/src/pages/Executable/ExecutableRoute.tsx b/desktop/src/pages/Executable/ExecutableRoute.tsx index dd410c0e..a82cd0ac 100644 --- a/desktop/src/pages/Executable/ExecutableRoute.tsx +++ b/desktop/src/pages/Executable/ExecutableRoute.tsx @@ -1,5 +1,5 @@ import { Text, LoadingOverlay } from "@mantine/core"; -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import { useExecutable } from "../../hooks/useExecutable"; import { PageWrapper } from "../../components/PageWrapper.tsx"; import { Welcome } from "../Welcome/Welcome"; diff --git a/desktop/src/pages/Workspace/WorkspaceRoute.tsx b/desktop/src/pages/Workspace/WorkspaceRoute.tsx index 3123f975..8b3240d9 100644 --- a/desktop/src/pages/Workspace/WorkspaceRoute.tsx +++ b/desktop/src/pages/Workspace/WorkspaceRoute.tsx @@ -1,4 +1,4 @@ -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import { useWorkspace } from "../../hooks/useWorkspace"; import { LoadingOverlay, Text } from "@mantine/core"; import { PageWrapper } from "../../components/PageWrapper.tsx"; diff --git a/desktop/vite.config.ts b/desktop/vite.config.ts index f74d1b2d..a6833d70 100644 --- a/desktop/vite.config.ts +++ b/desktop/vite.config.ts @@ -1,12 +1,13 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; +import { reactRouter } from "@react-router/dev/vite"; // @ts-expect-error process is a nodejs global const host = process.env.TAURI_DEV_HOST; // https://vitejs.dev/config/ export default defineConfig(async () => ({ - plugins: [react()], + plugins: [react(), reactRouter()], // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` // From 63fb930f9c450b7bac886b248510e53a2e1a85d6 Mon Sep 17 00:00:00 2001 From: Jahvon Dockery Date: Wed, 20 Aug 2025 21:06:38 -0400 Subject: [PATCH 3/6] fix vite config --- desktop/vite.config.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/desktop/vite.config.ts b/desktop/vite.config.ts index a6833d70..f74d1b2d 100644 --- a/desktop/vite.config.ts +++ b/desktop/vite.config.ts @@ -1,13 +1,12 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; -import { reactRouter } from "@react-router/dev/vite"; // @ts-expect-error process is a nodejs global const host = process.env.TAURI_DEV_HOST; // https://vitejs.dev/config/ export default defineConfig(async () => ({ - plugins: [react(), reactRouter()], + plugins: [react()], // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` // From 5fce5f2b9da3801aece291086afe2f68b87296cc Mon Sep 17 00:00:00 2001 From: Jahvon Dockery Date: Thu, 21 Aug 2025 13:44:07 -0400 Subject: [PATCH 4/6] wip --- desktop/.react-router/types/+future.ts | 9 ++ desktop/.react-router/types/+routes.ts | 27 ++++ .../.react-router/types/+server-build.d.ts | 17 +++ .../.react-router/types/src/+types/root.ts | 59 +++++++++ .../types/src/pages/Welcome/+types/Welcome.ts | 62 +++++++++ desktop/index.html | 2 +- desktop/package-lock.json | 7 +- desktop/package.json | 2 + desktop/react-router.config.ts | 6 + desktop/src/App.tsx | 122 +++++++++--------- desktop/src/layout/AppShell/AppShell.tsx | 6 +- desktop/src/layout/Layout.tsx | 16 +++ desktop/src/layout/Sidebar/Sidebar.tsx | 9 +- .../src/pages/Executable/ExecutableRoute.tsx | 1 + .../src/pages/Workspace/WorkspaceRoute.tsx | 1 + desktop/src/{main.tsx => root.tsx} | 5 +- desktop/src/routes.ts | 3 + desktop/src/routes/home.tsx | 11 ++ desktop/src/theme/HeadScripts.tsx | 21 +++ desktop/src/theme/ThemeProvider.tsx | 2 +- desktop/vite.config.ts | 4 +- 21 files changed, 314 insertions(+), 78 deletions(-) create mode 100644 desktop/.react-router/types/+future.ts create mode 100644 desktop/.react-router/types/+routes.ts create mode 100644 desktop/.react-router/types/+server-build.d.ts create mode 100644 desktop/.react-router/types/src/+types/root.ts create mode 100644 desktop/.react-router/types/src/pages/Welcome/+types/Welcome.ts create mode 100644 desktop/react-router.config.ts create mode 100644 desktop/src/layout/Layout.tsx rename desktop/src/{main.tsx => root.tsx} (65%) create mode 100644 desktop/src/routes.ts create mode 100644 desktop/src/routes/home.tsx create mode 100644 desktop/src/theme/HeadScripts.tsx diff --git a/desktop/.react-router/types/+future.ts b/desktop/.react-router/types/+future.ts new file mode 100644 index 00000000..8ed2f6a6 --- /dev/null +++ b/desktop/.react-router/types/+future.ts @@ -0,0 +1,9 @@ +// Generated by React Router + +import "react-router"; + +declare module "react-router" { + interface Future { + unstable_middleware: false + } +} \ No newline at end of file diff --git a/desktop/.react-router/types/+routes.ts b/desktop/.react-router/types/+routes.ts new file mode 100644 index 00000000..2e834cbc --- /dev/null +++ b/desktop/.react-router/types/+routes.ts @@ -0,0 +1,27 @@ +// Generated by React Router + +import "react-router" + +declare module "react-router" { + interface Register { + pages: Pages + routeFiles: RouteFiles + } +} + +type Pages = { + "/": { + params: {}; + }; +}; + +type RouteFiles = { + "root.tsx": { + id: "root"; + page: "/"; + }; + "pages/Welcome/Welcome.tsx": { + id: "pages/Welcome/Welcome"; + page: "/"; + }; +}; \ No newline at end of file diff --git a/desktop/.react-router/types/+server-build.d.ts b/desktop/.react-router/types/+server-build.d.ts new file mode 100644 index 00000000..b4b42373 --- /dev/null +++ b/desktop/.react-router/types/+server-build.d.ts @@ -0,0 +1,17 @@ +// Generated by React Router + +declare module "virtual:react-router/server-build" { + import { ServerBuild } from "react-router"; + export const assets: ServerBuild["assets"]; + export const assetsBuildDirectory: ServerBuild["assetsBuildDirectory"]; + export const basename: ServerBuild["basename"]; + export const entry: ServerBuild["entry"]; + export const future: ServerBuild["future"]; + export const isSpaMode: ServerBuild["isSpaMode"]; + export const prerender: ServerBuild["prerender"]; + export const publicPath: ServerBuild["publicPath"]; + export const routeDiscovery: ServerBuild["routeDiscovery"]; + export const routes: ServerBuild["routes"]; + export const ssr: ServerBuild["ssr"]; + export const unstable_getCriticalCss: ServerBuild["unstable_getCriticalCss"]; +} \ No newline at end of file diff --git a/desktop/.react-router/types/src/+types/root.ts b/desktop/.react-router/types/src/+types/root.ts new file mode 100644 index 00000000..e4451139 --- /dev/null +++ b/desktop/.react-router/types/src/+types/root.ts @@ -0,0 +1,59 @@ +// Generated by React Router + +import type { GetInfo, GetAnnotations } from "react-router/internal"; + +type Module = typeof import("../root.js") + +type Info = GetInfo<{ + file: "root.tsx", + module: Module +}> + +type Matches = [{ + id: "root"; + module: typeof import("../root.js"); +}]; + +type Annotations = GetAnnotations; + +export namespace Route { + // links + export type LinkDescriptors = Annotations["LinkDescriptors"]; + export type LinksFunction = Annotations["LinksFunction"]; + + // meta + export type MetaArgs = Annotations["MetaArgs"]; + export type MetaDescriptors = Annotations["MetaDescriptors"]; + export type MetaFunction = Annotations["MetaFunction"]; + + // headers + export type HeadersArgs = Annotations["HeadersArgs"]; + export type HeadersFunction = Annotations["HeadersFunction"]; + + // unstable_middleware + export type unstable_MiddlewareFunction = Annotations["unstable_MiddlewareFunction"]; + + // unstable_clientMiddleware + export type unstable_ClientMiddlewareFunction = Annotations["unstable_ClientMiddlewareFunction"]; + + // loader + export type LoaderArgs = Annotations["LoaderArgs"]; + + // clientLoader + export type ClientLoaderArgs = Annotations["ClientLoaderArgs"]; + + // action + export type ActionArgs = Annotations["ActionArgs"]; + + // clientAction + export type ClientActionArgs = Annotations["ClientActionArgs"]; + + // HydrateFallback + export type HydrateFallbackProps = Annotations["HydrateFallbackProps"]; + + // Component + export type ComponentProps = Annotations["ComponentProps"]; + + // ErrorBoundary + export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"]; +} \ No newline at end of file diff --git a/desktop/.react-router/types/src/pages/Welcome/+types/Welcome.ts b/desktop/.react-router/types/src/pages/Welcome/+types/Welcome.ts new file mode 100644 index 00000000..23a814d3 --- /dev/null +++ b/desktop/.react-router/types/src/pages/Welcome/+types/Welcome.ts @@ -0,0 +1,62 @@ +// Generated by React Router + +import type { GetInfo, GetAnnotations } from "react-router/internal"; + +type Module = typeof import("../Welcome.js") + +type Info = GetInfo<{ + file: "pages/Welcome/Welcome.tsx", + module: Module +}> + +type Matches = [{ + id: "root"; + module: typeof import("../../../root.js"); +}, { + id: "pages/Welcome/Welcome"; + module: typeof import("../Welcome.js"); +}]; + +type Annotations = GetAnnotations; + +export namespace Route { + // links + export type LinkDescriptors = Annotations["LinkDescriptors"]; + export type LinksFunction = Annotations["LinksFunction"]; + + // meta + export type MetaArgs = Annotations["MetaArgs"]; + export type MetaDescriptors = Annotations["MetaDescriptors"]; + export type MetaFunction = Annotations["MetaFunction"]; + + // headers + export type HeadersArgs = Annotations["HeadersArgs"]; + export type HeadersFunction = Annotations["HeadersFunction"]; + + // unstable_middleware + export type unstable_MiddlewareFunction = Annotations["unstable_MiddlewareFunction"]; + + // unstable_clientMiddleware + export type unstable_ClientMiddlewareFunction = Annotations["unstable_ClientMiddlewareFunction"]; + + // loader + export type LoaderArgs = Annotations["LoaderArgs"]; + + // clientLoader + export type ClientLoaderArgs = Annotations["ClientLoaderArgs"]; + + // action + export type ActionArgs = Annotations["ActionArgs"]; + + // clientAction + export type ClientActionArgs = Annotations["ClientActionArgs"]; + + // HydrateFallback + export type HydrateFallbackProps = Annotations["HydrateFallbackProps"]; + + // Component + export type ComponentProps = Annotations["ComponentProps"]; + + // ErrorBoundary + export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"]; +} \ No newline at end of file diff --git a/desktop/index.html b/desktop/index.html index f1d566b4..a8f9c0d6 100644 --- a/desktop/index.html +++ b/desktop/index.html @@ -8,6 +8,6 @@
- + diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 9cad5c3f..26549665 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@mantine/core": "^8.0.2", "@mantine/hooks": "^8.0.2", + "@react-router/node": "^7.7.0", "@tabler/icons-react": "^3.34.0", "@tanstack/react-query": "^5.80.7", "@tauri-apps/api": "^2", @@ -17,6 +18,7 @@ "@tauri-apps/plugin-opener": "^2.3.0", "@tauri-apps/plugin-shell": "^2.2.2", "@types/prismjs": "^1.26.5", + "isbot": "^5", "prismjs": "^1.30.0", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -1490,7 +1492,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/@mjackson/node-fetch-server/-/node-fetch-server-0.2.0.tgz", "integrity": "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==", - "dev": true, "license": "MIT" }, "node_modules/@neoconfetti/react": { @@ -1824,7 +1825,6 @@ "version": "7.7.0", "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.7.0.tgz", "integrity": "sha512-PTl4C+QjWsbTfp+9mybOzIH10ZM/pjZrAlcoxc/KGYxcfWDEe2GDFFBQN6nGZgJe/0SwSjHsVwqo2haMKgTbvQ==", - "dev": true, "license": "MIT", "dependencies": { "@mjackson/node-fetch-server": "^0.2.0" @@ -6980,7 +6980,6 @@ "version": "5.1.28", "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.28.tgz", "integrity": "sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==", - "dev": true, "license": "Unlicense", "engines": { "node": ">=18" @@ -11044,7 +11043,7 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", diff --git a/desktop/package.json b/desktop/package.json index 57fa96f1..caca7f0e 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -18,6 +18,7 @@ "dependencies": { "@mantine/core": "^8.0.2", "@mantine/hooks": "^8.0.2", + "@react-router/node": "^7.7.0", "@tabler/icons-react": "^3.34.0", "@tanstack/react-query": "^5.80.7", "@tauri-apps/api": "^2", @@ -25,6 +26,7 @@ "@tauri-apps/plugin-opener": "^2.3.0", "@tauri-apps/plugin-shell": "^2.2.2", "@types/prismjs": "^1.26.5", + "isbot": "^5", "prismjs": "^1.30.0", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/desktop/react-router.config.ts b/desktop/react-router.config.ts new file mode 100644 index 00000000..436538a5 --- /dev/null +++ b/desktop/react-router.config.ts @@ -0,0 +1,6 @@ +import type { Config } from "@react-router/dev/config"; + +export default { + ssr: false, + appDirectory: "src", +} satisfies Config; \ No newline at end of file diff --git a/desktop/src/App.tsx b/desktop/src/App.tsx index 73f7d762..834d86a9 100644 --- a/desktop/src/App.tsx +++ b/desktop/src/App.tsx @@ -1,18 +1,14 @@ -import "@mantine/core/styles.css"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import {createHashRouter, Navigate} from "react-router"; -import {RouterProvider} from "react-router/dom"; +import { createHashRouter, Navigate, RouterProvider } from "react-router"; import "./App.css"; -import { ThemeProvider } from "./theme/ThemeProvider"; import { AppProvider } from "./hooks/useAppContext.tsx"; import { NotifierProvider } from "./hooks/useNotifier"; -import { SettingsProvider } from "./hooks/useSettings"; -import {AppShell} from "./layout"; -import {PageWrapper} from "./components/PageWrapper.tsx"; -import {Settings, Welcome, Data} from "./pages"; -import {WorkspaceRoute} from "./pages/Workspace/WorkspaceRoute.tsx"; -import {ExecutableRoute} from "./pages/Executable/ExecutableRoute.tsx"; -import {Text} from "@mantine/core"; +import { AppShell } from "./layout"; +import { PageWrapper } from "./components/PageWrapper.tsx"; +import { Settings, Welcome, Data } from "./pages"; +import { WorkspaceRoute } from "./pages/Workspace/WorkspaceRoute.tsx"; +import { ExecutableRoute } from "./pages/Executable/ExecutableRoute.tsx"; +import { Text } from "@mantine/core"; const queryClient = new QueryClient({ defaultOptions: { @@ -23,66 +19,68 @@ const queryClient = new QueryClient({ }, }); - const router = createHashRouter([ { - path: "/", - element: ( - - - - - - - - - - - - ), + element: , children: [ { - index: true, - element: ( - - - - ), - }, - { - path: "workspace/:workspaceName", - element: , - }, - { - path: "executable/:executableId", - element: , - }, - { - path: "logs", - element: Logs view coming soon..., - }, - { - path: "vault", - element: , - }, - { - path: "cache", - element: , - }, - { - path: "settings", - element: , - }, - { - path: "*", - element: , + path: "/", + children: [ + { + index: true, + element: ( + + + + ), + }, + { + path: "workspace/:workspaceName", + element: , + }, + { + path: "executable/:executableId", + element: , + }, + { + path: "logs", + element: ( + + Logs view coming soon... + + ), + }, + { + path: "vault", + element: , + }, + { + path: "cache", + element: , + }, + { + path: "settings", + element: , + }, + { + path: "*", + element: , + }, + ], }, ], }, ]); function App() { - return - + return ( + + + + + + + + ); } export default App; diff --git a/desktop/src/layout/AppShell/AppShell.tsx b/desktop/src/layout/AppShell/AppShell.tsx index 702061f8..29c4f290 100644 --- a/desktop/src/layout/AppShell/AppShell.tsx +++ b/desktop/src/layout/AppShell/AppShell.tsx @@ -11,12 +11,11 @@ import { Sidebar } from "../Sidebar/Sidebar"; import styles from "./AppShell.module.css"; import {useAppContext} from "../../hooks/useAppContext.tsx"; import {useNotifier} from "../../hooks/useNotifier.tsx"; -import {Outlet, useLocation} from "react-router"; +import {Outlet, ScrollRestoration} from "react-router"; export function AppShell() { const { isLoading, hasError } = useAppContext(); const { notification, setNotification } = useNotifier(); - const location = useLocation(); useEffect(() => { if (hasError) { @@ -66,7 +65,8 @@ export function AppShell() {
) : (
- + + {isLoading && (
+ + + {children} + + + ); +} + diff --git a/desktop/src/layout/Sidebar/Sidebar.tsx b/desktop/src/layout/Sidebar/Sidebar.tsx index 903aae64..c19fef9a 100644 --- a/desktop/src/layout/Sidebar/Sidebar.tsx +++ b/desktop/src/layout/Sidebar/Sidebar.tsx @@ -35,14 +35,15 @@ export function Sidebar() { } }}>Testing - + } - component={RouterNavLink} - to={`/workspace/${selectedWorkspace}`} active={location.pathname.startsWith('/workspace')} variant="filled" - /> + /> + } diff --git a/desktop/src/pages/Executable/ExecutableRoute.tsx b/desktop/src/pages/Executable/ExecutableRoute.tsx index a82cd0ac..5a162a00 100644 --- a/desktop/src/pages/Executable/ExecutableRoute.tsx +++ b/desktop/src/pages/Executable/ExecutableRoute.tsx @@ -7,6 +7,7 @@ import { Executable } from "./Executable"; export function ExecutableRoute() { const { executableId } = useParams(); + console.log('ExecutableRoute params:', { executableId }); const { executable, executableError, isExecutableLoading } = useExecutable(executableId || ""); return ( diff --git a/desktop/src/pages/Workspace/WorkspaceRoute.tsx b/desktop/src/pages/Workspace/WorkspaceRoute.tsx index 8b3240d9..39db81e9 100644 --- a/desktop/src/pages/Workspace/WorkspaceRoute.tsx +++ b/desktop/src/pages/Workspace/WorkspaceRoute.tsx @@ -7,6 +7,7 @@ import { Welcome } from "../Welcome/Welcome"; export function WorkspaceRoute() { const { workspaceName } = useParams(); + console.log('WorkspaceRoute params:', { workspaceName }); const { workspace, workspaceError, isWorkspaceLoading } = useWorkspace(workspaceName || ""); return ( diff --git a/desktop/src/main.tsx b/desktop/src/root.tsx similarity index 65% rename from desktop/src/main.tsx rename to desktop/src/root.tsx index eb9d142b..11dd723e 100644 --- a/desktop/src/main.tsx +++ b/desktop/src/root.tsx @@ -1,6 +1,9 @@ import ReactDOM from "react-dom/client"; import App from "./App"; +import { Layout } from "./layout/Layout"; ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - + + + ); diff --git a/desktop/src/routes.ts b/desktop/src/routes.ts new file mode 100644 index 00000000..3f117599 --- /dev/null +++ b/desktop/src/routes.ts @@ -0,0 +1,3 @@ +import { type RouteConfig, index } from "@react-router/dev/routes"; + +export default [index("pages/Welcome/Welcome.tsx")] satisfies RouteConfig; \ No newline at end of file diff --git a/desktop/src/routes/home.tsx b/desktop/src/routes/home.tsx new file mode 100644 index 00000000..16c08389 --- /dev/null +++ b/desktop/src/routes/home.tsx @@ -0,0 +1,11 @@ + +export function meta({}: Route.MetaArgs) { + return [ + { title: "New React Router App" }, + { name: "description", content: "Welcome to React Router!" }, + ]; +} + +export default function Home() { + return ; +} \ No newline at end of file diff --git a/desktop/src/theme/HeadScripts.tsx b/desktop/src/theme/HeadScripts.tsx new file mode 100644 index 00000000..c669f0bf --- /dev/null +++ b/desktop/src/theme/HeadScripts.tsx @@ -0,0 +1,21 @@ +import { ColorSchemeScript } from "@mantine/core"; +import { createPortal } from "react-dom"; +import { useEffect, useState } from "react"; + +export function HeadScripts() { + const [head, setHead] = useState(null); + + useEffect(() => { + setHead(document.head); + }, []); + + if (!head) return null; + + return createPortal( + <> + + , + head + ); +} + diff --git a/desktop/src/theme/ThemeProvider.tsx b/desktop/src/theme/ThemeProvider.tsx index 10958308..6e1eeb9c 100644 --- a/desktop/src/theme/ThemeProvider.tsx +++ b/desktop/src/theme/ThemeProvider.tsx @@ -96,7 +96,7 @@ export function ThemeProvider({ children }: ThemeProviderProps) { }, }); - return ( +return ( {children} diff --git a/desktop/vite.config.ts b/desktop/vite.config.ts index f74d1b2d..a3124312 100644 --- a/desktop/vite.config.ts +++ b/desktop/vite.config.ts @@ -1,12 +1,12 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; +import { reactRouter } from "@react-router/dev/vite"; -// @ts-expect-error process is a nodejs global const host = process.env.TAURI_DEV_HOST; // https://vitejs.dev/config/ export default defineConfig(async () => ({ - plugins: [react()], + plugins: [reactRouter(), react()], // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` // From 166bb97d9afa501089a9ab9ae5ce529323673328 Mon Sep 17 00:00:00 2001 From: Jahvon Dockery Date: Wed, 10 Sep 2025 15:45:23 -0400 Subject: [PATCH 5/6] switch to wouter --- desktop/.react-router/types/+future.ts | 9 - desktop/.react-router/types/+routes.ts | 27 - .../.react-router/types/+server-build.d.ts | 17 - .../.react-router/types/src/+types/root.ts | 59 - .../types/src/pages/Welcome/+types/Welcome.ts | 62 - desktop/package-lock.json | 2058 +---------------- desktop/package.json | 13 +- desktop/react-router.config.ts | 6 - desktop/src/App.tsx | 86 +- .../CodeHighlighter.stories.tsx | 4 +- .../CodeHighlighter/CodeHighlighter.tsx | 1 + .../MarkdownRenderer/MarkdownRenderer.tsx | 6 +- desktop/src/components/PageWrapper.tsx | 30 +- desktop/src/components/Settings.tsx | 25 +- desktop/src/hooks/useAppContext.tsx | 237 +- desktop/src/hooks/useConfig.ts | 156 +- desktop/src/hooks/useExecutable.ts | 139 +- desktop/src/hooks/useSettings.tsx | 2 +- desktop/src/hooks/useWorkspace.ts | 110 +- desktop/src/layout/AppShell/AppShell.tsx | 18 +- .../ActionButtons/ActionButtons.stories.tsx | 18 +- .../Header/ActionButtons/ActionButtons.tsx | 9 +- desktop/src/layout/Header/Header.stories.tsx | 22 +- desktop/src/layout/Header/Header.tsx | 8 +- desktop/src/layout/Layout.tsx | 1 - .../Sidebar/ExecutableTree/ExecutableTree.tsx | 134 +- desktop/src/layout/Sidebar/Sidebar.tsx | 120 +- .../WorkspaceSelector/WorkspaceSelector.tsx | 18 +- desktop/src/pages/Data/Data.tsx | 30 +- desktop/src/pages/Executable/Executable.tsx | 12 +- .../ExecutableEnvironmentDetails.tsx | 2 +- .../src/pages/Executable/ExecutableRoute.tsx | 41 +- .../src/pages/Executable/ExecutionForm.tsx | 5 +- .../types/ExecutableRequestDetails.tsx | 2 +- desktop/src/pages/Settings/Settings.tsx | 241 +- desktop/src/pages/Workspace/Workspace.tsx | 4 +- .../src/pages/Workspace/WorkspaceRoute.tsx | 39 +- desktop/src/pages/index.ts | 2 +- desktop/src/root.tsx | 2 +- desktop/src/routes.ts | 3 - desktop/src/routes/home.tsx | 11 - desktop/src/theme/HeadScripts.tsx | 3 +- desktop/src/theme/ThemeProvider.tsx | 2 +- desktop/src/types/generated/config.ts | 10 +- desktop/src/types/generated/flowfile.ts | 260 +-- desktop/src/types/generated/template.ts | 2 +- desktop/vite.config.ts | 3 +- 47 files changed, 1039 insertions(+), 3030 deletions(-) delete mode 100644 desktop/.react-router/types/+future.ts delete mode 100644 desktop/.react-router/types/+routes.ts delete mode 100644 desktop/.react-router/types/+server-build.d.ts delete mode 100644 desktop/.react-router/types/src/+types/root.ts delete mode 100644 desktop/.react-router/types/src/pages/Welcome/+types/Welcome.ts delete mode 100644 desktop/react-router.config.ts delete mode 100644 desktop/src/routes.ts delete mode 100644 desktop/src/routes/home.tsx diff --git a/desktop/.react-router/types/+future.ts b/desktop/.react-router/types/+future.ts deleted file mode 100644 index 8ed2f6a6..00000000 --- a/desktop/.react-router/types/+future.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Generated by React Router - -import "react-router"; - -declare module "react-router" { - interface Future { - unstable_middleware: false - } -} \ No newline at end of file diff --git a/desktop/.react-router/types/+routes.ts b/desktop/.react-router/types/+routes.ts deleted file mode 100644 index 2e834cbc..00000000 --- a/desktop/.react-router/types/+routes.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Generated by React Router - -import "react-router" - -declare module "react-router" { - interface Register { - pages: Pages - routeFiles: RouteFiles - } -} - -type Pages = { - "/": { - params: {}; - }; -}; - -type RouteFiles = { - "root.tsx": { - id: "root"; - page: "/"; - }; - "pages/Welcome/Welcome.tsx": { - id: "pages/Welcome/Welcome"; - page: "/"; - }; -}; \ No newline at end of file diff --git a/desktop/.react-router/types/+server-build.d.ts b/desktop/.react-router/types/+server-build.d.ts deleted file mode 100644 index b4b42373..00000000 --- a/desktop/.react-router/types/+server-build.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Generated by React Router - -declare module "virtual:react-router/server-build" { - import { ServerBuild } from "react-router"; - export const assets: ServerBuild["assets"]; - export const assetsBuildDirectory: ServerBuild["assetsBuildDirectory"]; - export const basename: ServerBuild["basename"]; - export const entry: ServerBuild["entry"]; - export const future: ServerBuild["future"]; - export const isSpaMode: ServerBuild["isSpaMode"]; - export const prerender: ServerBuild["prerender"]; - export const publicPath: ServerBuild["publicPath"]; - export const routeDiscovery: ServerBuild["routeDiscovery"]; - export const routes: ServerBuild["routes"]; - export const ssr: ServerBuild["ssr"]; - export const unstable_getCriticalCss: ServerBuild["unstable_getCriticalCss"]; -} \ No newline at end of file diff --git a/desktop/.react-router/types/src/+types/root.ts b/desktop/.react-router/types/src/+types/root.ts deleted file mode 100644 index e4451139..00000000 --- a/desktop/.react-router/types/src/+types/root.ts +++ /dev/null @@ -1,59 +0,0 @@ -// Generated by React Router - -import type { GetInfo, GetAnnotations } from "react-router/internal"; - -type Module = typeof import("../root.js") - -type Info = GetInfo<{ - file: "root.tsx", - module: Module -}> - -type Matches = [{ - id: "root"; - module: typeof import("../root.js"); -}]; - -type Annotations = GetAnnotations; - -export namespace Route { - // links - export type LinkDescriptors = Annotations["LinkDescriptors"]; - export type LinksFunction = Annotations["LinksFunction"]; - - // meta - export type MetaArgs = Annotations["MetaArgs"]; - export type MetaDescriptors = Annotations["MetaDescriptors"]; - export type MetaFunction = Annotations["MetaFunction"]; - - // headers - export type HeadersArgs = Annotations["HeadersArgs"]; - export type HeadersFunction = Annotations["HeadersFunction"]; - - // unstable_middleware - export type unstable_MiddlewareFunction = Annotations["unstable_MiddlewareFunction"]; - - // unstable_clientMiddleware - export type unstable_ClientMiddlewareFunction = Annotations["unstable_ClientMiddlewareFunction"]; - - // loader - export type LoaderArgs = Annotations["LoaderArgs"]; - - // clientLoader - export type ClientLoaderArgs = Annotations["ClientLoaderArgs"]; - - // action - export type ActionArgs = Annotations["ActionArgs"]; - - // clientAction - export type ClientActionArgs = Annotations["ClientActionArgs"]; - - // HydrateFallback - export type HydrateFallbackProps = Annotations["HydrateFallbackProps"]; - - // Component - export type ComponentProps = Annotations["ComponentProps"]; - - // ErrorBoundary - export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"]; -} \ No newline at end of file diff --git a/desktop/.react-router/types/src/pages/Welcome/+types/Welcome.ts b/desktop/.react-router/types/src/pages/Welcome/+types/Welcome.ts deleted file mode 100644 index 23a814d3..00000000 --- a/desktop/.react-router/types/src/pages/Welcome/+types/Welcome.ts +++ /dev/null @@ -1,62 +0,0 @@ -// Generated by React Router - -import type { GetInfo, GetAnnotations } from "react-router/internal"; - -type Module = typeof import("../Welcome.js") - -type Info = GetInfo<{ - file: "pages/Welcome/Welcome.tsx", - module: Module -}> - -type Matches = [{ - id: "root"; - module: typeof import("../../../root.js"); -}, { - id: "pages/Welcome/Welcome"; - module: typeof import("../Welcome.js"); -}]; - -type Annotations = GetAnnotations; - -export namespace Route { - // links - export type LinkDescriptors = Annotations["LinkDescriptors"]; - export type LinksFunction = Annotations["LinksFunction"]; - - // meta - export type MetaArgs = Annotations["MetaArgs"]; - export type MetaDescriptors = Annotations["MetaDescriptors"]; - export type MetaFunction = Annotations["MetaFunction"]; - - // headers - export type HeadersArgs = Annotations["HeadersArgs"]; - export type HeadersFunction = Annotations["HeadersFunction"]; - - // unstable_middleware - export type unstable_MiddlewareFunction = Annotations["unstable_MiddlewareFunction"]; - - // unstable_clientMiddleware - export type unstable_ClientMiddlewareFunction = Annotations["unstable_ClientMiddlewareFunction"]; - - // loader - export type LoaderArgs = Annotations["LoaderArgs"]; - - // clientLoader - export type ClientLoaderArgs = Annotations["ClientLoaderArgs"]; - - // action - export type ActionArgs = Annotations["ActionArgs"]; - - // clientAction - export type ClientActionArgs = Annotations["ClientActionArgs"]; - - // HydrateFallback - export type HydrateFallbackProps = Annotations["HydrateFallbackProps"]; - - // Component - export type ComponentProps = Annotations["ComponentProps"]; - - // ErrorBoundary - export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"]; -} \ No newline at end of file diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 63d2f74e..e268d5df 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -10,7 +10,6 @@ "dependencies": { "@mantine/core": "^8.0.2", "@mantine/hooks": "^8.0.2", - "@react-router/node": "^7.7.0", "@tabler/icons-react": "^3.34.0", "@tanstack/react-query": "^5.80.7", "@tauri-apps/api": "^2", @@ -18,17 +17,15 @@ "@tauri-apps/plugin-opener": "^2.3.0", "@tauri-apps/plugin-shell": "^2.2.2", "@types/prismjs": "^1.26.5", - "isbot": "^5", "prismjs": "^1.30.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-markdown": "^10.1.0", - "react-router": "^7.7.0" + "wouter": "^3.7.1" }, "devDependencies": { "@chromatic-com/storybook": "^4.0.0", "@eslint/js": "^9.28.0", - "@react-router/dev": "^7.7.0", "@storybook/addon-a11y": "^9.0.4", "@storybook/addon-docs": "^9.0.4", "@storybook/addon-onboarding": "^9.0.4", @@ -36,8 +33,8 @@ "@storybook/react-vite": "^9.0.4", "@tauri-apps/cli": "^2", "@types/node": "^20.11.24", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.1", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.0", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^3.2.1", "@vitest/coverage-v8": "^3.2.1", @@ -152,19 +149,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", @@ -182,28 +166,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -214,20 +176,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", @@ -260,19 +208,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", @@ -283,38 +218,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -375,55 +278,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", @@ -456,46 +310,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.27.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.4.tgz", @@ -1230,22 +1044,22 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz", - "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.9" + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz", - "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.1", - "@floating-ui/utils": "^0.2.9" + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/react": { @@ -1264,12 +1078,12 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.3.tgz", - "integrity": "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.0.0" + "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", @@ -1277,9 +1091,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, "node_modules/@humanfs/core": { @@ -1488,12 +1302,6 @@ "react": ">=16" } }, - "node_modules/@mjackson/node-fetch-server": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@mjackson/node-fetch-server/-/node-fetch-server-0.2.0.tgz", - "integrity": "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==", - "license": "MIT" - }, "node_modules/@neoconfetti/react": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@neoconfetti/react/-/react-1.0.0.tgz", @@ -1539,126 +1347,6 @@ "node": ">= 8" } }, - "node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.1.0", - "glob": "^10.2.2", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "proc-log": "^3.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "license": "ISC", - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1677,198 +1365,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@react-router/dev": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.7.0.tgz", - "integrity": "sha512-z6tJ0US20pS/YpaPz59SJgSH+1BJ6xvQmQ/u4Y4HM1uLOa4b3Mleg3KujqAvwGP5wkMkNFz3Ae2g6/kDTFyuCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.7", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/preset-typescript": "^7.27.1", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", - "@npmcli/package-json": "^4.0.1", - "@react-router/node": "7.7.0", - "arg": "^5.0.1", - "babel-dead-code-elimination": "^1.0.6", - "chokidar": "^4.0.0", - "dedent": "^1.5.3", - "es-module-lexer": "^1.3.1", - "exit-hook": "2.2.1", - "isbot": "^5.1.11", - "jsesc": "3.0.2", - "lodash": "^4.17.21", - "pathe": "^1.1.2", - "picocolors": "^1.1.1", - "prettier": "^2.7.1", - "react-refresh": "^0.14.0", - "semver": "^7.3.7", - "set-cookie-parser": "^2.6.0", - "tinyglobby": "^0.2.14", - "valibot": "^0.41.0", - "vite-node": "^3.2.2" - }, - "bin": { - "react-router": "bin.js" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@react-router/serve": "^7.7.0", - "react-router": "^7.7.0", - "typescript": "^5.1.0", - "vite": "^5.1.0 || ^6.0.0 || ^7.0.0", - "wrangler": "^3.28.2 || ^4.0.0" - }, - "peerDependenciesMeta": { - "@react-router/serve": { - "optional": true - }, - "typescript": { - "optional": true - }, - "wrangler": { - "optional": true - } - } - }, - "node_modules/@react-router/dev/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-router/dev/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@react-router/dev/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/@react-router/dev/node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@react-router/dev/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-router/express": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@react-router/express/-/express-7.7.0.tgz", - "integrity": "sha512-R86v1qAbj3i/tG00gFM90P3nXR+B66qkp3bbaqm9VnTkbkqUCcHnVaQn64qBOl5g34FdJUMt84UsLS6v2mT/iQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@react-router/node": "7.7.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "express": "^4.17.1 || ^5", - "react-router": "7.7.0", - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@react-router/node": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.7.0.tgz", - "integrity": "sha512-PTl4C+QjWsbTfp+9mybOzIH10ZM/pjZrAlcoxc/KGYxcfWDEe2GDFFBQN6nGZgJe/0SwSjHsVwqo2haMKgTbvQ==", - "license": "MIT", - "dependencies": { - "@mjackson/node-fetch-server": "^0.2.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react-router": "7.7.0", - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@react-router/serve": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@react-router/serve/-/serve-7.7.0.tgz", - "integrity": "sha512-XvJAY4Sgv7HxdSuLgkBP8bFXxfI97HJSk+p2BisdtK6JT/nSZugEe0gju4xAkgtsncNJJBVndJTcfUtTDNLTUQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@react-router/express": "7.7.0", - "@react-router/node": "7.7.0", - "compression": "^1.7.4", - "express": "^4.19.2", - "get-port": "5.1.1", - "morgan": "^1.10.0", - "source-map-support": "^0.5.21" - }, - "bin": { - "react-router-serve": "bin.js" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react-router": "7.7.0" - } - }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.9", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz", @@ -2988,30 +2484,23 @@ "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==" }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", - "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "version": "19.1.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz", + "integrity": "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==", "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.0.0" } }, "node_modules/@types/resolve": { @@ -3582,34 +3071,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -3682,13 +3143,6 @@ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3722,15 +3176,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/array-includes": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", @@ -3940,19 +3385,6 @@ "node": ">=4" } }, - "node_modules/babel-dead-code-elimination": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.10.tgz", - "integrity": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" - } - }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -3969,30 +3401,6 @@ "dev": true, "license": "MIT" }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/better-opn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", @@ -4000,60 +3408,12 @@ "dev": true, "license": "MIT", "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "open": "^8.0.4" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" + "node": ">=12.0.0" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -4110,27 +3470,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -4327,22 +3666,6 @@ "node": ">= 16" } }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/chromatic": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-12.1.0.tgz", @@ -4421,96 +3744,12 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -4518,24 +3757,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4673,21 +3894,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -4751,18 +3957,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -4772,19 +3966,6 @@ "node": ">=6" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -4845,15 +4026,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/electron-to-chromium": { "version": "1.5.161", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.161.tgz", @@ -4868,25 +4040,6 @@ "dev": true, "license": "MIT" }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -5187,15 +4340,6 @@ "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -5534,18 +4678,6 @@ "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -5556,19 +4688,6 @@ "es5-ext": "~0.10.14" } }, - "node_modules/exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/expect-type": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", @@ -5579,88 +4698,6 @@ "node": ">=12.0.0" } }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -5774,48 +4811,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -5887,30 +4882,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6017,21 +4988,6 @@ "node": ">=6" } }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -6312,29 +5268,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hosted-git-info": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", - "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -6343,46 +5276,12 @@ "license": "MIT" }, "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/ignore": { @@ -6470,18 +5369,6 @@ "node": ">= 0.4" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -6976,15 +5863,6 @@ "dev": true, "license": "MIT" }, - "node_modules/isbot": { - "version": "5.1.28", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.28.tgz", - "integrity": "sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw==", - "license": "Unlicense", - "engines": { - "node": ">=18" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -7084,6 +5962,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -7118,16 +5997,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/json-schema-to-typescript": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-13.1.2.tgz", @@ -7367,6 +6236,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -7617,18 +6487,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/memoizee": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", @@ -7648,18 +6506,6 @@ "node": ">=0.12" } }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -7670,18 +6516,6 @@ "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -8130,60 +6964,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -8230,6 +7010,12 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -8242,61 +7028,6 @@ "node": ">=10" } }, - "node_modules/morgan": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", - "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.1.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -8350,18 +7081,6 @@ "dev": true, "license": "MIT" }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -8375,129 +7094,6 @@ "dev": true, "license": "MIT" }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", - "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -8605,33 +7201,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8770,18 +7339,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8842,15 +7399,6 @@ "dev": true, "license": "ISC" }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -9131,54 +7679,23 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "engines": { + "node": ">=6" } }, "node_modules/prompts": { @@ -9223,22 +7740,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -9249,24 +7750,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9288,44 +7771,11 @@ ], "license": "MIT" }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } @@ -9363,16 +7813,15 @@ } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.1.1" } }, "node_modules/react-is": { @@ -9475,28 +7924,6 @@ } } }, - "node_modules/react-router": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.7.0.tgz", - "integrity": "sha512-3FUYSwlvB/5wRJVTL/aavqHmfUKe0+Xm9MllkYgGo9eDwNdkvwlJGjpPxono1kCycLt6AnDTgjmXvK3/B4QGuw==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, "node_modules/react-style-singleton": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", @@ -9536,20 +7963,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/recast": { "version": "0.23.11", "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", @@ -9638,6 +8051,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexparam": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", + "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", @@ -9709,16 +8131,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -9814,29 +8226,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -9872,23 +8261,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" }, "node_modules/semver": { "version": "6.3.1", @@ -9900,90 +8277,6 @@ "semver": "bin/semver.js" } }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "license": "MIT" - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -10033,15 +8326,6 @@ "node": ">= 0.4" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10203,19 +8487,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", @@ -10225,42 +8496,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -10268,18 +8503,6 @@ "dev": true, "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/std-env": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", @@ -10811,18 +9034,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -10945,22 +9156,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -11043,7 +9238,7 @@ "version": "5.6.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -11192,18 +9387,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/unplugin": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", @@ -11347,6 +9530,15 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -11354,66 +9546,6 @@ "dev": true, "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/valibot": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.41.0.tgz", - "integrity": "sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">=5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -11818,6 +9950,20 @@ "node": ">=0.10.0" } }, + "node_modules/wouter": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.7.1.tgz", + "integrity": "sha512-od5LGmndSUzntZkE2R5CHhoiJ7YMuTIbiXsa0Anytc2RATekgv4sfWRAxLEULBrp7ADzinWQw8g470lkT8+fOw==", + "license": "Unlicense", + "dependencies": { + "mitt": "^3.0.1", + "regexparam": "^3.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", diff --git a/desktop/package.json b/desktop/package.json index 2baf20dc..5e5a5bb7 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -18,7 +18,6 @@ "dependencies": { "@mantine/core": "^8.0.2", "@mantine/hooks": "^8.0.2", - "@react-router/node": "^7.7.0", "@tabler/icons-react": "^3.34.0", "@tanstack/react-query": "^5.80.7", "@tauri-apps/api": "^2", @@ -26,17 +25,15 @@ "@tauri-apps/plugin-opener": "^2.3.0", "@tauri-apps/plugin-shell": "^2.2.2", "@types/prismjs": "^1.26.5", - "isbot": "^5", "prismjs": "^1.30.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-markdown": "^10.1.0", - "react-router": "^7.7.0" + "wouter": "^3.7.1" }, "devDependencies": { "@chromatic-com/storybook": "^4.0.0", "@eslint/js": "^9.28.0", - "@react-router/dev": "^7.7.0", "@storybook/addon-a11y": "^9.0.4", "@storybook/addon-docs": "^9.0.4", "@storybook/addon-onboarding": "^9.0.4", @@ -44,8 +41,8 @@ "@storybook/react-vite": "^9.0.4", "@tauri-apps/cli": "^2", "@types/node": "^20.11.24", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.1", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.0", "@vitejs/plugin-react": "^4.3.4", "@vitest/browser": "^3.2.1", "@vitest/coverage-v8": "^3.2.1", diff --git a/desktop/react-router.config.ts b/desktop/react-router.config.ts deleted file mode 100644 index 436538a5..00000000 --- a/desktop/react-router.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { Config } from "@react-router/dev/config"; - -export default { - ssr: false, - appDirectory: "src", -} satisfies Config; \ No newline at end of file diff --git a/desktop/src/App.tsx b/desktop/src/App.tsx index 834d86a9..7ec3905d 100644 --- a/desktop/src/App.tsx +++ b/desktop/src/App.tsx @@ -1,5 +1,5 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { createHashRouter, Navigate, RouterProvider } from "react-router"; +import { Route, Switch } from "wouter"; import "./App.css"; import { AppProvider } from "./hooks/useAppContext.tsx"; import { NotifierProvider } from "./hooks/useNotifier"; @@ -19,65 +19,41 @@ const queryClient = new QueryClient({ }, }); -const router = createHashRouter([ - { - element: , - children: [ - { - path: "/", - children: [ - { - index: true, - element: ( - - - - ), - }, - { - path: "workspace/:workspaceName", - element: , - }, - { - path: "executable/:executableId", - element: , - }, - { - path: "logs", - element: ( - - Logs view coming soon... - - ), - }, - { - path: "vault", - element: , - }, - { - path: "cache", - element: , - }, - { - path: "settings", - element: , - }, - { - path: "*", - element: , - }, - ], - }, - ], - }, -]); - function App() { return ( - + + + + + + + + + + + + Logs view coming soon... + + + + + + + + + + + + diff --git a/desktop/src/components/CodeHighlighter/CodeHighlighter.stories.tsx b/desktop/src/components/CodeHighlighter/CodeHighlighter.stories.tsx index 7fcbbbe9..b42ccfea 100644 --- a/desktop/src/components/CodeHighlighter/CodeHighlighter.stories.tsx +++ b/desktop/src/components/CodeHighlighter/CodeHighlighter.stories.tsx @@ -51,12 +51,12 @@ NC='\\033[0m' # No Color # Function to log messages log() { - echo -e "\${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]\${NC} \$1" | tee -a "\$LOG_FILE" + echo -e "\${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]\${NC} $1" | tee -a "\$LOG_FILE" } # Function to handle errors error() { - echo -e "\${RED}[ERROR]\${NC} \$1" >&2 + echo -e "\${RED}[ERROR]\${NC} $1" >&2 exit 1 } diff --git a/desktop/src/components/CodeHighlighter/CodeHighlighter.tsx b/desktop/src/components/CodeHighlighter/CodeHighlighter.tsx index 12a748be..43fd50a7 100644 --- a/desktop/src/components/CodeHighlighter/CodeHighlighter.tsx +++ b/desktop/src/components/CodeHighlighter/CodeHighlighter.tsx @@ -53,6 +53,7 @@ export function CodeHighlighter({ type: NotificationType.Error, autoClose: true, }); + console.error(error); } }; diff --git a/desktop/src/components/MarkdownRenderer/MarkdownRenderer.tsx b/desktop/src/components/MarkdownRenderer/MarkdownRenderer.tsx index 4ffc2ab9..9597ccaa 100644 --- a/desktop/src/components/MarkdownRenderer/MarkdownRenderer.tsx +++ b/desktop/src/components/MarkdownRenderer/MarkdownRenderer.tsx @@ -47,7 +47,11 @@ export function MarkdownRenderer({ pre: (props: ComponentPropsWithoutRef) => { const codeElement = props.children as React.ReactElement; const codeContent = codeElement?.props?.children || ""; - return {codeContent}; + return ( + + {codeContent} + + ); }, }} > diff --git a/desktop/src/components/PageWrapper.tsx b/desktop/src/components/PageWrapper.tsx index 7e10ab04..1e6a855a 100644 --- a/desktop/src/components/PageWrapper.tsx +++ b/desktop/src/components/PageWrapper.tsx @@ -1,16 +1,16 @@ -import {ScrollArea} from "@mantine/core"; +import { ScrollArea } from "@mantine/core"; -export function PageWrapper({children}: { children: React.ReactNode }) { - return ( - - {children} - - ); -} \ No newline at end of file +export function PageWrapper({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} diff --git a/desktop/src/components/Settings.tsx b/desktop/src/components/Settings.tsx index b8c00e0c..a1606047 100644 --- a/desktop/src/components/Settings.tsx +++ b/desktop/src/components/Settings.tsx @@ -12,14 +12,16 @@ export function SettingRow({ label, description, children }: SettingRowProps) { - {label} + + {label} + {description && ( - {description} + + {description} + )} - - {children} - + {children} ); @@ -33,12 +35,17 @@ interface SettingSectionProps { export function SettingSection({ title, children }: SettingSectionProps) { return ( - + {title} - - {children} - + {children} ); } diff --git a/desktop/src/hooks/useAppContext.tsx b/desktop/src/hooks/useAppContext.tsx index c719c0bc..e50e7552 100644 --- a/desktop/src/hooks/useAppContext.tsx +++ b/desktop/src/hooks/useAppContext.tsx @@ -10,131 +10,156 @@ import { invoke } from "@tauri-apps/api/core"; import { useQuery } from "@tanstack/react-query"; interface AppContextType { - config: Config | null; - selectedWorkspace: string | null; - setSelectedWorkspace: (workspaceName: string | null) => void; - workspaces: EnrichedWorkspace[]; - executables: EnrichedExecutable[]; - isLoading: boolean; - hasError: Error | null; - refreshAll: () => void; + config: Config | null; + selectedWorkspace: string | null; + setSelectedWorkspace: (workspaceName: string | null) => void; + workspaces: EnrichedWorkspace[]; + executables: EnrichedExecutable[]; + isLoading: boolean; + hasError: Error | null; + refreshAll: () => void; } export const AppContext = createContext(undefined); export function useFlowBinaryCheck() { - const { data: isFlowBinaryAvailable, isLoading: isCheckingBinary, error: binaryCheckError } = useQuery({ - queryKey: ["flowBinaryCheck"], - queryFn: async () => { - try { - await invoke("check_flow_binary"); - return true; - } catch (error) { - console.error(error); - throw new Error("flow CLI not found or not executable"); - } - }, - retry: false, - refetchOnWindowFocus: false, - }); + const { + data: isFlowBinaryAvailable, + isLoading: isCheckingBinary, + error: binaryCheckError, + } = useQuery({ + queryKey: ["flowBinaryCheck"], + queryFn: async () => { + try { + await invoke("check_flow_binary"); + return true; + } catch (error) { + console.error(error); + throw new Error("flow CLI not found or not executable"); + } + }, + retry: false, + refetchOnWindowFocus: false, + }); - return { - isFlowBinaryAvailable, - isCheckingBinary, - binaryCheckError, - }; + return { + isFlowBinaryAvailable, + isCheckingBinary, + binaryCheckError, + }; } export function AppProvider({ children }: { children: React.ReactNode }) { - const { isCheckingBinary, binaryCheckError } = useFlowBinaryCheck(); - const enabled = !binaryCheckError && !isCheckingBinary; + const { isCheckingBinary, binaryCheckError } = useFlowBinaryCheck(); + const enabled = !binaryCheckError && !isCheckingBinary; - const { config, isConfigLoading, configError, refreshConfig } = useConfig(enabled); + const { config, isConfigLoading, configError, refreshConfig } = + useConfig(enabled); - const { workspaces, isWorkspacesLoading, workspacesError, refreshWorkspaces } = useWorkspaces(enabled); - const [selectedWorkspace, setSelectedWorkspace] = useState(null); + const { + workspaces, + isWorkspacesLoading, + workspacesError, + refreshWorkspaces, + } = useWorkspaces(enabled); + const [selectedWorkspace, setSelectedWorkspace] = useState( + null, + ); - useEffect(() => { - if (config?.currentWorkspace && workspaces && workspaces.length > 0) { - // Only set if we don't have a selected workspace or if the config workspace exists - const configWorkspaceExists = workspaces.some(w => w.name === config.currentWorkspace); - if (!selectedWorkspace && configWorkspaceExists) { - setSelectedWorkspace(config.currentWorkspace); - } - } - }, [config, workspaces, selectedWorkspace]); - - const { executables, isExecutablesLoading, executablesError, refreshExecutables } = useExecutables(selectedWorkspace, enabled); - - const isLoading = - isConfigLoading || isWorkspacesLoading || isExecutablesLoading; - const hasError = configError || workspacesError || executablesError; - if (hasError) { - console.error("Error", hasError); + useEffect(() => { + if (config?.currentWorkspace && workspaces && workspaces.length > 0) { + // Only set if we don't have a selected workspace or if the config workspace exists + const configWorkspaceExists = workspaces.some( + (w) => w.name === config.currentWorkspace, + ); + if (!selectedWorkspace && configWorkspaceExists) { + setSelectedWorkspace(config.currentWorkspace); + } } + }, [config, workspaces, selectedWorkspace]); - const refreshAll = () => { - refreshConfig(); - refreshWorkspaces(); - refreshExecutables(); - }; + const { + executables, + isExecutablesLoading, + executablesError, + refreshExecutables, + } = useExecutables(selectedWorkspace, enabled); - // If flow binary is not available, return early with error state - if (binaryCheckError) { - return ( - {}, - }}> - {children} - - ); - } + const isLoading = + isConfigLoading || isWorkspacesLoading || isExecutablesLoading; + const hasError = configError || workspacesError || executablesError; + if (hasError) { + console.error("Error", hasError); + } - // If still checking binary, show loading state - if (isCheckingBinary) { - return ( - {}, - }}> - {children} - - ); - } + const refreshAll = () => { + refreshConfig(); + refreshWorkspaces(); + refreshExecutables(); + }; + + // If flow binary is not available, return early with error state + if (binaryCheckError) { + return ( + {}, + }} + > + {children} + + ); + } + // If still checking binary, show loading state + if (isCheckingBinary) { return ( - - {children} - + {}, + }} + > + {children} + ); + } + + return ( + + {children} + + ); } export function useAppContext() { - const context = useContext(AppContext); - if (context === undefined) { - throw new Error('useAppContext must be used within an AppProvider'); - } - return context; -} \ No newline at end of file + const context = useContext(AppContext); + if (context === undefined) { + throw new Error("useAppContext must be used within an AppProvider"); + } + return context; +} diff --git a/desktop/src/hooks/useConfig.ts b/desktop/src/hooks/useConfig.ts index ff9fefe1..d94fe405 100644 --- a/desktop/src/hooks/useConfig.ts +++ b/desktop/src/hooks/useConfig.ts @@ -1,90 +1,90 @@ -import {useQuery, useQueryClient} from "@tanstack/react-query"; -import {invoke} from "@tauri-apps/api/core"; -import {Config} from "../types/generated/config.ts"; +import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { invoke } from "@tauri-apps/api/core"; +import { Config } from "../types/generated/config.ts"; export function useConfig(enabled: boolean = true) { - const queryClient = useQueryClient(); + const queryClient = useQueryClient(); - const { - data: config, - isLoading: isConfigLoading, - error: configError, - } = useQuery({ - queryKey: ["config"], - queryFn: async () => { - return await invoke("get_config"); - }, - enabled, - }); + const { + data: config, + isLoading: isConfigLoading, + error: configError, + } = useQuery({ + queryKey: ["config"], + queryFn: async () => { + return await invoke("get_config"); + }, + enabled, + }); - const refreshConfig = () => { - queryClient.invalidateQueries({ queryKey: ["config"] }); - }; + const refreshConfig = () => { + queryClient.invalidateQueries({ queryKey: ["config"] }); + }; - const updateTheme = async (theme: string) => { - try { - await invoke("set_config_theme", { theme }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update theme: ${error}`); - } - }; + const updateTheme = async (theme: string) => { + try { + await invoke("set_config_theme", { theme }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update theme: ${error}`); + } + }; - const updateWorkspaceMode = async (mode: string) => { - try { - await invoke("set_config_workspace_mode", { mode }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update workspace mode: ${error}`); - } - }; + const updateWorkspaceMode = async (mode: string) => { + try { + await invoke("set_config_workspace_mode", { mode }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update workspace mode: ${error}`); + } + }; - const updateLogMode = async (mode: string) => { - try { - await invoke("set_config_log_mode", { mode }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update log mode: ${error}`); - } - }; + const updateLogMode = async (mode: string) => { + try { + await invoke("set_config_log_mode", { mode }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update log mode: ${error}`); + } + }; - const updateNamespace = async (namespace: string) => { - try { - await invoke("set_config_namespace", { namespace }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update namespace: ${error}`); - } - }; + const updateNamespace = async (namespace: string) => { + try { + await invoke("set_config_namespace", { namespace }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update namespace: ${error}`); + } + }; - const updateCurrentWorkspace = async (workspace: string) => { - try { - await invoke("set_workspace", { name: workspace, fixed: false }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update current workspace: ${error}`); - } - }; + const updateCurrentWorkspace = async (workspace: string) => { + try { + await invoke("set_workspace", { name: workspace, fixed: false }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update current workspace: ${error}`); + } + }; - const updateDefaultTimeout = async (timeout: string) => { - try { - await invoke("set_config_timeout", { timeout }); - refreshConfig(); - } catch (error) { - throw new Error(`Failed to update default timeout: ${error}`); - } - }; + const updateDefaultTimeout = async (timeout: string) => { + try { + await invoke("set_config_timeout", { timeout }); + refreshConfig(); + } catch (error) { + throw new Error(`Failed to update default timeout: ${error}`); + } + }; - return { - config, - isConfigLoading, - configError, - refreshConfig, - updateTheme, - updateWorkspaceMode, - updateLogMode, - updateNamespace, - updateCurrentWorkspace, - updateDefaultTimeout, - }; + return { + config, + isConfigLoading, + configError, + refreshConfig, + updateTheme, + updateWorkspaceMode, + updateLogMode, + updateNamespace, + updateCurrentWorkspace, + updateDefaultTimeout, + }; } diff --git a/desktop/src/hooks/useExecutable.ts b/desktop/src/hooks/useExecutable.ts index 10c7b560..22fd169d 100644 --- a/desktop/src/hooks/useExecutable.ts +++ b/desktop/src/hooks/useExecutable.ts @@ -1,81 +1,84 @@ -import {useQuery, useQueryClient} from "@tanstack/react-query"; +import { useQuery, useQueryClient } from "@tanstack/react-query"; import React from "react"; -import {EnrichedExecutable} from "../types/executable.ts"; -import {invoke} from "@tauri-apps/api/core"; +import { EnrichedExecutable } from "../types/executable.ts"; +import { invoke } from "@tauri-apps/api/core"; export function useExecutable(executableRef: string) { - const queryClient = useQueryClient(); - const [currentExecutable, setCurrentExecutable] = - React.useState(null); + const queryClient = useQueryClient(); + const [currentExecutable, setCurrentExecutable] = + React.useState(null); - const { - data: executable, - isLoading: isExecutableLoading, - error: executableError, - } = useQuery({ - queryKey: ["executable", executableRef], - queryFn: async () => { - if (!executableRef) return null; - return await invoke("get_executable", { - executableRef: executableRef, - }); - }, - enabled: !!executableRef, - }); + const { + data: executable, + isLoading: isExecutableLoading, + error: executableError, + } = useQuery({ + queryKey: ["executable", executableRef], + queryFn: async () => { + if (!executableRef) return null; + return await invoke("get_executable", { + executableRef: executableRef, + }); + }, + enabled: !!executableRef, + }); - // Update current executable when we have new data - React.useEffect(() => { - if (executable) { - setCurrentExecutable(executable); - } - }, [executable]); + // Update current executable when we have new data + React.useEffect(() => { + if (executable) { + setCurrentExecutable(executable); + } + }, [executable]); - const refreshExecutable = () => { - if (executableRef) { - queryClient.invalidateQueries({ - queryKey: ["executable", executableRef], - }); - } - }; + const refreshExecutable = () => { + if (executableRef) { + queryClient.invalidateQueries({ + queryKey: ["executable", executableRef], + }); + } + }; - return { - executable: currentExecutable, - isExecutableLoading, - executableError, - refreshExecutable, - }; + return { + executable: currentExecutable, + isExecutableLoading, + executableError, + refreshExecutable, + }; } -export function useExecutables(selectedWorkspace: string | null, enabled: boolean = true) { - const queryClient = useQueryClient(); +export function useExecutables( + selectedWorkspace: string | null, + enabled: boolean = true, +) { + const queryClient = useQueryClient(); - const { - data: executables, - isLoading: isExecutablesLoading, - error: executablesError, - } = useQuery({ - queryKey: ["executables", selectedWorkspace], - queryFn: async () => { - if (!selectedWorkspace) return []; - return await invoke("list_executables", { - workspace: selectedWorkspace, - }); - }, - enabled: enabled && !!selectedWorkspace, // Only run when workspace is selected AND enabled - }); + const { + data: executables, + isLoading: isExecutablesLoading, + error: executablesError, + } = useQuery({ + queryKey: ["executables", selectedWorkspace], + queryFn: async () => { + if (!selectedWorkspace) return []; + return await invoke("list_executables", { + workspace: selectedWorkspace, + }); + }, + enabled: enabled && !!selectedWorkspace, // Only run when workspace is selected AND enabled + }); - const refreshExecutables = () => { - if (selectedWorkspace) { - queryClient.invalidateQueries({ - queryKey: ["executables", selectedWorkspace], - }); - } - }; + const refreshExecutables = () => { + if (selectedWorkspace) { + queryClient.invalidateQueries({ + queryKey: ["executables", selectedWorkspace], + }); + } + }; - return { - executables: executables || [], - isExecutablesLoading, - executablesError, - refreshExecutables, - }; + return { + executables: executables || [], + isExecutablesLoading, + executablesError, + refreshExecutables, + }; } diff --git a/desktop/src/hooks/useSettings.tsx b/desktop/src/hooks/useSettings.tsx index d2f99d47..6c52e48e 100644 --- a/desktop/src/hooks/useSettings.tsx +++ b/desktop/src/hooks/useSettings.tsx @@ -22,7 +22,7 @@ const defaultSettings: Settings = { }; const SettingsContext = createContext( - undefined + undefined, ); export function SettingsProvider({ children }: { children: ReactNode }) { diff --git a/desktop/src/hooks/useWorkspace.ts b/desktop/src/hooks/useWorkspace.ts index a8beb362..34259022 100644 --- a/desktop/src/hooks/useWorkspace.ts +++ b/desktop/src/hooks/useWorkspace.ts @@ -1,61 +1,61 @@ -import {useQuery, useQueryClient} from "@tanstack/react-query"; -import {invoke} from "@tauri-apps/api/core"; -import {EnrichedWorkspace} from "../types/workspace.ts"; +import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { invoke } from "@tauri-apps/api/core"; +import { EnrichedWorkspace } from "../types/workspace.ts"; export function useWorkspace(workspaceName: string, enabled: boolean = true) { - const queryClient = useQueryClient(); - - const { - data: workspace, - isLoading: isWorkspaceLoading, - error: workspaceError, - } = useQuery({ - queryKey: ["workspace", workspaceName], - queryFn: async () => { - return await invoke("get_workspace", { - name: workspaceName, - }); - }, - enabled, - }); - - const refreshWorkspace = () => { - if (workspaceName) { - queryClient.invalidateQueries({queryKey: ["workspace", workspaceName]}); - } - }; - - return { - workspace, - workspaceError, - isWorkspaceLoading, - refreshWorkspace, - }; + const queryClient = useQueryClient(); + + const { + data: workspace, + isLoading: isWorkspaceLoading, + error: workspaceError, + } = useQuery({ + queryKey: ["workspace", workspaceName], + queryFn: async () => { + return await invoke("get_workspace", { + name: workspaceName, + }); + }, + enabled, + }); + + const refreshWorkspace = () => { + if (workspaceName) { + queryClient.invalidateQueries({ queryKey: ["workspace", workspaceName] }); + } + }; + + return { + workspace, + workspaceError, + isWorkspaceLoading, + refreshWorkspace, + }; } export function useWorkspaces(enabled: boolean = true) { - const queryClient = useQueryClient(); - - const { - data: workspaces, - isLoading: isWorkspacesLoading, - error: workspacesError, - } = useQuery({ - queryKey: ["workspaces"], - queryFn: async () => { - return await invoke("list_workspaces"); - }, - enabled, - }); - - const refreshWorkspaces = () => { - queryClient.invalidateQueries({ queryKey: ["workspaces"] }); - }; - - return { - workspaces, - isWorkspacesLoading, - workspacesError, - refreshWorkspaces, - }; + const queryClient = useQueryClient(); + + const { + data: workspaces, + isLoading: isWorkspacesLoading, + error: workspacesError, + } = useQuery({ + queryKey: ["workspaces"], + queryFn: async () => { + return await invoke("list_workspaces"); + }, + enabled, + }); + + const refreshWorkspaces = () => { + queryClient.invalidateQueries({ queryKey: ["workspaces"] }); + }; + + return { + workspaces, + isWorkspacesLoading, + workspacesError, + refreshWorkspaces, + }; } diff --git a/desktop/src/layout/AppShell/AppShell.tsx b/desktop/src/layout/AppShell/AppShell.tsx index 29c4f290..adb8cd23 100644 --- a/desktop/src/layout/AppShell/AppShell.tsx +++ b/desktop/src/layout/AppShell/AppShell.tsx @@ -4,16 +4,19 @@ import { Notification as MantineNotification, Text, } from "@mantine/core"; -import {useEffect} from "react"; -import {colorFromType, NotificationType,} from "../../types/notification"; +import { ReactNode, useEffect } from "react"; +import { colorFromType, NotificationType } from "../../types/notification"; import { Header } from "../Header/Header"; import { Sidebar } from "../Sidebar/Sidebar"; import styles from "./AppShell.module.css"; -import {useAppContext} from "../../hooks/useAppContext.tsx"; -import {useNotifier} from "../../hooks/useNotifier.tsx"; -import {Outlet, ScrollRestoration} from "react-router"; +import { useAppContext } from "../../hooks/useAppContext.tsx"; +import { useNotifier } from "../../hooks/useNotifier.tsx"; -export function AppShell() { +interface AppShellProps { + children: ReactNode; +} + +export function AppShell({ children }: AppShellProps) { const { isLoading, hasError } = useAppContext(); const { notification, setNotification } = useNotifier(); @@ -65,8 +68,7 @@ export function AppShell() {
) : (
- - + {children} {isLoading && (
; export default meta; @@ -15,14 +15,14 @@ type Story = StoryObj; export const Default: Story = { args: { - onCreateWorkspace: () => console.log('Create workspace clicked'), - onRefreshWorkspaces: () => console.log('Refresh workspaces clicked'), + onCreateWorkspace: () => console.log("Create workspace clicked"), + onRefreshWorkspaces: () => console.log("Refresh workspaces clicked"), }, }; export const Interactive: Story = { args: { - onCreateWorkspace: () => alert('Create workspace action triggered'), - onRefreshWorkspaces: () => alert('Refresh workspaces action triggered'), + onCreateWorkspace: () => alert("Create workspace action triggered"), + onRefreshWorkspaces: () => alert("Refresh workspaces action triggered"), }, }; diff --git a/desktop/src/layout/Header/ActionButtons/ActionButtons.tsx b/desktop/src/layout/Header/ActionButtons/ActionButtons.tsx index d20f4627..35ab42a4 100644 --- a/desktop/src/layout/Header/ActionButtons/ActionButtons.tsx +++ b/desktop/src/layout/Header/ActionButtons/ActionButtons.tsx @@ -6,7 +6,10 @@ interface ActionButtonsProps { onRefreshWorkspaces: () => void; } -export function ActionButtons({ onCreateWorkspace, onRefreshWorkspaces }: ActionButtonsProps) { +export function ActionButtons({ + onCreateWorkspace, + onRefreshWorkspaces, +}: ActionButtonsProps) { return ( - ) -} \ No newline at end of file + ); +} diff --git a/desktop/src/layout/Header/Header.stories.tsx b/desktop/src/layout/Header/Header.stories.tsx index 42521e80..cc5cdb51 100644 --- a/desktop/src/layout/Header/Header.stories.tsx +++ b/desktop/src/layout/Header/Header.stories.tsx @@ -1,15 +1,15 @@ -import type { Meta, StoryObj } from '@storybook/react'; -import { Header } from './Header'; -import { AppShell } from '@mantine/core'; +import type { Meta, StoryObj } from "@storybook/react"; +import { Header } from "./Header"; +import { AppShell } from "@mantine/core"; const meta = { - title: 'Components/Header', + title: "Components/Header", component: Header, parameters: { - layout: 'fullscreen', + layout: "fullscreen", docs: { story: { - height: '100px', + height: "100px", }, }, }, @@ -20,7 +20,7 @@ const meta = { ), ], - tags: ['autodocs'], + tags: ["autodocs"], } satisfies Meta; export default meta; @@ -28,14 +28,14 @@ type Story = StoryObj; export const Default: Story = { args: { - onCreateWorkspace: () => console.log('Create workspace clicked'), - onRefreshWorkspaces: () => console.log('Refresh workspaces clicked'), + onCreateWorkspace: () => console.log("Create workspace clicked"), + onRefreshWorkspaces: () => console.log("Refresh workspaces clicked"), }, }; export const Interactive: Story = { args: { - onCreateWorkspace: () => alert('Create workspace action triggered'), - onRefreshWorkspaces: () => alert('Refresh workspaces action triggered'), + onCreateWorkspace: () => alert("Create workspace action triggered"), + onRefreshWorkspaces: () => alert("Refresh workspaces action triggered"), }, }; diff --git a/desktop/src/layout/Header/Header.tsx b/desktop/src/layout/Header/Header.tsx index 8293a597..8b634b04 100644 --- a/desktop/src/layout/Header/Header.tsx +++ b/desktop/src/layout/Header/Header.tsx @@ -1,14 +1,14 @@ import { ActionIcon } from "@mantine/core"; import { IconPlus, IconRefresh } from "@tabler/icons-react"; import styles from "./Header.module.css"; -import {useAppContext} from "../../hooks/useAppContext.tsx"; -import {NotificationType} from "../../types/notification.ts"; -import {useNotifier} from "../../hooks/useNotifier.tsx"; +import { useAppContext } from "../../hooks/useAppContext.tsx"; +import { NotificationType } from "../../types/notification.ts"; +import { useNotifier } from "../../hooks/useNotifier.tsx"; export function Header() { const { refreshAll } = useAppContext(); const { setNotification } = useNotifier(); - + return (
diff --git a/desktop/src/layout/Layout.tsx b/desktop/src/layout/Layout.tsx index 60c375a8..e842c2c6 100644 --- a/desktop/src/layout/Layout.tsx +++ b/desktop/src/layout/Layout.tsx @@ -13,4 +13,3 @@ export function Layout({ children }: { children?: React.ReactNode }) { ); } - diff --git a/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx b/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx index c7233dec..506c0c1d 100644 --- a/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx +++ b/desktop/src/layout/Sidebar/ExecutableTree/ExecutableTree.tsx @@ -22,7 +22,7 @@ import { IconSettingsAutomation, IconWindowMaximize, } from "@tabler/icons-react"; -import React from "react"; +import { useMemo, useCallback } from "react"; import { BuildVerbType, ConfigurationVerbType, @@ -37,8 +37,8 @@ import { UpdateVerbType, ValidationVerbType, } from "../../../types/executable"; -import {useAppContext} from "../../../hooks/useAppContext.tsx"; -import {Link} from "react-router"; +import { useAppContext } from "../../../hooks/useAppContext.tsx"; +import { useLocation } from "wouter"; interface CustomTreeNodeData extends TreeNodeData { isNamespace: boolean; @@ -108,49 +108,47 @@ function Leaf({ elementProps, }: RenderTreeNodePayload) { const customNode = node as CustomTreeNodeData; - let icon: React.ReactNode; - if (customNode.isNamespace && hasChildren) { - if (selected && expanded) { - icon = ; + const [, setLocation] = useLocation(); + + const icon = useMemo(() => { + if (customNode.isNamespace && hasChildren) { + if (selected && expanded) { + return ; + } else { + return ; + } } else { - icon = ; - } - } else { - switch (customNode.verbType) { - case DeactivationVerbType: - icon = ; - break; - case ConfigurationVerbType: - icon = ; - break; - case DestructionVerbType: - icon = ; - break; - case RetrievalVerbType: - icon = ; - break; - case UpdateVerbType: - icon = ; - break; - case ValidationVerbType: - icon = ; - break; - case LaunchVerbType: - icon = ; - break; - case CreationVerbType: - icon = ; - break; - case RestartVerbType: - icon = ; - break; - case BuildVerbType: - icon = ; - break; - default: - icon = ; + switch (customNode.verbType) { + case DeactivationVerbType: + return ; + case ConfigurationVerbType: + return ; + case DestructionVerbType: + return ; + case RetrievalVerbType: + return ; + case UpdateVerbType: + return ; + case ValidationVerbType: + return ; + case LaunchVerbType: + return ; + case CreationVerbType: + return ; + case RestartVerbType: + return ; + case BuildVerbType: + return ; + default: + return ; + } } - } + }, [hasChildren, selected, expanded]); + + const handleExecutableClick = useCallback(() => { + const encodedId = encodeURIComponent(customNode.value); + setLocation(`/executable/${encodedId}`); + }, [setLocation]); if (customNode.isNamespace) { return ( @@ -162,12 +160,16 @@ function Leaf({ } return ( - - - {icon} - {customNode.label} - - + + {icon} + {customNode.label} + ); } @@ -175,30 +177,7 @@ export function ExecutableTree() { const { executables } = useAppContext(); const tree = useTree(); - // React.useEffect(() => { - // const selectedValue = tree.selectedState[0]; - // if (selectedValue) { - // const findNode = ( - // nodes: CustomTreeNodeData[] - // ): CustomTreeNodeData | undefined => { - // for (const node of nodes) { - // if (node.value === selectedValue) { - // return node; - // } - // if (node.children) { - // const found = findNode(node.children as CustomTreeNodeData[]); - // if (found) return found; - // } - // } - // return undefined; - // }; - // - // // const node = findNode(getTreeData(executables)); - // // if (node && !node.isNamespace) { - // // onSelectExecutable(selectedValue); - // // } - // } - // }, [tree.selectedState, executables, onSelectExecutable]); + const treeData = useMemo(() => getTreeData(executables), [executables]); return ( <> @@ -211,12 +190,7 @@ export function ExecutableTree() { ) : ( - + )} diff --git a/desktop/src/layout/Sidebar/Sidebar.tsx b/desktop/src/layout/Sidebar/Sidebar.tsx index c19fef9a..fb1dad06 100644 --- a/desktop/src/layout/Sidebar/Sidebar.tsx +++ b/desktop/src/layout/Sidebar/Sidebar.tsx @@ -1,79 +1,97 @@ -import {Button, Group, Image, NavLink, Stack} from "@mantine/core"; +import { Group, Image, NavLink, Stack } from "@mantine/core"; import { ExecutableTree } from "./ExecutableTree/ExecutableTree"; import styles from "./Sidebar.module.css"; import { WorkspaceSelector } from "./WorkspaceSelector/WorkspaceSelector"; import iconImage from "/logo-dark.png"; -import {IconDatabase, IconFolders, IconLogs, IconSettings} from "@tabler/icons-react"; -import {Link, NavLink as RouterNavLink, useLocation, useNavigate} from "react-router"; -import {useAppContext} from "../../hooks/useAppContext.tsx"; +import { + IconDatabase, + IconFolders, + IconLogs, + IconSettings, +} from "@tabler/icons-react"; +import { Link, useLocation } from "wouter"; +import { useAppContext } from "../../hooks/useAppContext.tsx"; +import { useCallback } from "react"; export function Sidebar() { - const location = useLocation(); - const { executables, selectedWorkspace } = useAppContext() - const navigate = useNavigate(); + const [location, setLocation] = useLocation(); + const { executables, selectedWorkspace } = useAppContext(); + + const navigateToWorkspace = useCallback(() => { + setLocation(`/workspace/${selectedWorkspace || ""}`); + }, [setLocation, selectedWorkspace]); + + const navigateToLogs = useCallback(() => { + setLocation("/logs"); + }, [setLocation]); + + const navigateToCache = useCallback(() => { + setLocation("/cache"); + }, [setLocation]); + + const navigateToVault = useCallback(() => { + setLocation("/vault"); + }, [setLocation]); + + const navigateToSettings = useCallback(() => { + setLocation("/settings"); + }, [setLocation]); return (
- flow + flow - - {/* Direct RouterNavLink A/B test to rule out composition issues */} - - } - active={location.pathname.startsWith('/workspace')} - variant="filled" - /> - } - component={RouterNavLink} - to={`/logs`} - active={location.pathname.startsWith('/logs')} - variant="filled" + label="Logs" + leftSection={} + active={location.startsWith("/logs")} + variant="filled" + onClick={navigateToLogs} /> + } - variant="filled" - childrenOffset={28} + label="Data" + leftSection={} + variant="filled" + childrenOffset={28} > - - + + + } - component={RouterNavLink} - to={`/settings`} - active={location.pathname.startsWith('/settings')} - variant="filled" + label="Settings" + leftSection={} + active={location.startsWith("/settings")} + variant="filled" + onClick={navigateToSettings} /> - {executables && executables.length > 0 && ( - - )} + {executables && executables.length > 0 && }
); diff --git a/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.tsx b/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.tsx index 7bd0279b..a61e22ef 100644 --- a/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.tsx +++ b/desktop/src/layout/Sidebar/WorkspaceSelector/WorkspaceSelector.tsx @@ -2,11 +2,11 @@ import { ComboboxItem, Group, OptionsFilter, Select } from "@mantine/core"; import { useConfig } from "../../../hooks/useConfig"; import { useNotifier } from "../../../hooks/useNotifier"; import { NotificationType } from "../../../types/notification"; -import {useAppContext} from "../../../hooks/useAppContext.tsx"; +import { useAppContext } from "../../../hooks/useAppContext.tsx"; const filter: OptionsFilter = ({ options, search }) => { const filtered = (options as ComboboxItem[]).filter((option) => - option.label.toLowerCase().trim().includes(search.toLowerCase().trim()) + option.label.toLowerCase().trim().includes(search.toLowerCase().trim()), ); filtered.sort((a, b) => a.label.localeCompare(b.label)); @@ -14,27 +14,31 @@ const filter: OptionsFilter = ({ options, search }) => { }; export function WorkspaceSelector() { - const { selectedWorkspace, setSelectedWorkspace, workspaces, config } = useAppContext() + const { selectedWorkspace, setSelectedWorkspace, workspaces, config } = + useAppContext(); const { updateCurrentWorkspace } = useConfig(); const { setNotification } = useNotifier(); const handleWorkspaceChange = async (workspaceName: string) => { setSelectedWorkspace(workspaceName); - if (config?.workspaceMode === 'dynamic') { + if (config?.workspaceMode === "dynamic") { try { await updateCurrentWorkspace(workspaceName); setNotification({ type: NotificationType.Success, - title: 'Workspace switched', + title: "Workspace switched", message: `Switched to workspace: ${workspaceName}`, autoClose: true, }); } catch (error) { setNotification({ type: NotificationType.Error, - title: 'Error switching workspace', - message: error instanceof Error ? error.message : 'An unknown error occurred', + title: "Error switching workspace", + message: + error instanceof Error + ? error.message + : "An unknown error occurred", autoClose: true, }); } diff --git a/desktop/src/pages/Data/Data.tsx b/desktop/src/pages/Data/Data.tsx index f4880b15..382fc368 100644 --- a/desktop/src/pages/Data/Data.tsx +++ b/desktop/src/pages/Data/Data.tsx @@ -1,22 +1,22 @@ import { Tabs } from "@mantine/core"; import { IconBraces, IconLock } from "@tabler/icons-react"; -import {PageWrapper} from "../../components/PageWrapper.tsx"; +import { PageWrapper } from "../../components/PageWrapper.tsx"; export function Data() { return ( - - - - }> - Cache - - }> - Vault - - - Cache data should show here - Vault data should show here - - + + + + }> + Cache + + }> + Vault + + + Cache data should show here + Vault data should show here + + ); } diff --git a/desktop/src/pages/Executable/Executable.tsx b/desktop/src/pages/Executable/Executable.tsx index bc3b251e..54b63e4c 100644 --- a/desktop/src/pages/Executable/Executable.tsx +++ b/desktop/src/pages/Executable/Executable.tsx @@ -108,10 +108,8 @@ export function Executable({ executable }: ExecutableProps) { let unlistenComplete: (() => void) | undefined; const setupListeners = async () => { - console.log("Setting up listeners for executable:", executable.ref); unlistenOutput = await listen("command-output", (event) => { const payload = event.payload as LogLine; - console.log("Received output:", payload); setOutput((prev) => [...prev, payload]); }); @@ -146,7 +144,6 @@ export function Executable({ executable }: ExecutableProps) { const onOpenFile = async () => { try { - console.log(executable.flowfile); await openPath(executable.flowfile, settings.executableApp || undefined); } catch (error) { console.error(error); @@ -155,7 +152,7 @@ export function Executable({ executable }: ExecutableProps) { const onExecute = async () => { const hasPromptParams = executable.exec?.params?.some( - (param) => param.prompt + (param) => param.prompt, ); const hasArgs = executable.exec?.args && executable.exec.args.length > 0; @@ -183,7 +180,12 @@ export function Executable({ executable }: ExecutableProps) { ? formData.args.trim().split(/\s+/) : []; - const invokeParams: any = { + const invokeParams: { + verb: string; + executableId: string; + args: string[]; + params?: Record; + } = { verb: executable.verb, executableId: executable.id, args: argsArray, diff --git a/desktop/src/pages/Executable/ExecutableEnvironmentDetails.tsx b/desktop/src/pages/Executable/ExecutableEnvironmentDetails.tsx index 1e2b1f52..08f85e24 100644 --- a/desktop/src/pages/Executable/ExecutableEnvironmentDetails.tsx +++ b/desktop/src/pages/Executable/ExecutableEnvironmentDetails.tsx @@ -96,7 +96,7 @@ export function ExecutableEnvironmentDetails({ ); - } + }, )} diff --git a/desktop/src/pages/Executable/ExecutableRoute.tsx b/desktop/src/pages/Executable/ExecutableRoute.tsx index 5a162a00..1783f752 100644 --- a/desktop/src/pages/Executable/ExecutableRoute.tsx +++ b/desktop/src/pages/Executable/ExecutableRoute.tsx @@ -1,24 +1,31 @@ import { Text, LoadingOverlay } from "@mantine/core"; -import { useParams } from "react-router"; +import { useParams } from "wouter"; import { useExecutable } from "../../hooks/useExecutable"; import { PageWrapper } from "../../components/PageWrapper.tsx"; import { Welcome } from "../Welcome/Welcome"; -import { Executable } from "./Executable"; +import { Executable } from "./Executable"; export function ExecutableRoute() { - const { executableId } = useParams(); - console.log('ExecutableRoute params:', { executableId }); - const { executable, executableError, isExecutableLoading } = useExecutable(executableId || ""); + const params = useParams(); + const executableId = decodeURIComponent(params.executableId || ""); + const { executable, executableError, isExecutableLoading } = + useExecutable(executableId); - return ( - - {isExecutableLoading && } - {executableError && Error: {executableError.message}} - {executable ? ( - - ) : ( - - )} - - ); -} \ No newline at end of file + return ( + + {isExecutableLoading && ( + + )} + {executableError && Error: {executableError.message}} + {executable ? ( + + ) : ( + + )} + + ); +} diff --git a/desktop/src/pages/Executable/ExecutionForm.tsx b/desktop/src/pages/Executable/ExecutionForm.tsx index 7385db96..9df854be 100644 --- a/desktop/src/pages/Executable/ExecutionForm.tsx +++ b/desktop/src/pages/Executable/ExecutionForm.tsx @@ -44,7 +44,6 @@ export function ExecutionForm({ const args = executable.exec?.args || []; const handleSubmit = () => { - console.log("Form submitted with data:", formData); onSubmit(formData); onClose(); }; @@ -129,11 +128,11 @@ export function ExecutionForm({ { const target = event.target as HTMLInputElement; if (target) { - handleParamChange(param.envKey, target.value); + handleParamChange(param.envKey || "", target.value); } }} required={true} diff --git a/desktop/src/pages/Executable/types/ExecutableRequestDetails.tsx b/desktop/src/pages/Executable/types/ExecutableRequestDetails.tsx index 1baa2863..5b2526be 100644 --- a/desktop/src/pages/Executable/types/ExecutableRequestDetails.tsx +++ b/desktop/src/pages/Executable/types/ExecutableRequestDetails.tsx @@ -77,7 +77,7 @@ export function ExecutableRequestDetails({ {value}
- ) + ), )}
diff --git a/desktop/src/pages/Settings/Settings.tsx b/desktop/src/pages/Settings/Settings.tsx index 250eb929..8cfe7d46 100644 --- a/desktop/src/pages/Settings/Settings.tsx +++ b/desktop/src/pages/Settings/Settings.tsx @@ -1,7 +1,7 @@ -import { - Select, +import { + Select, Stack, - TextInput, + TextInput, Title, LoadingOverlay, Alert, @@ -40,7 +40,7 @@ const logModeOptions = [ export function Settings() { const { settings, updateWorkspaceApp, updateExecutableApp, updateTheme } = - useSettings(); + useSettings(); const { config, isConfigLoading, @@ -54,18 +54,20 @@ export function Settings() { updateDefaultTimeout, } = useConfig(); const { setNotification } = useNotifier(); - const [namespaceInput, setNamespaceInput] = useState(''); + const [namespaceInput, setNamespaceInput] = useState(""); useEffect(() => { if (config) { - setNamespaceInput(config.currentNamespace || ''); + setNamespaceInput(config.currentNamespace || ""); } }, [config]); if (configError) { return (
- Settings + + Settings + }> Error loading configuration: {configError.message} @@ -75,121 +77,133 @@ export function Settings() { async function handleThemeChange(value: string) { updateTheme(value as ThemeName); - return updateConfigTheme(value).then(() => { - refreshConfig(); - setNotification({ - type: NotificationType.Success, - title: 'Theme updated', - message: 'Theme has been successfully updated', - autoClose: true, + return updateConfigTheme(value) + .then(() => { + refreshConfig(); + setNotification({ + type: NotificationType.Success, + title: "Theme updated", + message: "Theme has been successfully updated", + autoClose: true, + }); + }) + .catch((error) => { + setNotification({ + type: NotificationType.Error, + title: "Error updating theme", + message: error.message, + autoClose: true, + }); }); - }).catch((error) => { - setNotification({ - type: NotificationType.Error, - title: 'Error updating theme', - message: error.message, - autoClose: true, - }); - }); } async function handleLogModeChange(value: string) { - return updateLogMode(value).then(() => { - refreshConfig(); - setNotification({ - type: NotificationType.Success, - title: 'Log mode updated', - message: 'Log mode has been successfully updated', - autoClose: true, - }); - }).catch((error) => { - setNotification({ - type: NotificationType.Error, - title: 'Error updating log mode', - message: error.message, - autoClose: true, + return updateLogMode(value) + .then(() => { + refreshConfig(); + setNotification({ + type: NotificationType.Success, + title: "Log mode updated", + message: "Log mode has been successfully updated", + autoClose: true, + }); + }) + .catch((error) => { + setNotification({ + type: NotificationType.Error, + title: "Error updating log mode", + message: error.message, + autoClose: true, + }); }); - }); } - async function handleDefaultTimeoutChange(value: string){ - return updateDefaultTimeout(value).then(() => { - refreshConfig(); - setNotification({ - type: NotificationType.Success, - title: 'Default timeout updated', - message: 'Default timeout has been successfully updated', - autoClose: true, + async function handleDefaultTimeoutChange(value: string) { + return updateDefaultTimeout(value) + .then(() => { + refreshConfig(); + setNotification({ + type: NotificationType.Success, + title: "Default timeout updated", + message: "Default timeout has been successfully updated", + autoClose: true, + }); + }) + .catch((error) => { + setNotification({ + type: NotificationType.Error, + title: "Error updating default timeout", + message: error.message, + autoClose: true, + }); }); - }).catch((error) => { - setNotification({ - type: NotificationType.Error, - title: 'Error updating default timeout', - message: error.message, - autoClose: true, - }); - }); } - async function handleCurrentWorkspaceChange(value: string){ - return updateCurrentWorkspace(value).then(() => { - refreshConfig(); - setNotification({ - type: NotificationType.Success, - title: 'Current workspace updated', - message: 'Current workspace has been successfully updated', - autoClose: true, - }); - }).catch((error) => { - setNotification({ - type: NotificationType.Error, - title: 'Error updating current workspace', - message: error.message, - autoClose: true, + async function handleCurrentWorkspaceChange(value: string) { + return updateCurrentWorkspace(value) + .then(() => { + refreshConfig(); + setNotification({ + type: NotificationType.Success, + title: "Current workspace updated", + message: "Current workspace has been successfully updated", + autoClose: true, + }); + }) + .catch((error) => { + setNotification({ + type: NotificationType.Error, + title: "Error updating current workspace", + message: error.message, + autoClose: true, + }); }); - }); } - async function handleWorkspaceModeChange(value: string){ - return updateWorkspaceMode(value).then(() => { - refreshConfig(); - setNotification({ - type: NotificationType.Success, - title: 'Workspace mode updated', - message: 'Workspace mode has been successfully updated', - autoClose: true, + async function handleWorkspaceModeChange(value: string) { + return updateWorkspaceMode(value) + .then(() => { + refreshConfig(); + setNotification({ + type: NotificationType.Success, + title: "Workspace mode updated", + message: "Workspace mode has been successfully updated", + autoClose: true, + }); + }) + .catch((error) => { + setNotification({ + type: NotificationType.Error, + title: "Error updating workspace mode", + message: error.message, + autoClose: true, + }); }); - }).catch((error) => { - setNotification({ - type: NotificationType.Error, - title: 'Error updating workspace mode', - message: error.message, - autoClose: true, - }); - }); } - async function handleNamespaceChange(value: string){ - return updateNamespace(value).then(() => { - refreshConfig(); - setNotification({ - type: NotificationType.Success, - title: 'Namespace updated', - message: 'Namespace has been successfully updated', - autoClose: true, - }); - }).catch((error) => { - setNotification({ - type: NotificationType.Error, - title: 'Error updating namespace', - message: error.message, - autoClose: true, + async function handleNamespaceChange(value: string) { + return updateNamespace(value) + .then(() => { + refreshConfig(); + setNotification({ + type: NotificationType.Success, + title: "Namespace updated", + message: "Namespace has been successfully updated", + autoClose: true, + }); + }) + .catch((error) => { + setNotification({ + type: NotificationType.Error, + title: "Error updating namespace", + message: error.message, + autoClose: true, + }); }); - }); } function handleNamespaceSubmit() { - if (namespaceInput !== (config?.currentNamespace || '')) { + if (namespaceInput !== (config?.currentNamespace || "")) { handleNamespaceChange(namespaceInput); } } @@ -238,7 +252,9 @@ export function Settings() { handleDefaultTimeoutChange(e.currentTarget.value)} + onChange={(e) => + handleDefaultTimeoutChange(e.currentTarget.value) + } placeholder="e.g., 30s, 5m, 1h" variant="filled" /> @@ -253,8 +269,13 @@ export function Settings() {